/*
 * Copyright 2006-2008, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Axel Dörfler, axeld@pinc-software.de
 */
#ifndef COMMANDS_H
#define COMMANDS_H


#include "accelerant.h"


struct command {
	uint32	opcode;

	uint32* Data() { return &opcode; }
};

class QueueCommands {
	public:
		QueueCommands(ring_buffer &ring);
		~QueueCommands();

		void Put(struct command &command, size_t size);
		void PutFlush();
		void PutWaitFor(uint32 event);
		void PutOverlayFlip(uint32 code, bool updateCoefficients);

		void MakeSpace(uint32 size);
		void Write(uint32 data);

	private:
		ring_buffer	&fRingBuffer;
};


// commands

struct xy_command : command {
	uint16	dest_bytes_per_row;
	uint8	raster_operation;
	uint8	mode;
	uint16	dest_left;
	uint16	dest_top;
	uint16	dest_right;
	uint16	dest_bottom;
	uint32	dest_base;

	xy_command(uint32 command, uint16 rop)
	{
		opcode = command;
		switch (gInfo->shared_info->bits_per_pixel) {
			case 8:
				mode = COMMAND_MODE_CMAP8;
				break;
			case 15:
				mode = COMMAND_MODE_RGB15;
				break;
			case 16:
				mode = COMMAND_MODE_RGB16;
				break;
			case 32:
				mode = COMMAND_MODE_RGB32;
				opcode |= COMMAND_BLIT_RGBA;
				break;
			default:
				debugger("invalid bits_per_pixel for xy_command");
				mode = 0;
				break;
		}

		dest_bytes_per_row = gInfo->shared_info->bytes_per_row;
		dest_base = gInfo->shared_info->frame_buffer_offset;
		raster_operation = rop;
	}
};

struct xy_source_blit_command : xy_command {
	uint16	source_left;
	uint16	source_top;
	uint16	source_bytes_per_row;
	uint16	reserved;
	uint32	source_base;

	xy_source_blit_command()
		: xy_command(XY_COMMAND_SOURCE_BLIT, 0xcc)
	{
		source_bytes_per_row = dest_bytes_per_row;
		source_base = dest_base;
		reserved = 0;
	}
};

struct xy_color_blit_command : xy_command {
	uint32	color;

	xy_color_blit_command(bool invert)
		: xy_command(XY_COMMAND_COLOR_BLIT, invert ? 0x55 : 0xf0)
	{
	}
};

struct xy_setup_mono_pattern_command : xy_command {
	uint32	background_color;
	uint32	foreground_color;
	uint64	pattern;

	xy_setup_mono_pattern_command()
		: xy_command(XY_COMMAND_SETUP_MONO_PATTERN, 0xf0)
	{
		mode |= COMMAND_MODE_SOLID_PATTERN;

		// this defines the clipping window (but clipping is disabled)
		dest_left = 0;
		dest_top = 0;
		dest_right = 0;
		dest_bottom = 0;
	}
};

struct xy_scanline_blit_command : command {
	uint16	dest_left;
	uint16	dest_top;
	uint16	dest_right;
	uint16	dest_bottom;

	xy_scanline_blit_command()
	{
		opcode = XY_COMMAND_SCANLINE_BLIT;
	}
};

#endif	// COMMANDS_H
