1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // This file contains the ContextState class. 6 7 #ifndef GPU_COMMAND_BUFFER_SERVICE_CONTEXT_STATE_H_ 8 #define GPU_COMMAND_BUFFER_SERVICE_CONTEXT_STATE_H_ 9 10 #include <vector> 11 #include "base/logging.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "gpu/command_buffer/service/gl_utils.h" 14 #include "gpu/command_buffer/service/query_manager.h" 15 #include "gpu/command_buffer/service/texture_manager.h" 16 #include "gpu/command_buffer/service/vertex_attrib_manager.h" 17 #include "gpu/command_buffer/service/vertex_array_manager.h" 18 #include "gpu/gpu_export.h" 19 20 namespace gpu { 21 namespace gles2 { 22 23 class Buffer; 24 class ErrorState; 25 class ErrorStateClient; 26 class FeatureInfo; 27 class Framebuffer; 28 class Program; 29 class Renderbuffer; 30 31 // State associated with each texture unit. 32 struct GPU_EXPORT TextureUnit { 33 TextureUnit(); 34 ~TextureUnit(); 35 36 // The last target that was bound to this texture unit. 37 GLenum bind_target; 38 39 // texture currently bound to this unit's GL_TEXTURE_2D with glBindTexture 40 scoped_refptr<TextureRef> bound_texture_2d; 41 42 // texture currently bound to this unit's GL_TEXTURE_CUBE_MAP with 43 // glBindTexture 44 scoped_refptr<TextureRef> bound_texture_cube_map; 45 46 // texture currently bound to this unit's GL_TEXTURE_EXTERNAL_OES with 47 // glBindTexture 48 scoped_refptr<TextureRef> bound_texture_external_oes; 49 50 // texture currently bound to this unit's GL_TEXTURE_RECTANGLE_ARB with 51 // glBindTexture 52 scoped_refptr<TextureRef> bound_texture_rectangle_arb; 53 54 scoped_refptr<TextureRef> GetInfoForSamplerType( 55 GLenum type) { 56 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || 57 type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_2D_RECT_ARB); 58 switch (type) { 59 case GL_SAMPLER_2D: 60 return bound_texture_2d; 61 case GL_SAMPLER_CUBE: 62 return bound_texture_cube_map; 63 case GL_SAMPLER_EXTERNAL_OES: 64 return bound_texture_external_oes; 65 case GL_SAMPLER_2D_RECT_ARB: 66 return bound_texture_rectangle_arb; 67 } 68 69 NOTREACHED(); 70 return NULL; 71 } 72 73 void Unbind(TextureRef* texture) { 74 if (bound_texture_2d.get() == texture) { 75 bound_texture_2d = NULL; 76 } 77 if (bound_texture_cube_map.get() == texture) { 78 bound_texture_cube_map = NULL; 79 } 80 if (bound_texture_external_oes.get() == texture) { 81 bound_texture_external_oes = NULL; 82 } 83 } 84 }; 85 86 struct Vec4 { 87 Vec4() { 88 v[0] = 0.0f; 89 v[1] = 0.0f; 90 v[2] = 0.0f; 91 v[3] = 1.0f; 92 } 93 float v[4]; 94 }; 95 96 struct GPU_EXPORT ContextState { 97 ContextState(FeatureInfo* feature_info, 98 ErrorStateClient* error_state_client, 99 Logger* logger); 100 ~ContextState(); 101 102 void Initialize(); 103 104 void SetIgnoreCachedStateForTest(bool ignore) { 105 ignore_cached_state = ignore; 106 } 107 108 void RestoreState(const ContextState* prev_state); 109 void InitCapabilities(const ContextState* prev_state) const; 110 void InitState(const ContextState* prev_state) const; 111 112 void RestoreActiveTexture() const; 113 void RestoreAllTextureUnitBindings(const ContextState* prev_state) const; 114 void RestoreActiveTextureUnitBinding(unsigned int target) const; 115 void RestoreVertexAttribValues() const; 116 void RestoreVertexAttribArrays( 117 const scoped_refptr<VertexAttribManager> attrib_manager) const; 118 void RestoreVertexAttribs() const; 119 void RestoreBufferBindings() const; 120 void RestoreGlobalState(const ContextState* prev_state) const; 121 void RestoreProgramBindings() const; 122 void RestoreRenderbufferBindings(); 123 void RestoreTextureUnitBindings( 124 GLuint unit, const ContextState* prev_state) const; 125 126 // Helper for getting cached state. 127 bool GetStateAsGLint( 128 GLenum pname, GLint* params, GLsizei* num_written) const; 129 bool GetStateAsGLfloat( 130 GLenum pname, GLfloat* params, GLsizei* num_written) const; 131 bool GetEnabled(GLenum cap) const; 132 133 inline void SetDeviceColorMask(GLboolean red, 134 GLboolean green, 135 GLboolean blue, 136 GLboolean alpha) { 137 if (cached_color_mask_red == red && cached_color_mask_green == green && 138 cached_color_mask_blue == blue && cached_color_mask_alpha == alpha && 139 !ignore_cached_state) 140 return; 141 cached_color_mask_red = red; 142 cached_color_mask_green = green; 143 cached_color_mask_blue = blue; 144 cached_color_mask_alpha = alpha; 145 glColorMask(red, green, blue, alpha); 146 } 147 148 inline void SetDeviceDepthMask(GLboolean mask) { 149 if (cached_depth_mask == mask && !ignore_cached_state) 150 return; 151 cached_depth_mask = mask; 152 glDepthMask(mask); 153 } 154 155 inline void SetDeviceStencilMaskSeparate(GLenum op, GLuint mask) { 156 if (op == GL_FRONT) { 157 if (cached_stencil_front_writemask == mask && !ignore_cached_state) 158 return; 159 cached_stencil_front_writemask = mask; 160 } else if (op == GL_BACK) { 161 if (cached_stencil_back_writemask == mask && !ignore_cached_state) 162 return; 163 cached_stencil_back_writemask = mask; 164 } else { 165 NOTREACHED(); 166 return; 167 } 168 glStencilMaskSeparate(op, mask); 169 } 170 171 ErrorState* GetErrorState(); 172 173 #include "gpu/command_buffer/service/context_state_autogen.h" 174 175 EnableFlags enable_flags; 176 177 // Current active texture by 0 - n index. 178 // In other words, if we call glActiveTexture(GL_TEXTURE2) this value would 179 // be 2. 180 GLuint active_texture_unit; 181 182 // The currently bound array buffer. If this is 0 it is illegal to call 183 // glVertexAttribPointer. 184 scoped_refptr<Buffer> bound_array_buffer; 185 186 // Which textures are bound to texture units through glActiveTexture. 187 std::vector<TextureUnit> texture_units; 188 189 // The values for each attrib. 190 std::vector<Vec4> attrib_values; 191 192 // Class that manages vertex attribs. 193 scoped_refptr<VertexAttribManager> vertex_attrib_manager; 194 scoped_refptr<VertexAttribManager> default_vertex_attrib_manager; 195 196 // The program in use by glUseProgram 197 scoped_refptr<Program> current_program; 198 199 // The currently bound renderbuffer 200 scoped_refptr<Renderbuffer> bound_renderbuffer; 201 bool bound_renderbuffer_valid; 202 203 // A map of of target -> Query for current queries 204 typedef std::map<GLuint, scoped_refptr<QueryManager::Query> > QueryMap; 205 QueryMap current_queries; 206 207 bool pack_reverse_row_order; 208 bool ignore_cached_state; 209 210 mutable bool fbo_binding_for_scissor_workaround_dirty_; 211 FeatureInfo* feature_info_; 212 213 private: 214 scoped_ptr<ErrorState> error_state_; 215 }; 216 217 } // namespace gles2 218 } // namespace gpu 219 220 #endif // GPU_COMMAND_BUFFER_SERVICE_CONTEXT_STATE_H_ 221 222