mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-08 06:47:23 -04:00
PS2: Preparation for refactoring palette logic
This commit is contained in:
parent
dbaa2e5e5d
commit
2751661a4e
@ -17,30 +17,33 @@
|
||||
|
||||
#define MAX_PALETTE_ENTRIES 2048
|
||||
|
||||
typedef struct Matrix VU0_MATRIX __attribute__((aligned(16)));
|
||||
typedef struct Vec4 VU0_VECTOR __attribute__((aligned(16)));
|
||||
typedef struct { int x, y, z, w; } VU0_IVECTOR __attribute__((aligned(16)));
|
||||
#define QWORD_ALIGNED __attribute__((aligned(16)))
|
||||
|
||||
typedef struct Matrix VU0_matrix QWORD_ALIGNED;
|
||||
typedef struct Vec4 VU0_vector QWORD_ALIGNED;
|
||||
typedef struct { int x, y, z, w; } VU0_IVector QWORD_ALIGNED;
|
||||
|
||||
static void* gfx_vertices;
|
||||
extern framebuffer_t fb_colors[2];
|
||||
extern zbuffer_t fb_depth;
|
||||
static VU0_VECTOR vp_origin, vp_scale;
|
||||
static VU0_vector vp_origin, vp_scale;
|
||||
static cc_bool stateDirty, formatDirty;
|
||||
static framebuffer_t* fb_draw;
|
||||
static framebuffer_t* fb_display;
|
||||
|
||||
static VU0_MATRIX mvp;
|
||||
extern void LoadMvpMatrix(VU0_MATRIX* matrix);
|
||||
extern void LoadClipScaleFactors(VU0_VECTOR* scale);
|
||||
extern void LoadViewportOrigin(VU0_VECTOR* origin);
|
||||
extern void LoadViewportScale(VU0_VECTOR* scale);
|
||||
static VU0_matrix mvp;
|
||||
extern void LoadMvpMatrix(VU0_matrix* matrix);
|
||||
extern void LoadClipScaleFactors(VU0_vector* scale);
|
||||
extern void LoadViewportOrigin(VU0_vector* origin);
|
||||
extern void LoadViewportScale(VU0_vector* scale);
|
||||
|
||||
// double buffering
|
||||
static packet_t* packets[2];
|
||||
static packet_t* current;
|
||||
static int context;
|
||||
|
||||
static qword_t* dma_beg;
|
||||
static qword_t* q;
|
||||
static qword_t* Q;
|
||||
|
||||
static GfxResourceID white_square;
|
||||
static int primitive_type;
|
||||
@ -75,32 +78,32 @@ static void UpdateContext(void) {
|
||||
|
||||
dma_beg = current->data;
|
||||
// increment past the dmatag itself
|
||||
q = dma_beg + 1;
|
||||
Q = dma_beg + 1;
|
||||
}
|
||||
|
||||
|
||||
static void SetTextureWrapping(int context) {
|
||||
PACK_GIFTAG(q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
q++;
|
||||
PACK_GIFTAG(Q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
Q++;
|
||||
|
||||
PACK_GIFTAG(q, GS_SET_CLAMP(WRAP_REPEAT, WRAP_REPEAT, 0, 0, 0, 0),
|
||||
PACK_GIFTAG(Q, GS_SET_CLAMP(WRAP_REPEAT, WRAP_REPEAT, 0, 0, 0, 0),
|
||||
GS_REG_CLAMP + context);
|
||||
q++;
|
||||
Q++;
|
||||
}
|
||||
|
||||
static void SetTextureSampling(int context) {
|
||||
PACK_GIFTAG(q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
q++;
|
||||
PACK_GIFTAG(Q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
Q++;
|
||||
|
||||
// TODO: should mipmapselect (first 0 after MIN_NEAREST) be 1?
|
||||
PACK_GIFTAG(q, GS_SET_TEX1(LOD_USE_K, 0, LOD_MAG_NEAREST, LOD_MIN_NEAREST, 0, 0, 0),
|
||||
PACK_GIFTAG(Q, GS_SET_TEX1(LOD_USE_K, 0, LOD_MAG_NEAREST, LOD_MIN_NEAREST, 0, 0, 0),
|
||||
GS_REG_TEX1 + context);
|
||||
q++;
|
||||
Q++;
|
||||
}
|
||||
|
||||
static void SetAlphaBlending(int context) {
|
||||
PACK_GIFTAG(q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
q++;
|
||||
PACK_GIFTAG(Q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
Q++;
|
||||
|
||||
// https://psi-rockin.github.io/ps2tek/#gsalphablending
|
||||
// Output = (((A - B) * C) >> 7) + D
|
||||
@ -108,25 +111,25 @@ static void SetAlphaBlending(int context) {
|
||||
// = (src * alpha - dst * alpha) / 128 + dst
|
||||
// = (src * alpha - dst * alpha) / 128 + dst * 128 / 128
|
||||
// = ((src * alpha + dst * (128 - alpha)) / 128
|
||||
PACK_GIFTAG(q, GS_SET_ALPHA(BLEND_COLOR_SOURCE, BLEND_COLOR_DEST, BLEND_ALPHA_SOURCE,
|
||||
PACK_GIFTAG(Q, GS_SET_ALPHA(BLEND_COLOR_SOURCE, BLEND_COLOR_DEST, BLEND_ALPHA_SOURCE,
|
||||
BLEND_COLOR_DEST, 0x80), GS_REG_ALPHA + context);
|
||||
q++;
|
||||
Q++;
|
||||
}
|
||||
|
||||
static void InitDrawingEnv(void) {
|
||||
qword_t* beg = q;
|
||||
q = draw_setup_environment(q, 0, fb_draw, &fb_depth);
|
||||
qword_t* beg = Q;
|
||||
Q = draw_setup_environment(Q, 0, fb_draw, &fb_depth);
|
||||
// GS can render from 0 to 4096, so set primitive origin to centre of that
|
||||
q = draw_primitive_xyoffset(q, 0, 2048 - Game.Width / 2, 2048 - Game.Height / 2);
|
||||
Q = draw_primitive_xyoffset(Q, 0, 2048 - Game.Width / 2, 2048 - Game.Height / 2);
|
||||
|
||||
SetTextureWrapping(0);
|
||||
SetTextureSampling(0);
|
||||
SetAlphaBlending(0); // TODO has no effect ?
|
||||
q = draw_finish(q);
|
||||
Q = draw_finish(Q);
|
||||
|
||||
dma_channel_send_normal(DMA_CHANNEL_GIF, beg, q - beg, 0, 0);
|
||||
dma_channel_send_normal(DMA_CHANNEL_GIF, beg, Q - beg, 0, 0);
|
||||
dma_wait_fast();
|
||||
q = dma_beg + 1;
|
||||
Q = dma_beg + 1;
|
||||
}
|
||||
|
||||
static unsigned clut_offset, tex_offset;
|
||||
@ -160,21 +163,90 @@ void Gfx_Free(void) {
|
||||
}
|
||||
|
||||
static CC_INLINE void DMAFlushBuffer(void) {
|
||||
if (q == dma_beg) return;
|
||||
if (Q == dma_beg) return;
|
||||
|
||||
DMATAG_END(dma_beg, (q - dma_beg) - 1, 0, 0, 0);
|
||||
dma_channel_send_chain(DMA_CHANNEL_GIF, dma_beg, q - dma_beg, 0, 0);
|
||||
DMATAG_END(dma_beg, (Q - dma_beg) - 1, 0, 0, 0);
|
||||
dma_channel_send_chain(DMA_CHANNEL_GIF, dma_beg, Q - dma_beg, 0, 0);
|
||||
}
|
||||
|
||||
void Gfx_TransferPixels(void* src, int src_width, int src_height,
|
||||
int format, unsigned dst_addr, unsigned dst_stride) {
|
||||
packet_t *packet = packet_init(200, PACKET_NORMAL);
|
||||
qword_t *Q = packet->data;
|
||||
static int CalculateQWords(int width, int height, int psm) {
|
||||
switch (psm)
|
||||
{
|
||||
case GS_PSM_32:
|
||||
case GS_PSM_24:
|
||||
case GS_PSMZ_32:
|
||||
case GS_PSMZ_24:
|
||||
return (width * height) >> 2;
|
||||
|
||||
Q = draw_texture_transfer(Q, src, src_width, src_height, format, dst_addr, dst_stride);
|
||||
Q = draw_texture_flush(Q);
|
||||
case GS_PSM_16:
|
||||
case GS_PSM_16S:
|
||||
case GS_PSMZ_16:
|
||||
case GS_PSMZ_16S:
|
||||
return (width * height) >> 3;
|
||||
|
||||
dma_channel_send_chain(DMA_CHANNEL_GIF, packet->data, Q - packet->data, 0,0);
|
||||
case GS_PSM_8:
|
||||
case GS_PSM_8H:
|
||||
return (width * height) >> 4;
|
||||
|
||||
case GS_PSM_4:
|
||||
case GS_PSM_4HL:
|
||||
case GS_PSM_4HH:
|
||||
return (width * height) >> 5;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static qword_t* BuildTransfer(qword_t* q, u8* src, int width, int height, int psm,
|
||||
int dst_base, int dst_width)
|
||||
{
|
||||
int qwords = CalculateQWords(width, height, psm);
|
||||
|
||||
// Parameters for RAM -> GS transfer
|
||||
DMATAG_CNT(q,5,0,0,0);
|
||||
q++;
|
||||
PACK_GIFTAG(q, GIF_SET_TAG(4,0,0,0,GIF_FLG_PACKED,1), GIF_REG_AD);
|
||||
q++;
|
||||
PACK_GIFTAG(q, GS_SET_BITBLTBUF(0,0,0, dst_base >> 6, dst_width >> 6, psm), GS_REG_BITBLTBUF);
|
||||
q++;
|
||||
PACK_GIFTAG(q, GS_SET_TRXPOS(0,0,0,0,0), GS_REG_TRXPOS);
|
||||
q++;
|
||||
PACK_GIFTAG(q, GS_SET_TRXREG(width, height), GS_REG_TRXREG);
|
||||
q++;
|
||||
PACK_GIFTAG(q, GS_SET_TRXDIR(0), GS_REG_TRXDIR);
|
||||
q++;
|
||||
|
||||
while (qwords)
|
||||
{
|
||||
int num_qwords = min(qwords, GIF_BLOCK_SIZE);
|
||||
|
||||
DMATAG_CNT(q,1,0,0,0);
|
||||
q++;
|
||||
PACK_GIFTAG(q, GIF_SET_TAG(num_qwords,0,0,0,GIF_FLG_IMAGE,0), 0);
|
||||
q++;
|
||||
DMATAG_REF(q, num_qwords, (unsigned int)src, 0,0,0);
|
||||
q++;
|
||||
|
||||
src += num_qwords * 16;
|
||||
qwords -= num_qwords;
|
||||
}
|
||||
|
||||
DMATAG_END(q,2,0,0,0);
|
||||
q++;
|
||||
PACK_GIFTAG(q,GIF_SET_TAG(1,1,0,0,GIF_FLG_PACKED,1),GIF_REG_AD);
|
||||
q++;
|
||||
PACK_GIFTAG(q,1,GS_REG_TEXFLUSH);
|
||||
q++;
|
||||
|
||||
return q;
|
||||
}
|
||||
|
||||
void Gfx_TransferPixels(void* src, int width, int height,
|
||||
int format, unsigned dst_base, unsigned dst_stride) {
|
||||
packet_t* packet = packet_init(200, PACKET_NORMAL);
|
||||
qword_t* q = packet->data;
|
||||
|
||||
q = BuildTransfer(q, src, width, height, format, dst_base, dst_stride);
|
||||
dma_channel_send_chain(DMA_CHANNEL_GIF, packet->data, q - packet->data, 0,0);
|
||||
dma_wait_fast();
|
||||
|
||||
packet_free(packet);
|
||||
@ -280,7 +352,7 @@ GfxResourceID Gfx_AllocTexture(struct Bitmap* bmp, int rowWidth, cc_uint8 flags,
|
||||
tex->log2_height = draw_log2(bmp->height);
|
||||
tex->pal_index = 0;
|
||||
|
||||
BitmapCol palette[MAX_PAL_ENTRIES] __attribute__((aligned(16)));
|
||||
BitmapCol palette[MAX_PAL_ENTRIES] QWORD_ALIGNED;
|
||||
int pal_count = 0;
|
||||
int pal_index = FindFreePalette(flags);
|
||||
|
||||
@ -303,8 +375,8 @@ GfxResourceID Gfx_AllocTexture(struct Bitmap* bmp, int rowWidth, cc_uint8 flags,
|
||||
}
|
||||
|
||||
static void UpdateTextureBuffer(int context, CCTexture* tex, unsigned buf_addr, unsigned buf_stride) {
|
||||
PACK_GIFTAG(q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
q++;
|
||||
PACK_GIFTAG(Q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
Q++;
|
||||
|
||||
unsigned clut_addr = tex->format == GS_PSM_32 ? 0 : PaletteAddr(tex->pal_index) >> 6;
|
||||
unsigned clut_entry = 0;
|
||||
@ -312,10 +384,10 @@ static void UpdateTextureBuffer(int context, CCTexture* tex, unsigned buf_addr,
|
||||
//unsigned clut_entry = tex->format == GS_PSM_32 ? 0 : tex->pal_index;
|
||||
unsigned clut_mode = tex->format == GS_PSM_32 ? CLUT_NO_LOAD : CLUT_LOAD;
|
||||
|
||||
PACK_GIFTAG(q, GS_SET_TEX0(buf_addr >> 6, buf_stride >> 6, tex->format,
|
||||
PACK_GIFTAG(Q, GS_SET_TEX0(buf_addr >> 6, buf_stride >> 6, tex->format,
|
||||
tex->log2_width, tex->log2_height, TEXTURE_COMPONENTS_RGBA, TEXTURE_FUNCTION_MODULATE,
|
||||
clut_addr, GS_PSM_32, CLUT_STORAGE_MODE1, clut_entry, clut_mode), GS_REG_TEX0 + context);
|
||||
q++;
|
||||
Q++;
|
||||
}
|
||||
|
||||
void Gfx_BindTexture(GfxResourceID texId) {
|
||||
@ -335,7 +407,7 @@ void Gfx_BindTexture(GfxResourceID texId) {
|
||||
tex->format, dst_addr, dst_stride);
|
||||
|
||||
// TODO terrible perf
|
||||
q = dma_beg + 1;
|
||||
Q = dma_beg + 1;
|
||||
UpdateTextureBuffer(0, tex, dst_addr, dst_stride);
|
||||
}
|
||||
|
||||
@ -380,13 +452,13 @@ static void UpdateState(int context) {
|
||||
int aMethod = gfx_alphaTest ? ATEST_METHOD_GREATER_EQUAL : ATEST_METHOD_ALLPASS;
|
||||
int zMethod = gfx_depthTest ? ZTEST_METHOD_GREATER_EQUAL : ZTEST_METHOD_ALLPASS;
|
||||
|
||||
PACK_GIFTAG(q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
q++;
|
||||
PACK_GIFTAG(Q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
Q++;
|
||||
// NOTE: Reference value is 0x40 instead of 0x80, since alpha values are halved compared to normal
|
||||
PACK_GIFTAG(q, GS_SET_TEST(DRAW_ENABLE, aMethod, 0x40, ATEST_KEEP_ALL,
|
||||
PACK_GIFTAG(Q, GS_SET_TEST(DRAW_ENABLE, aMethod, 0x40, ATEST_KEEP_ALL,
|
||||
DRAW_DISABLE, DRAW_DISABLE,
|
||||
DRAW_ENABLE, zMethod), GS_REG_TEST + context);
|
||||
q++;
|
||||
Q++;
|
||||
|
||||
stateDirty = false;
|
||||
}
|
||||
@ -394,12 +466,12 @@ static void UpdateState(int context) {
|
||||
static void UpdateFormat(int context) {
|
||||
cc_bool texturing = gfx_format == VERTEX_FORMAT_TEXTURED;
|
||||
|
||||
PACK_GIFTAG(q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
q++;
|
||||
PACK_GIFTAG(q, GS_SET_PRIM(PRIM_TRIANGLE, PRIM_SHADE_GOURAUD, texturing, DRAW_DISABLE,
|
||||
PACK_GIFTAG(Q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
Q++;
|
||||
PACK_GIFTAG(Q, GS_SET_PRIM(PRIM_TRIANGLE, PRIM_SHADE_GOURAUD, texturing, DRAW_DISABLE,
|
||||
gfx_alphaBlend, DRAW_DISABLE, PRIM_MAP_ST,
|
||||
context, PRIM_UNFIXED), GS_REG_PRIM);
|
||||
q++;
|
||||
Q++;
|
||||
|
||||
formatDirty = false;
|
||||
}
|
||||
@ -420,8 +492,8 @@ void Gfx_SetAlphaArgBlend(cc_bool enabled) { }
|
||||
|
||||
void Gfx_ClearBuffers(GfxBuffers buffers) {
|
||||
// TODO clear only some buffers
|
||||
q = draw_disable_tests(q, 0, &fb_depth);
|
||||
q = draw_clear(q, 0, 2048.0f - fb_colors[0].width / 2.0f, 2048.0f - fb_colors[0].height / 2.0f,
|
||||
Q = draw_disable_tests(Q, 0, &fb_depth);
|
||||
Q = draw_clear(Q, 0, 2048.0f - fb_colors[0].width / 2.0f, 2048.0f - fb_colors[0].height / 2.0f,
|
||||
fb_colors[0].width, fb_colors[0].height, clearR, clearG, clearB);
|
||||
|
||||
UpdateState(0);
|
||||
@ -441,7 +513,7 @@ void Gfx_SetDepthTest(cc_bool enabled) {
|
||||
|
||||
void Gfx_SetDepthWrite(cc_bool enabled) {
|
||||
fb_depth.mask = !enabled;
|
||||
q = draw_zbuffer(q, 0, &fb_depth);
|
||||
Q = draw_zbuffer(Q, 0, &fb_depth);
|
||||
fb_depth.mask = 0;
|
||||
}
|
||||
|
||||
@ -453,7 +525,7 @@ static void SetColorWrite(cc_bool r, cc_bool g, cc_bool b, cc_bool a) {
|
||||
if (!a) mask |= 0xFF000000;
|
||||
|
||||
fb_draw->mask = mask;
|
||||
q = draw_framebuffer(q, 0, fb_draw);
|
||||
Q = draw_framebuffer(Q, 0, fb_draw);
|
||||
fb_draw->mask = 0;
|
||||
}
|
||||
|
||||
@ -655,10 +727,10 @@ void Gfx_SetVertexFormat(VertexFormat fmt) {
|
||||
formatDirty = true;
|
||||
}
|
||||
|
||||
extern void ViewportTransform(VU0_VECTOR* src, VU0_IVECTOR* dst);
|
||||
static xyz_t FinishVertex(VU0_VECTOR* src, float invW) {
|
||||
extern void ViewportTransform(VU0_vector* src, VU0_IVector* dst);
|
||||
static xyz_t FinishVertex(VU0_vector* src, float invW) {
|
||||
src->w = invW;
|
||||
VU0_IVECTOR tmp;
|
||||
VU0_IVector tmp;
|
||||
ViewportTransform(src, &tmp);
|
||||
|
||||
xyz_t xyz;
|
||||
@ -668,50 +740,50 @@ static xyz_t FinishVertex(VU0_VECTOR* src, float invW) {
|
||||
return xyz;
|
||||
}
|
||||
|
||||
static u64* DrawTexturedTriangle(u64* dw, VU0_VECTOR* coords,
|
||||
static u64* DrawTexturedTriangle(u64* dw, VU0_vector* coords,
|
||||
struct VertexTextured* V0, struct VertexTextured* V1, struct VertexTextured* V2) {
|
||||
TexturedVertex* dst = (TexturedVertex*)dw;
|
||||
float Q;
|
||||
float q;
|
||||
|
||||
// TODO optimise
|
||||
// Add the "primitives" to the GIF packet
|
||||
Q = 1.0f / coords[0].w;
|
||||
q = 1.0f / coords[0].w;
|
||||
dst[0].rgba = V0->Col;
|
||||
dst[0].q = Q;
|
||||
dst[0].u = V0->U * Q;
|
||||
dst[0].v = V0->V * Q;
|
||||
dst[0].xyz = FinishVertex(&coords[0], Q);
|
||||
dst[0].q = q;
|
||||
dst[0].u = V0->U * q;
|
||||
dst[0].v = V0->V * q;
|
||||
dst[0].xyz = FinishVertex(&coords[0], q);
|
||||
|
||||
Q = 1.0f / coords[1].w;
|
||||
q = 1.0f / coords[1].w;
|
||||
dst[1].rgba = V1->Col;
|
||||
dst[1].q = Q;
|
||||
dst[1].u = V1->U * Q;
|
||||
dst[1].v = V1->V * Q;
|
||||
dst[1].xyz = FinishVertex(&coords[1], Q);
|
||||
dst[1].q = q;
|
||||
dst[1].u = V1->U * q;
|
||||
dst[1].v = V1->V * q;
|
||||
dst[1].xyz = FinishVertex(&coords[1], q);
|
||||
|
||||
Q = 1.0f / coords[2].w;
|
||||
q = 1.0f / coords[2].w;
|
||||
dst[2].rgba = V2->Col;
|
||||
dst[2].q = Q;
|
||||
dst[2].u = V2->U * Q;
|
||||
dst[2].v = V2->V * Q;
|
||||
dst[2].xyz = FinishVertex(&coords[2], Q);
|
||||
dst[2].q = q;
|
||||
dst[2].u = V2->U * q;
|
||||
dst[2].v = V2->V * q;
|
||||
dst[2].xyz = FinishVertex(&coords[2], q);
|
||||
|
||||
return dw + 9;
|
||||
}
|
||||
|
||||
extern void TransformTexturedQuad(void* src, VU0_VECTOR* dst, VU0_VECTOR* tmp, int* clip_flags);
|
||||
extern void TransformColouredQuad(void* src, VU0_VECTOR* dst, VU0_VECTOR* tmp, int* clip_flags);
|
||||
extern u64* DrawTexturedQuad(void* src, u64* dst, VU0_VECTOR* tmp);
|
||||
extern u64* DrawColouredQuad(void* src, u64* dst, VU0_VECTOR* tmp);
|
||||
extern void TransformTexturedQuad(void* src, VU0_vector* dst, VU0_vector* tmp, int* clip_flags);
|
||||
extern void TransformColouredQuad(void* src, VU0_vector* dst, VU0_vector* tmp, int* clip_flags);
|
||||
extern u64* DrawTexturedQuad(void* src, u64* dst, VU0_vector* tmp);
|
||||
extern u64* DrawColouredQuad(void* src, u64* dst, VU0_vector* tmp);
|
||||
|
||||
static void DrawTexturedTriangles(int verticesCount, int startVertex) {
|
||||
struct VertexTextured* v = (struct VertexTextured*)gfx_vertices + startVertex;
|
||||
qword_t* base = q;
|
||||
q++; // skip over GIF tag (will be filled in later)
|
||||
qword_t* base = Q;
|
||||
Q++; // skip over GIF tag (will be filled in later)
|
||||
|
||||
u64* dw = (u64*)q;
|
||||
u64* dw = (u64*)Q;
|
||||
u64* beg = dw;
|
||||
VU0_VECTOR tmp[6];
|
||||
VU0_vector tmp[6];
|
||||
|
||||
for (int i = 0; i < verticesCount / 4; i++, v += 4)
|
||||
{
|
||||
@ -720,10 +792,10 @@ static void DrawTexturedTriangles(int verticesCount, int startVertex) {
|
||||
|
||||
unsigned numVerts = (unsigned)(dw - beg) / 3;
|
||||
if (numVerts == 0) {
|
||||
q--; // No GIF tag was added
|
||||
Q--; // No GIF tag was added
|
||||
} else {
|
||||
if (numVerts & 1) dw++; // one more to even out number of doublewords
|
||||
q = (qword_t*)dw;
|
||||
Q = (qword_t*)dw;
|
||||
|
||||
// Fill GIF tag in now that know number of GIF "primitives" (aka vertices)
|
||||
// 2 registers per GIF "primitive" (colour, position)
|
||||
@ -733,12 +805,12 @@ static void DrawTexturedTriangles(int verticesCount, int startVertex) {
|
||||
|
||||
static void DrawColouredTriangles(int verticesCount, int startVertex) {
|
||||
struct VertexColoured* v = (struct VertexColoured*)gfx_vertices + startVertex;
|
||||
qword_t* base = q;
|
||||
q++; // skip over GIF tag (will be filled in later)
|
||||
qword_t* base = Q;
|
||||
Q++; // skip over GIF tag (will be filled in later)
|
||||
|
||||
u64* dw = (u64*)q;
|
||||
u64* dw = (u64*)Q;
|
||||
u64* beg = dw;
|
||||
VU0_VECTOR tmp[6];
|
||||
VU0_vector tmp[6];
|
||||
|
||||
for (int i = 0; i < verticesCount / 4; i++, v += 4)
|
||||
{
|
||||
@ -747,9 +819,9 @@ static void DrawColouredTriangles(int verticesCount, int startVertex) {
|
||||
|
||||
unsigned numVerts = (unsigned)(dw - beg) / 2;
|
||||
if (numVerts == 0) {
|
||||
q--; // No GIF tag was added
|
||||
Q--; // No GIF tag was added
|
||||
} else {
|
||||
q = (qword_t*)dw;
|
||||
Q = (qword_t*)dw;
|
||||
|
||||
// Fill GIF tag in now that know number of GIF "primitives" (aka vertices)
|
||||
// 2 registers per GIF "primitive" (colour, texture, position)
|
||||
@ -761,10 +833,10 @@ static void DrawTriangles(int verticesCount, int startVertex) {
|
||||
if (stateDirty) UpdateState(0);
|
||||
if (formatDirty) UpdateFormat(0);
|
||||
|
||||
if ((q - current->data) > 45000) {
|
||||
if ((Q - current->data) > 45000) {
|
||||
DMAFlushBuffer();
|
||||
dma_wait_fast();
|
||||
q = dma_beg + 1;
|
||||
Q = dma_beg + 1;
|
||||
Platform_LogConst("Too much geometry!!");
|
||||
}
|
||||
|
||||
@ -786,12 +858,12 @@ static void SetPrimitiveType(int type) {
|
||||
if (primitive_type == type) return;
|
||||
primitive_type = type;
|
||||
|
||||
PACK_GIFTAG(q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
q++;
|
||||
PACK_GIFTAG(q, GS_SET_PRIM(type, PRIM_SHADE_GOURAUD, DRAW_DISABLE, DRAW_DISABLE,
|
||||
PACK_GIFTAG(Q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
Q++;
|
||||
PACK_GIFTAG(Q, GS_SET_PRIM(type, PRIM_SHADE_GOURAUD, DRAW_DISABLE, DRAW_DISABLE,
|
||||
DRAW_DISABLE, DRAW_DISABLE, PRIM_MAP_ST,
|
||||
0, PRIM_UNFIXED), GS_REG_PRIM);
|
||||
q++;
|
||||
Q++;
|
||||
}
|
||||
|
||||
void Gfx_DrawVb_Lines(int verticesCount) {
|
||||
@ -833,7 +905,7 @@ void Gfx_BeginFrame(void) {
|
||||
void Gfx_EndFrame(void) {
|
||||
//Platform_LogConst("--- EF1 ---");
|
||||
|
||||
q = draw_finish(q);
|
||||
Q = draw_finish(Q);
|
||||
|
||||
dma_wait_fast();
|
||||
DMAFlushBuffer();
|
||||
@ -847,7 +919,7 @@ void Gfx_EndFrame(void) {
|
||||
UpdateContext();
|
||||
|
||||
// Double buffering
|
||||
q = draw_framebuffer(q, 0, fb_draw);
|
||||
Q = draw_framebuffer(Q, 0, fb_draw);
|
||||
graph_set_framebuffer_filtered(fb_display->address,
|
||||
fb_display->width,
|
||||
fb_display->psm, 0, 0);
|
||||
@ -864,7 +936,7 @@ void Gfx_OnWindowResize(void) {
|
||||
}
|
||||
|
||||
void Gfx_SetViewport(int x, int y, int w, int h) {
|
||||
VU0_VECTOR clip_scale;
|
||||
VU0_vector clip_scale;
|
||||
unsigned int maxZ = 1 << (24 - 1); // TODO: half this? or << 24 instead?
|
||||
|
||||
vp_origin.x = ftoi4(2048 - (x / 2));
|
||||
@ -907,10 +979,10 @@ void Gfx_SetViewport(int x, int y, int w, int h) {
|
||||
void Gfx_SetScissor(int x, int y, int w, int h) {
|
||||
int context = 0;
|
||||
|
||||
PACK_GIFTAG(q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
q++;
|
||||
PACK_GIFTAG(q, GS_SET_SCISSOR(x, x+w-1, y,y+h-1), GS_REG_SCISSOR + context);
|
||||
q++;
|
||||
PACK_GIFTAG(Q, GIF_SET_TAG(1,0,0,0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
Q++;
|
||||
PACK_GIFTAG(Q, GS_SET_SCISSOR(x, x+w-1, y,y+h-1), GS_REG_SCISSOR + context);
|
||||
Q++;
|
||||
}
|
||||
|
||||
void Gfx_GetApiInfo(cc_string* info) {
|
||||
|
@ -666,7 +666,9 @@ static void IconsPngProcess(struct Stream* stream, const cc_string* name) {
|
||||
static struct TextureEntry icons_entry = { "icons.png", IconsPngProcess };
|
||||
|
||||
static void TouchPngProcess(struct Stream* stream, const cc_string* name) {
|
||||
Game_UpdateTexture(&Gui.TouchTex, stream, name, NULL, NULL);
|
||||
if (!Gui.TouchUI) return;
|
||||
|
||||
Game_UpdateTexture(&Gui.TouchTex, stream, name, NULL, NULL);
|
||||
}
|
||||
static struct TextureEntry touch_entry = { "touch.png", TouchPngProcess };
|
||||
|
||||
|
@ -328,8 +328,8 @@ void Window_AllocFramebuffer(struct Bitmap* bmp, int width, int height) {
|
||||
packet_free(packet);
|
||||
}
|
||||
|
||||
extern void Gfx_TransferPixels(void* src, int src_width, int src_height,
|
||||
int format, unsigned dst_addr, unsigned dst_stride);
|
||||
extern void Gfx_TransferPixels(void* src, int width, int height,
|
||||
int format, unsigned dst_base, unsigned dst_stride);
|
||||
|
||||
void Window_DrawFramebuffer(Rect2D r, struct Bitmap* bmp) {
|
||||
// FlushCache bios call https://psi-rockin.github.io/ps2tek/
|
||||
|
Loading…
x
Reference in New Issue
Block a user