Files
pspsdk/src/gu/sceGuClear.c
2010-10-18 12:54:49 -03:00

75 lines
1.9 KiB
C

/*
* PSP Software Development Kit - http://www.pspdev.org
* -----------------------------------------------------------------------
* Licensed under the BSD license, see LICENSE in PSPSDK root for details.
*
* Copyright (c) 2005 Jesper Svennevid
*/
#include "guInternal.h"
void sceGuClear(int flags)
{
GuContext* context = &gu_contexts[gu_curr_context];
unsigned int filter;
struct Vertex
{
u32 color;
u16 x,y,z;
u16 pad;
};
switch (gu_draw_buffer.pixel_size)
{
case 0: filter = context->clear_color & 0xffffff; break;
case 1: filter = (context->clear_color & 0xffffff) | (context->clear_stencil << 31); break;
case 2: filter = (context->clear_color & 0xffffff) | (context->clear_stencil << 28); break;
case 3: filter = (context->clear_color & 0xffffff) | (context->clear_stencil << 24); break;
default: filter = 0; break;
}
struct Vertex* vertices;
int count;
if (!(flags & GU_FAST_CLEAR_BIT))
{
vertices = (struct Vertex*)sceGuGetMemory(2 * sizeof(struct Vertex));
count = 2;
vertices[0].color = 0;
vertices[0].x = 0;
vertices[0].y = 0;
vertices[0].z = context->clear_depth;
vertices[1].color = filter;
vertices[1].x = gu_draw_buffer.width;
vertices[1].y = gu_draw_buffer.height;
vertices[1].z = context->clear_depth;
}
else
{
struct Vertex* curr;
unsigned int i;
count = ((gu_draw_buffer.width+63)/64)*2;
vertices = (struct Vertex*)sceGuGetMemory(count * sizeof(struct Vertex));
curr = vertices;
for (i = 0; i < count; ++i, ++curr)
{
unsigned int j,k;
j = i >> 1;
k = (i & 1);
curr->color = filter;
curr->x = (j+k) * 64;
curr->y = k * gu_draw_buffer.height;
curr->z = context->clear_depth;
}
}
sendCommandi(211,((flags & (GU_COLOR_BUFFER_BIT|GU_STENCIL_BUFFER_BIT|GU_DEPTH_BUFFER_BIT)) << 8) | 0x01);
sceGuDrawArray(GU_SPRITES,GU_COLOR_8888|GU_VERTEX_16BIT|GU_TRANSFORM_2D,count,0,vertices);
sendCommandi(211,0);
}