Merge branch 'blend2' into 'master'

Try to fix not being able to use GL_SRC_COLOR and GL_ONE_MINUS_SRC_COLOR as destination blend factor

See merge request simulant/GLdc!125
This commit is contained in:
Luke Benstead 2024-09-06 13:26:55 +00:00
commit dc07cbc4d2
3 changed files with 61 additions and 46 deletions

View File

@ -985,42 +985,6 @@ GL_FORCE_INLINE int _calc_pvr_depth_test() {
} }
} }
GL_FORCE_INLINE int _calcPVRBlendFactor(GLenum factor) {
switch(factor) {
case GL_ZERO:
return GPU_BLEND_ZERO;
case GL_SRC_ALPHA:
return GPU_BLEND_SRCALPHA;
case GL_DST_COLOR:
return GPU_BLEND_DESTCOLOR;
case GL_DST_ALPHA:
return GPU_BLEND_DESTALPHA;
case GL_ONE_MINUS_DST_COLOR:
return GPU_BLEND_INVDESTCOLOR;
case GL_ONE_MINUS_SRC_ALPHA:
return GPU_BLEND_INVSRCALPHA;
case GL_ONE_MINUS_DST_ALPHA:
return GPU_BLEND_INVDESTALPHA;
case GL_ONE:
return GPU_BLEND_ONE;
default:
fprintf(stderr, "Invalid blend mode: %u\n", (unsigned int) factor);
return GPU_BLEND_ONE;
}
}
GL_FORCE_INLINE void _updatePVRBlend(PolyContext* context) {
if(_glIsBlendingEnabled() || _glIsAlphaTestEnabled()) {
context->gen.alpha = GPU_ALPHA_ENABLE;
} else {
context->gen.alpha = GPU_ALPHA_DISABLE;
}
context->blend.src = _calcPVRBlendFactor(_glGetBlendSourceFactor());
context->blend.dst = _calcPVRBlendFactor(_glGetBlendDestFactor());
}
GL_FORCE_INLINE void apply_poly_header(PolyHeader* header, GLboolean multiTextureHeader, PolyList* activePolyList, GLshort textureUnit) { GL_FORCE_INLINE void apply_poly_header(PolyHeader* header, GLboolean multiTextureHeader, PolyList* activePolyList, GLshort textureUnit) {
TRACE(); TRACE();
@ -1051,7 +1015,11 @@ GL_FORCE_INLINE void apply_poly_header(PolyHeader* header, GLboolean multiTextur
ctx.gen.fog_type = GPU_FOG_DISABLE; ctx.gen.fog_type = GPU_FOG_DISABLE;
} }
_updatePVRBlend(&ctx); if(_glIsBlendingEnabled() || _glIsAlphaTestEnabled()) {
ctx.gen.alpha = GPU_ALPHA_ENABLE;
} else {
ctx.gen.alpha = GPU_ALPHA_DISABLE;
}
if(ctx.list_type == GPU_LIST_OP_POLY) { if(ctx.list_type == GPU_LIST_OP_POLY) {
/* Opaque polys are always one/zero */ /* Opaque polys are always one/zero */
@ -1062,9 +1030,14 @@ GL_FORCE_INLINE void apply_poly_header(PolyHeader* header, GLboolean multiTextur
ctx.blend.src = GPU_BLEND_SRCALPHA; ctx.blend.src = GPU_BLEND_SRCALPHA;
ctx.blend.dst = GPU_BLEND_INVSRCALPHA; ctx.blend.dst = GPU_BLEND_INVSRCALPHA;
ctx.depth.comparison = GPU_DEPTHCMP_LEQUAL; ctx.depth.comparison = GPU_DEPTHCMP_LEQUAL;
} else if(ctx.list_type == GPU_LIST_TR_POLY && AUTOSORT_ENABLED) { } else {
/* Autosort mode requires this mode for transparent polys */ ctx.blend.src = _glGetGpuBlendSrcFactor();
ctx.depth.comparison = GPU_DEPTHCMP_GEQUAL; ctx.blend.dst = _glGetGpuBlendDstFactor();
if(ctx.list_type == GPU_LIST_TR_POLY && AUTOSORT_ENABLED) {
/* Autosort mode requires this mode for transparent polys */
ctx.depth.comparison = GPU_DEPTHCMP_GEQUAL;
}
} }
_glUpdatePVRTextureContext(&ctx, textureUnit); _glUpdatePVRTextureContext(&ctx, textureUnit);

View File

@ -385,8 +385,8 @@ GLboolean _glIsFogEnabled();
GLenum _glGetDepthFunc(); GLenum _glGetDepthFunc();
GLenum _glGetCullFace(); GLenum _glGetCullFace();
GLenum _glGetFrontFace(); GLenum _glGetFrontFace();
GLenum _glGetBlendSourceFactor(); GLenum _glGetGpuBlendSrcFactor();
GLenum _glGetBlendDestFactor(); GLenum _glGetGpuBlendDstFactor();
extern PolyList OP_LIST; extern PolyList OP_LIST;
extern PolyList PT_LIST; extern PolyList PT_LIST;

View File

@ -216,12 +216,54 @@ GLboolean _glIsNormalizeEnabled() {
return GPUState.normalize_enabled; return GPUState.normalize_enabled;
} }
GLenum _glGetBlendSourceFactor() { GLenum _glGetGpuBlendSrcFactor() {
return GPUState.blend_sfactor; switch(GPUState.blend_sfactor) {
case GL_ZERO:
return GPU_BLEND_ZERO;
case GL_SRC_ALPHA:
return GPU_BLEND_SRCALPHA;
case GL_DST_COLOR:
return GPU_BLEND_DESTCOLOR;
case GL_DST_ALPHA:
return GPU_BLEND_DESTALPHA;
case GL_ONE_MINUS_DST_COLOR:
return GPU_BLEND_INVDESTCOLOR;
case GL_ONE_MINUS_SRC_ALPHA:
return GPU_BLEND_INVSRCALPHA;
case GL_ONE_MINUS_DST_ALPHA:
return GPU_BLEND_INVDESTALPHA;
case GL_ONE:
return GPU_BLEND_ONE;
default:
fprintf(stderr, "Invalid src blend mode: %u\n", (unsigned int)GPUState.blend_sfactor);
return GPU_BLEND_ONE;
}
} }
GLenum _glGetBlendDestFactor() { GLenum _glGetGpuBlendDstFactor() {
return GPUState.blend_dfactor; switch(GPUState.blend_dfactor) {
case GL_ZERO:
return GPU_BLEND_ZERO;
case GL_SRC_ALPHA:
return GPU_BLEND_SRCALPHA;
case GL_SRC_COLOR:
// actually 'src' color in PVR2 when used as dst blend factor
return GPU_BLEND_DESTCOLOR;
case GL_DST_ALPHA:
return GPU_BLEND_DESTALPHA;
case GL_ONE_MINUS_SRC_COLOR:
// actually 'src' color in PVR2 when used as dst blend factor
return GPU_BLEND_INVDESTCOLOR;
case GL_ONE_MINUS_SRC_ALPHA:
return GPU_BLEND_INVSRCALPHA;
case GL_ONE_MINUS_DST_ALPHA:
return GPU_BLEND_INVDESTALPHA;
case GL_ONE:
return GPU_BLEND_ONE;
default:
fprintf(stderr, "Invalid dst blend mode: %u\n", (unsigned int)GPUState.blend_dfactor);
return GPU_BLEND_ONE;
}
} }