void C3D_ImmSendAttrib(float x, float y, float z, float w) { union { u32 packed[3]; struct { u8 x[3]; u8 y[3]; u8 z[3]; u8 w[3]; }; } param; // Convert the values to float24 write24(param.x, f32tof24(x)); write24(param.y, f32tof24(y)); write24(param.z, f32tof24(z)); write24(param.w, f32tof24(w)); // Reverse the packed words u32 p = param.packed[0]; param.packed[0] = param.packed[2]; param.packed[2] = p; // Send the attribute GPUCMD_AddIncrementalWrites(GPUREG_FIXEDATTRIB_DATA0, param.packed, 3); }
void GPU_SetScissorTest_(GPU_SCISSORMODE mode, u32 x, u32 y, u32 w, u32 h) { u32 param[4]; param[0x0] = mode; param[0x1] = (y<<16)|(x&0xFFFF); param[0x2] = ((h-1)<<16)|((w-1)&0xFFFF); GPUCMD_AddIncrementalWrites(GPUREG_SCISSORTEST_MODE, param, 0x00000003); //enable depth buffer param[0x0]=0x0000000F; param[0x1]=0x0000000F; param[0x2]=0x00000002; param[0x3]=0x00000002; GPUCMD_AddIncrementalWrites(GPUREG_0112, param, 0x00000004); }
void C3D_UpdateUniforms(GPU_SHADER_TYPE type) { int offset = type == GPU_GEOMETRY_SHADER ? (GPUREG_GSH_BOOLUNIFORM-GPUREG_VSH_BOOLUNIFORM) : 0; int i = 0; // Update FVec uniforms that come from shader constants if (C3Di_ShaderFVecData[type].dirty) { while (i < C3Di_ShaderFVecData[type].count) { float24Uniform_s* u = &C3Di_ShaderFVecData[type].data[i++]; GPUCMD_AddIncrementalWrites(GPUREG_VSH_FLOATUNIFORM_CONFIG+offset, (u32*)u, 4); C3D_FVUnifDirty[type][u->id] = false; } C3Di_ShaderFVecData[type].dirty = false; i = 0; } // Update FVec uniforms while (i < C3D_FVUNIF_COUNT) { if (!C3D_FVUnifDirty[type][i]) { i ++; continue; } // Find the number of consecutive dirty uniforms int j; for (j = i; j < C3D_FVUNIF_COUNT && C3D_FVUnifDirty[type][j]; j ++); // Upload the uniforms GPUCMD_AddWrite(GPUREG_VSH_FLOATUNIFORM_CONFIG+offset, 0x80000000|i); GPUCMD_AddWrites(GPUREG_VSH_FLOATUNIFORM_DATA+offset, (u32*)&C3D_FVUnif[type][i], (j-i)*4); // Clear the dirty flag int k; for (k = i; k < j; k ++) { C3D_FVUnifDirty[type][k] = false; C3Di_FVUnifEverDirty[type][k] = true; } // Advance i += j; } // Update IVec uniforms for (i = 0; i < C3D_IVUNIF_COUNT; i ++) { if (!C3D_IVUnifDirty[type][i]) continue; GPUCMD_AddWrite(GPUREG_VSH_INTUNIFORM_I0+offset+i, C3D_IVUnif[type][i]); C3D_IVUnifDirty[type][i] = false; C3Di_IVUnifEverDirty[type][i] = false; } // Update bool uniforms if (C3D_BoolUnifsDirty[type]) { GPUCMD_AddWrite(GPUREG_VSH_BOOLUNIFORM+offset, 0x7FFF0000 | C3D_BoolUnifs[type]); C3D_BoolUnifsDirty[type] = false; } }