Add support for geoshader uniforms

This commit is contained in:
fincs 2015-03-05 23:05:14 +01:00
parent 57c98d4291
commit a53124d98c
6 changed files with 45 additions and 41 deletions

View File

@ -125,9 +125,9 @@ int main()
C3D_Init(C3D_DEFAULT_CMDBUF_SIZE); C3D_Init(C3D_DEFAULT_CMDBUF_SIZE);
MtxStack_Init(&projMtx); MtxStack_Init(&projMtx);
MtxStack_Bind(&projMtx, VSH_FVEC_projMtx, VSH_ULEN_projMtx); MtxStack_Bind(&projMtx, GPU_VERTEX_SHADER, VSH_FVEC_projMtx, VSH_ULEN_projMtx);
MtxStack_Init(&mdlvMtx); MtxStack_Init(&mdlvMtx);
MtxStack_Bind(&mdlvMtx, VSH_FVEC_mdlvMtx, VSH_ULEN_mdlvMtx); MtxStack_Bind(&mdlvMtx, GPU_VERTEX_SHADER, VSH_FVEC_mdlvMtx, VSH_ULEN_mdlvMtx);
C3D_TexInit(&myTex, 64, 64, GPU_RGBA8); C3D_TexInit(&myTex, 64, 64, GPU_RGBA8);
C3D_TexUpload(&myTex, grass_bin); C3D_TexUpload(&myTex, grass_bin);

View File

@ -6,7 +6,7 @@ typedef struct
{ {
C3D_Mtx m[C3D_MTXSTACK_SIZE]; C3D_Mtx m[C3D_MTXSTACK_SIZE];
int pos; int pos;
u8 unifPos, unifLen; u8 unifType, unifPos, unifLen;
bool isDirty; bool isDirty;
} C3D_MtxStack; } C3D_MtxStack;
@ -17,7 +17,7 @@ static inline C3D_Mtx* MtxStack_Cur(C3D_MtxStack* stk)
} }
void MtxStack_Init(C3D_MtxStack* stk); void MtxStack_Init(C3D_MtxStack* stk);
void MtxStack_Bind(C3D_MtxStack* stk, int unifPos, int unifLen); void MtxStack_Bind(C3D_MtxStack* stk, GPU_SHADER_TYPE unifType, int unifPos, int unifLen);
void MtxStack_Push(C3D_MtxStack* stk); void MtxStack_Push(C3D_MtxStack* stk);
void MtxStack_Pop(C3D_MtxStack* stk); void MtxStack_Pop(C3D_MtxStack* stk);
void MtxStack_Update(C3D_MtxStack* stk); void MtxStack_Update(C3D_MtxStack* stk);

View File

@ -3,41 +3,41 @@
#define C3D_FVUNIF_COUNT 96 #define C3D_FVUNIF_COUNT 96
#define C3D_IVUNIF_COUNT 4 #define C3D_IVUNIF_COUNT 4
extern C3D_FVec C3D_FVUnif[C3D_FVUNIF_COUNT]; extern C3D_FVec C3D_FVUnif[2][C3D_FVUNIF_COUNT];
extern C3D_IVec C3D_IVUnif[C3D_IVUNIF_COUNT]; extern C3D_IVec C3D_IVUnif[2][C3D_IVUNIF_COUNT];
extern u16 C3D_BoolUnifs; extern u16 C3D_BoolUnifs[2];
extern bool C3D_FVUnifDirty[C3D_FVUNIF_COUNT]; extern bool C3D_FVUnifDirty[2][C3D_FVUNIF_COUNT];
extern bool C3D_IVUnifDirty[C3D_IVUNIF_COUNT]; extern bool C3D_IVUnifDirty[2][C3D_IVUNIF_COUNT];
extern bool C3D_BoolUnifsDirty; extern bool C3D_BoolUnifsDirty[2];
static inline C3D_FVec* C3D_FVUnifWritePtr(int id, int size) static inline C3D_FVec* C3D_FVUnifWritePtr(GPU_SHADER_TYPE type, int id, int size)
{ {
int i; int i;
for (i = 0; i < size; i ++) for (i = 0; i < size; i ++)
C3D_FVUnifDirty[id+i] = true; C3D_FVUnifDirty[type][id+i] = true;
return &C3D_FVUnif[id]; return &C3D_FVUnif[type][id];
} }
static inline C3D_IVec* C3D_IVUnifWritePtr(int id) static inline C3D_IVec* C3D_IVUnifWritePtr(GPU_SHADER_TYPE type, int id)
{ {
C3D_IVUnifDirty[id] = true; C3D_IVUnifDirty[type][id] = true;
return &C3D_IVUnif[id]; return &C3D_IVUnif[type][id];
} }
static inline void C3D_FVUnifSet(int id, float x, float y, float z, float w) static inline void C3D_FVUnifSet(GPU_SHADER_TYPE type, int id, float x, float y, float z, float w)
{ {
C3D_FVec* ptr = C3D_FVUnifWritePtr(id, 1); C3D_FVec* ptr = C3D_FVUnifWritePtr(type, id, 1);
ptr->x = x; ptr->x = x;
ptr->y = y; ptr->y = y;
ptr->z = z; ptr->z = z;
ptr->w = w; ptr->w = w;
} }
static inline void C3D_IVUnifSet(int id, int x, int y, int z, int w) static inline void C3D_IVUnifSet(GPU_SHADER_TYPE type, int id, int x, int y, int z, int w)
{ {
C3D_IVec* ptr = C3D_IVUnifWritePtr(id); C3D_IVec* ptr = C3D_IVUnifWritePtr(type, id);
*ptr = IVec_Pack(x, y, z, w); *ptr = IVec_Pack(x, y, z, w);
} }
void C3D_UpdateUniforms(void); void C3D_UpdateUniforms(GPU_SHADER_TYPE type);

View File

@ -134,7 +134,8 @@ void C3Di_UpdateContext(void)
ctx->flags &= ~C3DiF_TexEnvAll; ctx->flags &= ~C3DiF_TexEnvAll;
} }
C3D_UpdateUniforms(); C3D_UpdateUniforms(GPU_VERTEX_SHADER);
C3D_UpdateUniforms(GPU_GEOMETRY_SHADER);
} }
void C3D_FlushAsync(void) void C3D_FlushAsync(void)

View File

@ -9,8 +9,9 @@ void MtxStack_Init(C3D_MtxStack* stk)
Mtx_Identity(&stk->m[0]); Mtx_Identity(&stk->m[0]);
} }
void MtxStack_Bind(C3D_MtxStack* stk, int unifPos, int unifLen) void MtxStack_Bind(C3D_MtxStack* stk, GPU_SHADER_TYPE unifType, int unifPos, int unifLen)
{ {
stk->unifType = unifType;
stk->unifPos = unifPos; stk->unifPos = unifPos;
stk->unifLen = unifLen; stk->unifLen = unifLen;
stk->isDirty = true; stk->isDirty = true;
@ -36,7 +37,7 @@ void MtxStack_Update(C3D_MtxStack* stk)
if (stk->unifPos != 0xFF) if (stk->unifPos != 0xFF)
{ {
C3D_FVec* out = C3D_FVUnifWritePtr(stk->unifPos, stk->unifLen); C3D_FVec* out = C3D_FVUnifWritePtr(stk->unifType, stk->unifPos, stk->unifLen);
memcpy(out, &stk->m[stk->pos], (u32)stk->unifLen * sizeof(C3D_FVec)); memcpy(out, &stk->m[stk->pos], (u32)stk->unifLen * sizeof(C3D_FVec));
} }

View File

@ -1,21 +1,23 @@
#include <c3d/uniforms.h> #include <c3d/uniforms.h>
//#include <stdio.h> //#include <stdio.h>
C3D_FVec C3D_FVUnif[C3D_FVUNIF_COUNT]; C3D_FVec C3D_FVUnif[2][C3D_FVUNIF_COUNT];
C3D_IVec C3D_IVUnif[C3D_IVUNIF_COUNT]; C3D_IVec C3D_IVUnif[2][C3D_IVUNIF_COUNT];
u16 C3D_BoolUnifs; u16 C3D_BoolUnifs[2];
bool C3D_FVUnifDirty[C3D_FVUNIF_COUNT]; bool C3D_FVUnifDirty[2][C3D_FVUNIF_COUNT];
bool C3D_IVUnifDirty[C3D_IVUNIF_COUNT]; bool C3D_IVUnifDirty[2][C3D_IVUNIF_COUNT];
bool C3D_BoolUnifsDirty; bool C3D_BoolUnifsDirty[2];
void C3D_UpdateUniforms(void) void C3D_UpdateUniforms(GPU_SHADER_TYPE type)
{ {
int offset = type == GPU_GEOMETRY_SHADER ? (GPUREG_GSH_BOOLUNIFORM-GPUREG_VSH_BOOLUNIFORM) : 0;
// Update FVec uniforms // Update FVec uniforms
int i = 0; int i = 0;
while (i < C3D_FVUNIF_COUNT) while (i < C3D_FVUNIF_COUNT)
{ {
if (!C3D_FVUnifDirty[i]) if (!C3D_FVUnifDirty[type][i])
{ {
i ++; i ++;
continue; continue;
@ -23,7 +25,7 @@ void C3D_UpdateUniforms(void)
// Find the number of consecutive dirty uniforms // Find the number of consecutive dirty uniforms
int j; int j;
for (j = i; j < C3D_FVUNIF_COUNT && C3D_FVUnifDirty[j]; j ++); for (j = i; j < C3D_FVUNIF_COUNT && C3D_FVUnifDirty[type][j]; j ++);
/* /*
consoleClear(); consoleClear();
@ -34,12 +36,12 @@ void C3D_UpdateUniforms(void)
*/ */
// Upload the uniforms // Upload the uniforms
GPU_SetFloatUniform(GPU_VERTEX_SHADER, i, (u32*)&C3D_FVUnif[i], j-i); GPU_SetFloatUniform(type, i, (u32*)&C3D_FVUnif[i], j-i);
// Clear the dirty flag // Clear the dirty flag
int k; int k;
for (k = i; k < j; k ++) for (k = i; k < j; k ++)
C3D_FVUnifDirty[k] = false; C3D_FVUnifDirty[type][k] = false;
// Advance // Advance
i += j; i += j;
@ -48,16 +50,16 @@ void C3D_UpdateUniforms(void)
// Update IVec uniforms // Update IVec uniforms
for (i = 0; i < C3D_IVUNIF_COUNT; i ++) for (i = 0; i < C3D_IVUNIF_COUNT; i ++)
{ {
if (!C3D_IVUnifDirty[i]) continue; if (!C3D_IVUnifDirty[type][i]) continue;
GPUCMD_AddWrite(GPUREG_VSH_INTUNIFORM_I0+i, C3D_IVUnif[i]); GPUCMD_AddWrite(GPUREG_VSH_INTUNIFORM_I0+offset+i, C3D_IVUnif[type][i]);
C3D_IVUnifDirty[i] = false; C3D_IVUnifDirty[type][i] = false;
} }
// Update bool uniforms // Update bool uniforms
if (C3D_BoolUnifsDirty) if (C3D_BoolUnifsDirty[type])
{ {
GPUCMD_AddWrite(GPUREG_VSH_BOOLUNIFORM, 0x7FFF0000 | (u32)C3D_BoolUnifs); GPUCMD_AddWrite(GPUREG_VSH_BOOLUNIFORM+offset, 0x7FFF0000 | (u32)C3D_BoolUnifs[type]);
C3D_BoolUnifsDirty = false; C3D_BoolUnifsDirty[type] = false;
} }
} }