1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-12 08:04:09 +02:00

#15 PSV shader variations for different blendMode and colorMask

This commit is contained in:
XProger
2019-01-13 16:09:47 +03:00
parent fd65596235
commit 57577ede26
4 changed files with 53 additions and 19 deletions

View File

@@ -384,9 +384,13 @@ namespace GAPI {
struct Shader { struct Shader {
SceGxmVertexProgram *vp; SceGxmVertexProgram *vp;
SceGxmFragmentProgram *fp; SceGxmShaderPatcherId vpUID;
SceGxmProgram *vpPtr, *fpPtr; SceGxmProgram *vpPtr, *fpPtr;
SceGxmShaderPatcherId vpUID, fpUID;
struct PSO {
SceGxmFragmentProgram *fp;
SceGxmShaderPatcherId fpUID;
} pso[2 * bmMAX];
const SceGxmProgramParameter *vParams[uMAX]; const SceGxmProgramParameter *vParams[uMAX];
const SceGxmProgramParameter *fParams[uMAX]; const SceGxmProgramParameter *fParams[uMAX];
@@ -395,10 +399,13 @@ namespace GAPI {
int cbCount[uMAX]; int cbCount[uMAX];
int colorMask, blendMode; int colorMask, blendMode;
int psoIndex;
bool rebind; bool rebind;
void init(Pass pass, int type, int *def, int defCount) { void init(Pass pass, int type, int *def, int defCount) {
memset(pso, 0, sizeof(pso));
const uint8 *vpSrc, *fpSrc; const uint8 *vpSrc, *fpSrc;
switch (pass) { switch (pass) {
case passCompose : vpSrc = COMPOSE_VP; fpSrc = COMPOSE_FP; break; case passCompose : vpSrc = COMPOSE_VP; fpSrc = COMPOSE_FP; break;
@@ -430,7 +437,6 @@ namespace GAPI {
fpPtr = (SceGxmProgram*)fpSrc; fpPtr = (SceGxmProgram*)fpSrc;
sceGxmShaderPatcherRegisterProgram(shaderPatcher, vpPtr, &vpUID); sceGxmShaderPatcherRegisterProgram(shaderPatcher, vpPtr, &vpUID);
sceGxmShaderPatcherRegisterProgram(shaderPatcher, fpPtr, &fpUID);
SceGxmVertexStream vStream; SceGxmVertexStream vStream;
vStream.stride = sizeof(Vertex); vStream.stride = sizeof(Vertex);
@@ -467,20 +473,27 @@ namespace GAPI {
} }
sceGxmShaderPatcherCreateVertexProgram(shaderPatcher, vpUID, vAttrib, vAttribCount, &vStream, 1, &vp); sceGxmShaderPatcherCreateVertexProgram(shaderPatcher, vpUID, vAttrib, vAttribCount, &vStream, 1, &vp);
sceGxmShaderPatcherCreateFragmentProgram(shaderPatcher, fpUID, SCE_GXM_OUTPUT_REGISTER_FORMAT_UCHAR4, SCE_GXM_MULTISAMPLE_NONE, NULL, vpPtr, &fp);
for (int ut = 0; ut < uMAX; ut++) { for (int ut = 0; ut < uMAX; ut++) {
vParams[ut] = sceGxmProgramFindParameterByName(vpPtr, UniformName[ut]); vParams[ut] = sceGxmProgramFindParameterByName(vpPtr, UniformName[ut]);
fParams[ut] = sceGxmProgramFindParameterByName(fpPtr, UniformName[ut]); fParams[ut] = sceGxmProgramFindParameterByName(fpPtr, UniformName[ut]);
} }
colorMask = SCE_GXM_COLOR_MASK_ALL; colorMask = blendMode = -1;
blendMode = 0;
} }
void deinit() { void deinit() {
sceGxmDisplayQueueFinish();
sceGxmShaderPatcherReleaseVertexProgram(shaderPatcher, vp);
sceGxmShaderPatcherUnregisterProgram(shaderPatcher, vpUID); sceGxmShaderPatcherUnregisterProgram(shaderPatcher, vpUID);
sceGxmShaderPatcherUnregisterProgram(shaderPatcher, fpUID);
for (int i = 0; i < COUNT(pso); i++) {
if (pso[i].fp) {
sceGxmShaderPatcherReleaseFragmentProgram(shaderPatcher, pso[i].fp);
sceGxmShaderPatcherUnregisterProgram(shaderPatcher, pso[i].fpUID);
}
}
} }
void setBlendInfo(int colorMask, int blendMode) { void setBlendInfo(int colorMask, int blendMode) {
@@ -493,30 +506,47 @@ namespace GAPI {
blendInfo.colorMask = SceGxmColorMask(colorMask); blendInfo.colorMask = SceGxmColorMask(colorMask);
blendInfo.colorFunc = SCE_GXM_BLEND_FUNC_ADD; blendInfo.colorFunc = SCE_GXM_BLEND_FUNC_ADD;
blendInfo.alphaFunc = SCE_GXM_BLEND_FUNC_ADD; blendInfo.alphaFunc = SCE_GXM_BLEND_FUNC_ADD;
blendInfo.alphaSrc = SCE_GXM_BLEND_FACTOR_ONE;
blendInfo.alphaDst = SCE_GXM_BLEND_FACTOR_ZERO;
psoIndex = 0;
switch (blendMode) { switch (blendMode) {
case RS_BLEND_ALPHA : case RS_BLEND_ALPHA :
blendInfo.colorSrc = blendInfo.alphaSrc = SCE_GXM_BLEND_FACTOR_SRC_ALPHA; psoIndex = bmAlpha;
blendInfo.colorDst = blendInfo.alphaDst = SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; blendInfo.colorSrc = SCE_GXM_BLEND_FACTOR_SRC_ALPHA;
blendInfo.colorDst = SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
break; break;
case RS_BLEND_ADD : case RS_BLEND_ADD :
blendInfo.colorSrc = blendInfo.alphaSrc = SCE_GXM_BLEND_FACTOR_ONE; psoIndex = bmAdd;
blendInfo.colorDst = blendInfo.alphaDst = SCE_GXM_BLEND_FACTOR_ONE; blendInfo.colorSrc = SCE_GXM_BLEND_FACTOR_ONE;
blendInfo.colorDst = SCE_GXM_BLEND_FACTOR_ONE;
break; break;
case RS_BLEND_MULT : case RS_BLEND_MULT :
blendInfo.colorSrc = blendInfo.alphaSrc = SCE_GXM_BLEND_FACTOR_DST_COLOR; psoIndex = bmMult;
blendInfo.colorDst = blendInfo.alphaDst = SCE_GXM_BLEND_FACTOR_ZERO; blendInfo.colorSrc = SCE_GXM_BLEND_FACTOR_DST_COLOR;
blendInfo.colorDst = SCE_GXM_BLEND_FACTOR_ZERO;
break; break;
case RS_BLEND_PREMULT : case RS_BLEND_PREMULT :
blendInfo.colorSrc = blendInfo.alphaSrc = SCE_GXM_BLEND_FACTOR_ONE; psoIndex = bmPremult;
blendInfo.colorDst = blendInfo.alphaDst = SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; blendInfo.colorSrc = SCE_GXM_BLEND_FACTOR_ONE;
blendInfo.colorDst = SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
break; break;
default : default :
blendInfo.colorSrc = blendInfo.alphaSrc = SCE_GXM_BLEND_FACTOR_ONE; psoIndex = bmNone;
blendInfo.colorDst = blendInfo.alphaDst = SCE_GXM_BLEND_FACTOR_ZERO; blendInfo.colorSrc = SCE_GXM_BLEND_FACTOR_ONE;
blendInfo.colorDst = SCE_GXM_BLEND_FACTOR_ZERO;
} }
sceGxmShaderPatcherCreateFragmentProgram(shaderPatcher, fpUID, SCE_GXM_OUTPUT_REGISTER_FORMAT_UCHAR4, SCE_GXM_MULTISAMPLE_NONE, &blendInfo, vpPtr, &fp); if (colorMask != SCE_GXM_COLOR_MASK_ALL) {
psoIndex += bmMAX;
}
PSO &p = pso[psoIndex];
if (!p.fp) {
sceGxmShaderPatcherRegisterProgram(shaderPatcher, fpPtr, &p.fpUID);
sceGxmShaderPatcherCreateFragmentProgram(shaderPatcher, p.fpUID, SCE_GXM_OUTPUT_REGISTER_FORMAT_UCHAR4, SCE_GXM_MULTISAMPLE_NONE, &blendInfo, vpPtr, &p.fp);
}
rebind = true; rebind = true;
} }
@@ -535,7 +565,7 @@ namespace GAPI {
void setup() { void setup() {
if (rebind) { if (rebind) {
sceGxmSetVertexProgram(Context::gxmContext, vp); sceGxmSetVertexProgram(Context::gxmContext, vp);
sceGxmSetFragmentProgram(Context::gxmContext, fp); sceGxmSetFragmentProgram(Context::gxmContext, pso[psoIndex].fp);
rebind = false; rebind = false;
} }

View File

@@ -374,8 +374,10 @@ struct Level : IGame {
Stream::cacheWrite("settings", (char*)&settings, sizeof(settings)); Stream::cacheWrite("settings", (char*)&settings, sizeof(settings));
if (rebuildShaders) { if (rebuildShaders) {
#if !defined(_GAPI_D3D9) && !defined(_GAPI_GXM)
delete shaderCache; delete shaderCache;
shaderCache = new ShaderCache(); shaderCache = new ShaderCache();
#endif
} }
if (rebuildMesh) { if (rebuildMesh) {

View File

@@ -204,6 +204,7 @@
<ClInclude Include="..\..\gapi_gl.h" /> <ClInclude Include="..\..\gapi_gl.h" />
<ClInclude Include="..\..\gapi_gu.h" /> <ClInclude Include="..\..\gapi_gu.h" />
<ClInclude Include="..\..\gapi_gx.h" /> <ClInclude Include="..\..\gapi_gx.h" />
<ClInclude Include="..\..\gapi_gxm.h" />
<ClInclude Include="..\..\gapi_vk.h" /> <ClInclude Include="..\..\gapi_vk.h" />
<ClInclude Include="..\..\debug.h" /> <ClInclude Include="..\..\debug.h" />
<ClInclude Include="..\..\enemy.h" /> <ClInclude Include="..\..\enemy.h" />

View File

@@ -57,6 +57,7 @@
<ClInclude Include="..\..\network.h" /> <ClInclude Include="..\..\network.h" />
<ClInclude Include="..\..\napi_socket.h" /> <ClInclude Include="..\..\napi_socket.h" />
<ClInclude Include="..\..\napi_dummy.h" /> <ClInclude Include="..\..\napi_dummy.h" />
<ClInclude Include="..\..\gapi_gxm.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="..\..\shaders\filter.glsl"> <None Include="..\..\shaders\filter.glsl">