|
|
|
@@ -45,54 +45,42 @@ |
|
|
|
#include "cell_state.h" |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Convert packed pixel from one format to another. |
|
|
|
*/ |
|
|
|
static unsigned |
|
|
|
convert_color(enum pipe_format srcFormat, unsigned srcColor, |
|
|
|
enum pipe_format dstFormat) |
|
|
|
{ |
|
|
|
ubyte r, g, b, a; |
|
|
|
unsigned dstColor; |
|
|
|
|
|
|
|
util_unpack_color_ub(srcFormat, &srcColor, &r, &g, &b, &a); |
|
|
|
util_pack_color_ub(r, g, b, a, dstFormat, &dstColor); |
|
|
|
|
|
|
|
return dstColor; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Called via pipe->clear() |
|
|
|
*/ |
|
|
|
void |
|
|
|
cell_clear_surface(struct pipe_context *pipe, struct pipe_surface *ps, |
|
|
|
unsigned clearValue) |
|
|
|
cell_clear(struct pipe_context *pipe, unsigned buffers, const float *rgba, |
|
|
|
double depth, unsigned stencil) |
|
|
|
{ |
|
|
|
struct cell_context *cell = cell_context(pipe); |
|
|
|
uint surfIndex; |
|
|
|
|
|
|
|
if (cell->dirty) |
|
|
|
cell_update_derived(cell); |
|
|
|
|
|
|
|
if (ps == cell->framebuffer.zsbuf) { |
|
|
|
/* clear z/stencil buffer */ |
|
|
|
surfIndex = 1; |
|
|
|
} |
|
|
|
else { |
|
|
|
/* clear color buffer */ |
|
|
|
surfIndex = 0; |
|
|
|
if (buffers & PIPE_CLEAR_COLOR) { |
|
|
|
uint surfIndex = 0; |
|
|
|
uint clearValue; |
|
|
|
|
|
|
|
if (ps->format != PIPE_FORMAT_A8R8G8B8_UNORM) { |
|
|
|
clearValue = convert_color(PIPE_FORMAT_A8R8G8B8_UNORM, clearValue, |
|
|
|
ps->format); |
|
|
|
} |
|
|
|
util_pack_color(rgba, cell->framebuffer.cbufs[0]->format, &clearValue); |
|
|
|
|
|
|
|
/* Build a CLEAR command and place it in the current batch buffer */ |
|
|
|
STATIC_ASSERT(sizeof(struct cell_command_clear_surface) % 16 == 0); |
|
|
|
struct cell_command_clear_surface *clr |
|
|
|
= (struct cell_command_clear_surface *) |
|
|
|
cell_batch_alloc16(cell, sizeof(*clr)); |
|
|
|
clr->opcode[0] = CELL_CMD_CLEAR_SURFACE; |
|
|
|
clr->surface = surfIndex; |
|
|
|
clr->value = clearValue; |
|
|
|
} |
|
|
|
|
|
|
|
if (buffers & PIPE_CLEAR_DEPTHSTENCIL) { |
|
|
|
uint surfIndex = 1; |
|
|
|
uint clearValue; |
|
|
|
|
|
|
|
clearValue = util_pack_z_stencil(cell->framebuffer.zsbuf->format, |
|
|
|
depth, stencil); |
|
|
|
|
|
|
|
/* Build a CLEAR command and place it in the current batch buffer */ |
|
|
|
{ |
|
|
|
/* Build a CLEAR command and place it in the current batch buffer */ |
|
|
|
STATIC_ASSERT(sizeof(struct cell_command_clear_surface) % 16 == 0); |
|
|
|
struct cell_command_clear_surface *clr |
|
|
|
= (struct cell_command_clear_surface *) |