| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // This file contains the ContextState class. |
| |
| #ifndef GPU_COMMAND_BUFFER_SERVICE_CONTEXT_STATE_H_ |
| #define GPU_COMMAND_BUFFER_SERVICE_CONTEXT_STATE_H_ |
| |
| #include <vector> |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "gpu/command_buffer/service/gl_utils.h" |
| #include "gpu/command_buffer/service/query_manager.h" |
| #include "gpu/command_buffer/service/texture_manager.h" |
| #include "gpu/command_buffer/service/valuebuffer_manager.h" |
| #include "gpu/command_buffer/service/vertex_attrib_manager.h" |
| #include "gpu/command_buffer/service/vertex_array_manager.h" |
| #include "gpu/gpu_export.h" |
| |
| namespace gpu { |
| namespace gles2 { |
| |
| class Buffer; |
| class ErrorState; |
| class ErrorStateClient; |
| class FeatureInfo; |
| class Framebuffer; |
| class Program; |
| class Renderbuffer; |
| |
| // State associated with each texture unit. |
| struct GPU_EXPORT TextureUnit { |
| TextureUnit(); |
| ~TextureUnit(); |
| |
| // The last target that was bound to this texture unit. |
| GLenum bind_target; |
| |
| // texture currently bound to this unit's GL_TEXTURE_2D with glBindTexture |
| scoped_refptr<TextureRef> bound_texture_2d; |
| |
| // texture currently bound to this unit's GL_TEXTURE_CUBE_MAP with |
| // glBindTexture |
| scoped_refptr<TextureRef> bound_texture_cube_map; |
| |
| // texture currently bound to this unit's GL_TEXTURE_EXTERNAL_OES with |
| // glBindTexture |
| scoped_refptr<TextureRef> bound_texture_external_oes; |
| |
| // texture currently bound to this unit's GL_TEXTURE_RECTANGLE_ARB with |
| // glBindTexture |
| scoped_refptr<TextureRef> bound_texture_rectangle_arb; |
| |
| scoped_refptr<TextureRef> GetInfoForSamplerType( |
| GLenum type) { |
| DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || |
| type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_2D_RECT_ARB); |
| switch (type) { |
| case GL_SAMPLER_2D: |
| return bound_texture_2d; |
| case GL_SAMPLER_CUBE: |
| return bound_texture_cube_map; |
| case GL_SAMPLER_EXTERNAL_OES: |
| return bound_texture_external_oes; |
| case GL_SAMPLER_2D_RECT_ARB: |
| return bound_texture_rectangle_arb; |
| } |
| |
| NOTREACHED(); |
| return NULL; |
| } |
| |
| void Unbind(TextureRef* texture) { |
| if (bound_texture_2d.get() == texture) { |
| bound_texture_2d = NULL; |
| } |
| if (bound_texture_cube_map.get() == texture) { |
| bound_texture_cube_map = NULL; |
| } |
| if (bound_texture_external_oes.get() == texture) { |
| bound_texture_external_oes = NULL; |
| } |
| } |
| }; |
| |
| struct Vec4 { |
| Vec4() { |
| v[0] = 0.0f; |
| v[1] = 0.0f; |
| v[2] = 0.0f; |
| v[3] = 1.0f; |
| } |
| float v[4]; |
| }; |
| |
| struct GPU_EXPORT ContextState { |
| ContextState(FeatureInfo* feature_info, |
| ErrorStateClient* error_state_client, |
| Logger* logger); |
| ~ContextState(); |
| |
| void Initialize(); |
| |
| void SetIgnoreCachedStateForTest(bool ignore) { |
| ignore_cached_state = ignore; |
| } |
| |
| void RestoreState(const ContextState* prev_state); |
| void InitCapabilities(const ContextState* prev_state) const; |
| void InitState(const ContextState* prev_state) const; |
| |
| void RestoreActiveTexture() const; |
| void RestoreAllTextureUnitBindings(const ContextState* prev_state) const; |
| void RestoreActiveTextureUnitBinding(unsigned int target) const; |
| void RestoreVertexAttribValues() const; |
| void RestoreVertexAttribArrays( |
| const scoped_refptr<VertexAttribManager> attrib_manager) const; |
| void RestoreVertexAttribs() const; |
| void RestoreBufferBindings() const; |
| void RestoreGlobalState(const ContextState* prev_state) const; |
| void RestoreProgramBindings() const; |
| void RestoreRenderbufferBindings(); |
| void RestoreTextureUnitBindings( |
| GLuint unit, const ContextState* prev_state) const; |
| |
| // Helper for getting cached state. |
| bool GetStateAsGLint( |
| GLenum pname, GLint* params, GLsizei* num_written) const; |
| bool GetStateAsGLfloat( |
| GLenum pname, GLfloat* params, GLsizei* num_written) const; |
| bool GetEnabled(GLenum cap) const; |
| |
| inline void SetDeviceColorMask(GLboolean red, |
| GLboolean green, |
| GLboolean blue, |
| GLboolean alpha) { |
| if (cached_color_mask_red == red && cached_color_mask_green == green && |
| cached_color_mask_blue == blue && cached_color_mask_alpha == alpha && |
| !ignore_cached_state) |
| return; |
| cached_color_mask_red = red; |
| cached_color_mask_green = green; |
| cached_color_mask_blue = blue; |
| cached_color_mask_alpha = alpha; |
| glColorMask(red, green, blue, alpha); |
| } |
| |
| inline void SetDeviceDepthMask(GLboolean mask) { |
| if (cached_depth_mask == mask && !ignore_cached_state) |
| return; |
| cached_depth_mask = mask; |
| glDepthMask(mask); |
| } |
| |
| inline void SetDeviceStencilMaskSeparate(GLenum op, GLuint mask) { |
| if (op == GL_FRONT) { |
| if (cached_stencil_front_writemask == mask && !ignore_cached_state) |
| return; |
| cached_stencil_front_writemask = mask; |
| } else if (op == GL_BACK) { |
| if (cached_stencil_back_writemask == mask && !ignore_cached_state) |
| return; |
| cached_stencil_back_writemask = mask; |
| } else { |
| NOTREACHED(); |
| return; |
| } |
| glStencilMaskSeparate(op, mask); |
| } |
| |
| ErrorState* GetErrorState(); |
| |
| #include "gpu/command_buffer/service/context_state_autogen.h" |
| |
| EnableFlags enable_flags; |
| |
| // Current active texture by 0 - n index. |
| // In other words, if we call glActiveTexture(GL_TEXTURE2) this value would |
| // be 2. |
| GLuint active_texture_unit; |
| |
| // The currently bound array buffer. If this is 0 it is illegal to call |
| // glVertexAttribPointer. |
| scoped_refptr<Buffer> bound_array_buffer; |
| |
| // Which textures are bound to texture units through glActiveTexture. |
| std::vector<TextureUnit> texture_units; |
| |
| // The values for each attrib. |
| std::vector<Vec4> attrib_values; |
| |
| // Class that manages vertex attribs. |
| scoped_refptr<VertexAttribManager> vertex_attrib_manager; |
| scoped_refptr<VertexAttribManager> default_vertex_attrib_manager; |
| |
| // The program in use by glUseProgram |
| scoped_refptr<Program> current_program; |
| |
| // The currently bound renderbuffer |
| scoped_refptr<Renderbuffer> bound_renderbuffer; |
| bool bound_renderbuffer_valid; |
| |
| // The currently bound valuebuffer |
| scoped_refptr<Valuebuffer> bound_valuebuffer; |
| |
| // A map of of target -> Query for current queries |
| typedef std::map<GLuint, scoped_refptr<QueryManager::Query> > QueryMap; |
| QueryMap current_queries; |
| |
| bool pack_reverse_row_order; |
| bool ignore_cached_state; |
| |
| mutable bool fbo_binding_for_scissor_workaround_dirty; |
| |
| private: |
| void EnableDisable(GLenum pname, bool enable) const; |
| |
| FeatureInfo* feature_info_; |
| scoped_ptr<ErrorState> error_state_; |
| }; |
| |
| } // namespace gles2 |
| } // namespace gpu |
| |
| #endif // GPU_COMMAND_BUFFER_SERVICE_CONTEXT_STATE_H_ |
| |