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);
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_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_TexUpload(&myTex, grass_bin);

View File

@ -6,7 +6,7 @@ typedef struct
{
C3D_Mtx m[C3D_MTXSTACK_SIZE];
int pos;
u8 unifPos, unifLen;
u8 unifType, unifPos, unifLen;
bool isDirty;
} C3D_MtxStack;
@ -17,7 +17,7 @@ static inline C3D_Mtx* MtxStack_Cur(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_Pop(C3D_MtxStack* stk);
void MtxStack_Update(C3D_MtxStack* stk);

View File

@ -3,41 +3,41 @@
#define C3D_FVUNIF_COUNT 96
#define C3D_IVUNIF_COUNT 4
extern C3D_FVec C3D_FVUnif[C3D_FVUNIF_COUNT];
extern C3D_IVec C3D_IVUnif[C3D_IVUNIF_COUNT];
extern u16 C3D_BoolUnifs;
extern C3D_FVec C3D_FVUnif[2][C3D_FVUNIF_COUNT];
extern C3D_IVec C3D_IVUnif[2][C3D_IVUNIF_COUNT];
extern u16 C3D_BoolUnifs[2];
extern bool C3D_FVUnifDirty[C3D_FVUNIF_COUNT];
extern bool C3D_IVUnifDirty[C3D_IVUNIF_COUNT];
extern bool C3D_BoolUnifsDirty;
extern bool C3D_FVUnifDirty[2][C3D_FVUNIF_COUNT];
extern bool C3D_IVUnifDirty[2][C3D_IVUNIF_COUNT];
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;
for (i = 0; i < size; i ++)
C3D_FVUnifDirty[id+i] = true;
return &C3D_FVUnif[id];
C3D_FVUnifDirty[type][id+i] = true;
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;
return &C3D_IVUnif[id];
C3D_IVUnifDirty[type][id] = true;
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->y = y;
ptr->z = z;
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);
}
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;
}
C3D_UpdateUniforms();
C3D_UpdateUniforms(GPU_VERTEX_SHADER);
C3D_UpdateUniforms(GPU_GEOMETRY_SHADER);
}
void C3D_FlushAsync(void)

View File

@ -9,8 +9,9 @@ void MtxStack_Init(C3D_MtxStack* stk)
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->unifLen = unifLen;
stk->isDirty = true;
@ -36,7 +37,7 @@ void MtxStack_Update(C3D_MtxStack* stk)
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));
}

View File

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