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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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" />
|
||||||
|
@@ -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">
|
||||||
|
Reference in New Issue
Block a user