diff --git a/GL/draw.c b/GL/draw.c index 47ce853..e7d1409 100644 --- a/GL/draw.c +++ b/GL/draw.c @@ -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) { TRACE(); @@ -1051,7 +1015,11 @@ GL_FORCE_INLINE void apply_poly_header(PolyHeader* header, GLboolean multiTextur 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) { /* 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.dst = GPU_BLEND_INVSRCALPHA; ctx.depth.comparison = GPU_DEPTHCMP_LEQUAL; - } else if(ctx.list_type == GPU_LIST_TR_POLY && AUTOSORT_ENABLED) { - /* Autosort mode requires this mode for transparent polys */ - ctx.depth.comparison = GPU_DEPTHCMP_GEQUAL; + } else { + ctx.blend.src = _glGetGpuBlendSrcFactor(); + 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); diff --git a/GL/private.h b/GL/private.h index 758c636..31a7872 100644 --- a/GL/private.h +++ b/GL/private.h @@ -385,8 +385,8 @@ GLboolean _glIsFogEnabled(); GLenum _glGetDepthFunc(); GLenum _glGetCullFace(); GLenum _glGetFrontFace(); -GLenum _glGetBlendSourceFactor(); -GLenum _glGetBlendDestFactor(); +GLenum _glGetGpuBlendSrcFactor(); +GLenum _glGetGpuBlendDstFactor(); extern PolyList OP_LIST; extern PolyList PT_LIST; diff --git a/GL/state.c b/GL/state.c index 3f6c24d..ef7780f 100644 --- a/GL/state.c +++ b/GL/state.c @@ -216,12 +216,54 @@ GLboolean _glIsNormalizeEnabled() { return GPUState.normalize_enabled; } -GLenum _glGetBlendSourceFactor() { - return GPUState.blend_sfactor; +GLenum _glGetGpuBlendSrcFactor() { + 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() { - return GPUState.blend_dfactor; +GLenum _glGetGpuBlendDstFactor() { + 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; + } }