Add support for geoshader uniforms
This commit is contained in:
parent
57c98d4291
commit
a53124d98c
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user