#pragma once #include "GPU/ge_constants.h" enum StencilValueType { STENCIL_VALUE_UNIFORM, STENCIL_VALUE_ZERO, STENCIL_VALUE_ONE, STENCIL_VALUE_KEEP, STENCIL_VALUE_INVERT, STENCIL_VALUE_INCR_4, STENCIL_VALUE_INCR_8, STENCIL_VALUE_DECR_4, STENCIL_VALUE_DECR_8, }; enum ReplaceAlphaType { REPLACE_ALPHA_NO = 0, REPLACE_ALPHA_YES = 1, REPLACE_ALPHA_DUALSOURCE = 2, }; enum ReplaceBlendType { REPLACE_BLEND_NO, REPLACE_BLEND_STANDARD, REPLACE_BLEND_PRE_SRC, REPLACE_BLEND_PRE_SRC_2X_ALPHA, REPLACE_BLEND_2X_ALPHA, REPLACE_BLEND_2X_SRC, REPLACE_BLEND_COPY_FBO, }; enum LogicOpReplaceType { LOGICOPTYPE_NORMAL, LOGICOPTYPE_ONE, LOGICOPTYPE_INVERT, }; bool IsAlphaTestTriviallyTrue(); bool IsColorTestAgainstZero(); bool IsColorTestTriviallyTrue(); bool IsAlphaTestAgainstZero(); StencilValueType ReplaceAlphaWithStencilType(); ReplaceAlphaType ReplaceAlphaWithStencil(ReplaceBlendType replaceBlend); ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bufferFormat); bool CanUseHardwareTransform(int prim); LogicOpReplaceType ReplaceLogicOpType(); // Common representation, should be able to set this directly with any modern API. struct ViewportAndScissor { bool scissorEnable; int scissorX; int scissorY; int scissorW; int scissorH; float viewportX; float viewportY; float viewportW; float viewportH; float depthRangeMin; float depthRangeMax; bool dirtyProj; }; void ConvertViewportAndScissor(bool useBufferedRendering, float renderWidth, float renderHeight, int bufferWidth, int bufferHeight, ViewportAndScissor &out);