void sf2d_set_scissor_test(GPU_SCISSORMODE mode, u32 x, u32 y, u32 w, u32 h) { if (cur_screen == GFX_TOP) { GPU_SetScissorTest(mode, 240 - (y + h), 400 - (x + w), 240 - y, 400 - x); } else { GPU_SetScissorTest(mode, 240 - (y + h), 320 - (x + w), 240 - y, 320 - x); } }
void gpuUpdateState() { u32 dirtyUpdate = dirtyState; dirtyState = 0; if(dirtyUpdate & STATE_VIEWPORT) { GPU_SetViewport((u32*) osConvertVirtToPhys((u32) gpuDepthBuffer), (u32*) osConvertVirtToPhys((u32) gpuFrameBuffer), viewportX, viewportY, viewportWidth, viewportHeight); } if(dirtyUpdate & STATE_SCISSOR_TEST) { GPU_SetScissorTest((GPU_SCISSORMODE) scissorMode, scissorX, scissorY, scissorWidth, scissorHeight); } if(dirtyUpdate & STATE_DEPTH_MAP) { GPU_DepthMap(depthNear, depthFar); } if(dirtyUpdate & STATE_CULL) { GPU_SetFaceCulling((GPU_CULLMODE) cullMode); } if(dirtyUpdate & STATE_STENCIL_TEST) { GPU_SetStencilTest(stencilEnable, (GPU_TESTFUNC) stencilFunc, stencilRef, stencilMask, stencilReplace); GPU_SetStencilOp((GPU_STENCILOP) stencilFail, (GPU_STENCILOP) stencilZFail, (GPU_STENCILOP) stencilZPass); } if(dirtyUpdate & STATE_BLEND) { GPU_SetBlendingColor(blendRed, blendGreen, blendBlue, blendAlpha); GPU_SetAlphaBlending((GPU_BLENDEQUATION) blendColorEquation, (GPU_BLENDEQUATION) blendAlphaEquation, (GPU_BLENDFACTOR) blendColorSrc, (GPU_BLENDFACTOR) blendColorDst, (GPU_BLENDFACTOR) blendAlphaSrc, (GPU_BLENDFACTOR) blendAlphaDst); } if(dirtyUpdate & STATE_ALPHA_TEST) { GPU_SetAlphaTest(alphaEnable, (GPU_TESTFUNC) alphaFunc, alphaRef); } if(dirtyUpdate & STATE_DEPTH_TEST_AND_MASK) { GPU_SetDepthTestAndWriteMask(depthEnable, (GPU_TESTFUNC) depthFunc, (GPU_WRITEMASK) componentMask); } if((dirtyUpdate & STATE_ACTIVE_SHADER) && activeShader != NULL && activeShader->dvlb != NULL) { shaderProgramUse(&activeShader->program); } if((dirtyUpdate & STATE_TEX_ENV) && dirtyTexEnvs != 0) { u32 texEnvs = dirtyTexEnvs; dirtyTexEnvs = 0; for(u8 env = 0; env < TEX_ENV_COUNT; env++) { if(texEnvs & (1 << env)) { GPU_SetTexEnv(env, texEnv[env].rgbSources, texEnv[env].alphaSources, texEnv[env].rgbOperands, texEnv[env].alphaOperands, (GPU_COMBINEFUNC) texEnv[env].rgbCombine, (GPU_COMBINEFUNC) texEnv[env].alphaCombine, texEnv[env].constantColor); } } } if((dirtyUpdate & STATE_TEXTURES) && dirtyTextures != 0) { u32 textures = dirtyTextures; dirtyTextures = 0; for(u8 unit = 0; unit < TEX_UNIT_COUNT; unit++) { if(textures & (1 << unit)) { TexUnit texUnit = unit == 0 ? TEXUNIT0 : unit == 1 ? TEXUNIT1 : TEXUNIT2; TextureData* textureData = activeTextures[unit]; if(textureData != NULL && textureData->data != NULL) { GPU_SetTexture((GPU_TEXUNIT) texUnit, (u32*) osConvertVirtToPhys((u32) textureData->data), (u16) textureData->height, (u16) textureData->width, textureData->params, (GPU_TEXCOLOR) textureData->format); enabledTextures |= texUnit; } else { enabledTextures &= ~texUnit; } } } GPU_SetTextureEnable((GPU_TEXUNIT) enabledTextures); } }