1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-11 15:45:05 +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 {
SceGxmVertexProgram *vp;
SceGxmFragmentProgram *fp;
SceGxmShaderPatcherId vpUID;
SceGxmProgram *vpPtr, *fpPtr;
SceGxmShaderPatcherId vpUID, fpUID;
struct PSO {
SceGxmFragmentProgram *fp;
SceGxmShaderPatcherId fpUID;
} pso[2 * bmMAX];
const SceGxmProgramParameter *vParams[uMAX];
const SceGxmProgramParameter *fParams[uMAX];
@@ -395,10 +399,13 @@ namespace GAPI {
int cbCount[uMAX];
int colorMask, blendMode;
int psoIndex;
bool rebind;
void init(Pass pass, int type, int *def, int defCount) {
memset(pso, 0, sizeof(pso));
const uint8 *vpSrc, *fpSrc;
switch (pass) {
case passCompose : vpSrc = COMPOSE_VP; fpSrc = COMPOSE_FP; break;
@@ -430,7 +437,6 @@ namespace GAPI {
fpPtr = (SceGxmProgram*)fpSrc;
sceGxmShaderPatcherRegisterProgram(shaderPatcher, vpPtr, &vpUID);
sceGxmShaderPatcherRegisterProgram(shaderPatcher, fpPtr, &fpUID);
SceGxmVertexStream vStream;
vStream.stride = sizeof(Vertex);
@@ -467,20 +473,27 @@ namespace GAPI {
}
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++) {
vParams[ut] = sceGxmProgramFindParameterByName(vpPtr, UniformName[ut]);
fParams[ut] = sceGxmProgramFindParameterByName(fpPtr, UniformName[ut]);
}
colorMask = SCE_GXM_COLOR_MASK_ALL;
blendMode = 0;
colorMask = blendMode = -1;
}
void deinit() {
sceGxmDisplayQueueFinish();
sceGxmShaderPatcherReleaseVertexProgram(shaderPatcher, vp);
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) {
@@ -493,30 +506,47 @@ namespace GAPI {
blendInfo.colorMask = SceGxmColorMask(colorMask);
blendInfo.colorFunc = 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) {
case RS_BLEND_ALPHA :
blendInfo.colorSrc = blendInfo.alphaSrc = SCE_GXM_BLEND_FACTOR_SRC_ALPHA;
blendInfo.colorDst = blendInfo.alphaDst = SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
psoIndex = bmAlpha;
blendInfo.colorSrc = SCE_GXM_BLEND_FACTOR_SRC_ALPHA;
blendInfo.colorDst = SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
break;
case RS_BLEND_ADD :
blendInfo.colorSrc = blendInfo.alphaSrc = SCE_GXM_BLEND_FACTOR_ONE;
blendInfo.colorDst = blendInfo.alphaDst = SCE_GXM_BLEND_FACTOR_ONE;
psoIndex = bmAdd;
blendInfo.colorSrc = SCE_GXM_BLEND_FACTOR_ONE;
blendInfo.colorDst = SCE_GXM_BLEND_FACTOR_ONE;
break;
case RS_BLEND_MULT :
blendInfo.colorSrc = blendInfo.alphaSrc = SCE_GXM_BLEND_FACTOR_DST_COLOR;
blendInfo.colorDst = blendInfo.alphaDst = SCE_GXM_BLEND_FACTOR_ZERO;
psoIndex = bmMult;
blendInfo.colorSrc = SCE_GXM_BLEND_FACTOR_DST_COLOR;
blendInfo.colorDst = SCE_GXM_BLEND_FACTOR_ZERO;
break;
case RS_BLEND_PREMULT :
blendInfo.colorSrc = blendInfo.alphaSrc = SCE_GXM_BLEND_FACTOR_ONE;
blendInfo.colorDst = blendInfo.alphaDst = SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
psoIndex = bmPremult;
blendInfo.colorSrc = SCE_GXM_BLEND_FACTOR_ONE;
blendInfo.colorDst = SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
break;
default :
blendInfo.colorSrc = blendInfo.alphaSrc = SCE_GXM_BLEND_FACTOR_ONE;
blendInfo.colorDst = blendInfo.alphaDst = SCE_GXM_BLEND_FACTOR_ZERO;
psoIndex = bmNone;
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;
}
@@ -535,7 +565,7 @@ namespace GAPI {
void setup() {
if (rebind) {
sceGxmSetVertexProgram(Context::gxmContext, vp);
sceGxmSetFragmentProgram(Context::gxmContext, fp);
sceGxmSetFragmentProgram(Context::gxmContext, pso[psoIndex].fp);
rebind = false;
}

View File

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

View File

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

View File

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