1 // 2 // Copyright 2015 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // StateManager9.h: Defines a class for caching D3D9 state 8 9 #ifndef LIBANGLE_RENDERER_D3D9_STATEMANAGER9_H_ 10 #define LIBANGLE_RENDERER_D3D9_STATEMANAGER9_H_ 11 12 #include "libANGLE/State.h" 13 #include "libANGLE/angletypes.h" 14 #include "libANGLE/renderer/d3d/RendererD3D.h" 15 16 namespace rx 17 { 18 19 class Renderer9; 20 21 struct dx_VertexConstants9 22 { 23 float depthRange[4]; 24 float viewAdjust[4]; 25 float viewCoords[4]; 26 }; 27 28 struct dx_PixelConstants9 29 { 30 float depthRange[4]; 31 float viewCoords[4]; 32 float depthFront[4]; 33 }; 34 35 class StateManager9 final : angle::NonCopyable 36 { 37 public: 38 StateManager9(Renderer9 *renderer9); 39 ~StateManager9(); 40 41 void initialize(); 42 43 void syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits); 44 45 void setBlendDepthRasterStates(const gl::State &glState, unsigned int sampleMask); 46 void setScissorState(const gl::Rectangle &scissor, bool enabled); 47 void setViewportState(const gl::Rectangle &viewport, 48 float zNear, 49 float zFar, 50 gl::PrimitiveMode drawMode, 51 GLenum frontFace, 52 bool ignoreViewport); 53 54 void setShaderConstants(); 55 56 void forceSetBlendState(); 57 void forceSetRasterState(); 58 void forceSetDepthStencilState(); 59 void forceSetScissorState(); 60 void forceSetViewportState(); 61 void forceSetDXUniformsState(); 62 63 void updateDepthSizeIfChanged(bool depthStencilInitialized, unsigned int depthSize); 64 void updateStencilSizeIfChanged(bool depthStencilInitialized, unsigned int stencilSize); 65 66 void setRenderTargetBounds(size_t width, size_t height); 67 getRenderTargetWidth()68 int getRenderTargetWidth() const { return mRenderTargetBounds.width; } getRenderTargetHeight()69 int getRenderTargetHeight() const { return mRenderTargetBounds.height; } 70 setAllDirtyBits()71 void setAllDirtyBits() { mDirtyBits.set(); } resetDirtyBits()72 void resetDirtyBits() { mDirtyBits.reset(); } 73 74 private: 75 // Blend state functions 76 void setBlendEnabled(bool enabled); 77 void setBlendColor(const gl::BlendState &blendState, const gl::ColorF &blendColor); 78 void setBlendFuncsEquations(const gl::BlendState &blendState); 79 void setColorMask(const gl::Framebuffer *framebuffer, 80 bool red, 81 bool blue, 82 bool green, 83 bool alpha); 84 void setSampleAlphaToCoverage(bool enabled); 85 void setDither(bool dither); 86 void setSampleMask(unsigned int sampleMask); 87 88 // Current raster state functions 89 void setCullMode(bool cullFace, gl::CullFaceMode cullMode, GLenum frontFace); 90 void setDepthBias(bool polygonOffsetFill, 91 GLfloat polygonOffsetFactor, 92 GLfloat polygonOffsetUnits); 93 94 // Depth stencil state functions 95 void setStencilOpsFront(GLenum stencilFail, 96 GLenum stencilPassDepthFail, 97 GLenum stencilPassDepthPass, 98 bool frontFaceCCW); 99 void setStencilOpsBack(GLenum stencilBackFail, 100 GLenum stencilBackPassDepthFail, 101 GLenum stencilBackPassDepthPass, 102 bool frontFaceCCW); 103 void setStencilBackWriteMask(GLuint stencilBackWriteMask, bool frontFaceCCW); 104 void setDepthFunc(bool depthTest, GLenum depthFunc); 105 void setStencilTestEnabled(bool enabled); 106 void setDepthMask(bool depthMask); 107 void setStencilFuncsFront(GLenum stencilFunc, 108 GLuint stencilMask, 109 GLint stencilRef, 110 bool frontFaceCCW, 111 unsigned int maxStencil); 112 void setStencilFuncsBack(GLenum stencilBackFunc, 113 GLuint stencilBackMask, 114 GLint stencilBackRef, 115 bool frontFaceCCW, 116 unsigned int maxStencil); 117 void setStencilWriteMask(GLuint stencilWriteMask, bool frontFaceCCW); 118 119 void setScissorEnabled(bool scissorEnabled); 120 void setScissorRect(const gl::Rectangle &scissor, bool enabled); 121 122 enum DirtyBitType 123 { 124 // Blend dirty bits 125 DIRTY_BIT_BLEND_ENABLED, 126 DIRTY_BIT_BLEND_COLOR, 127 DIRTY_BIT_BLEND_FUNCS_EQUATIONS, 128 DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE, 129 DIRTY_BIT_COLOR_MASK, 130 DIRTY_BIT_DITHER, 131 DIRTY_BIT_SAMPLE_MASK, 132 133 // Rasterizer dirty bits 134 DIRTY_BIT_CULL_MODE, 135 DIRTY_BIT_DEPTH_BIAS, 136 137 // Depth stencil dirty bits 138 DIRTY_BIT_STENCIL_DEPTH_MASK, 139 DIRTY_BIT_STENCIL_DEPTH_FUNC, 140 DIRTY_BIT_STENCIL_TEST_ENABLED, 141 DIRTY_BIT_STENCIL_FUNCS_FRONT, 142 DIRTY_BIT_STENCIL_FUNCS_BACK, 143 DIRTY_BIT_STENCIL_WRITEMASK_FRONT, 144 DIRTY_BIT_STENCIL_WRITEMASK_BACK, 145 DIRTY_BIT_STENCIL_OPS_FRONT, 146 DIRTY_BIT_STENCIL_OPS_BACK, 147 148 // Scissor dirty bits 149 DIRTY_BIT_SCISSOR_ENABLED, 150 DIRTY_BIT_SCISSOR_RECT, 151 152 // Viewport dirty bits 153 DIRTY_BIT_VIEWPORT, 154 155 DIRTY_BIT_MAX 156 }; 157 158 using DirtyBits = angle::BitSet<DIRTY_BIT_MAX>; 159 160 bool mUsingZeroColorMaskWorkaround; 161 162 bool mCurSampleAlphaToCoverage; 163 164 // Currently applied blend state 165 gl::BlendState mCurBlendState; 166 gl::ColorF mCurBlendColor; 167 unsigned int mCurSampleMask; 168 DirtyBits mBlendStateDirtyBits; 169 170 // Currently applied raster state 171 gl::RasterizerState mCurRasterState; 172 unsigned int mCurDepthSize; 173 DirtyBits mRasterizerStateDirtyBits; 174 175 // Currently applied depth stencil state 176 gl::DepthStencilState mCurDepthStencilState; 177 int mCurStencilRef; 178 int mCurStencilBackRef; 179 bool mCurFrontFaceCCW; 180 unsigned int mCurStencilSize; 181 DirtyBits mDepthStencilStateDirtyBits; 182 183 // Currently applied scissor states 184 gl::Rectangle mCurScissorRect; 185 bool mCurScissorEnabled; 186 gl::Extents mRenderTargetBounds; 187 DirtyBits mScissorStateDirtyBits; 188 189 // Currently applied viewport states 190 bool mForceSetViewport; 191 gl::Rectangle mCurViewport; 192 float mCurNear; 193 float mCurFar; 194 float mCurDepthFront; 195 bool mCurIgnoreViewport; 196 197 dx_VertexConstants9 mVertexConstants; 198 dx_PixelConstants9 mPixelConstants; 199 bool mDxUniformsDirty; 200 201 // FIXME: Unsupported by D3D9 202 static const D3DRENDERSTATETYPE D3DRS_CCW_STENCILREF = D3DRS_STENCILREF; 203 static const D3DRENDERSTATETYPE D3DRS_CCW_STENCILMASK = D3DRS_STENCILMASK; 204 static const D3DRENDERSTATETYPE D3DRS_CCW_STENCILWRITEMASK = D3DRS_STENCILWRITEMASK; 205 206 Renderer9 *mRenderer9; 207 DirtyBits mDirtyBits; 208 }; 209 210 } // namespace rx 211 #endif // LIBANGLE_RENDERER_D3D9_STATEMANAGER9_H_ 212