blob: 88c9423d012f7e34e155438bff0bb25afc9fbcff [file] [log] [blame]
[email protected]e259eb412012-10-13 05:47:241// 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
[email protected]1868a342012-11-07 15:56:0210#include <vector>
[email protected]e259eb412012-10-13 05:47:2411#include "base/logging.h"
[email protected]d3eba342013-04-18 21:11:5012#include "base/memory/scoped_ptr.h"
[email protected]e259eb412012-10-13 05:47:2413#include "gpu/command_buffer/service/gl_utils.h"
[email protected]e259eb412012-10-13 05:47:2414#include "gpu/command_buffer/service/query_manager.h"
[email protected]e259eb412012-10-13 05:47:2415#include "gpu/command_buffer/service/texture_manager.h"
orglofchcad5a6742014-11-07 19:51:1216#include "gpu/command_buffer/service/valuebuffer_manager.h"
[email protected]e259eb412012-10-13 05:47:2417#include "gpu/command_buffer/service/vertex_attrib_manager.h"
18#include "gpu/command_buffer/service/vertex_array_manager.h"
[email protected]88a61bf2012-10-27 13:00:4219#include "gpu/gpu_export.h"
[email protected]e259eb412012-10-13 05:47:2420
21namespace gpu {
22namespace gles2 {
23
[email protected]31494b82013-02-28 10:10:2624class Buffer;
[email protected]d3eba342013-04-18 21:11:5025class ErrorState;
[email protected]828a3932014-04-02 14:43:1326class ErrorStateClient;
[email protected]b3cbad12012-12-05 19:56:3627class FeatureInfo;
[email protected]31494b82013-02-28 10:10:2628class Framebuffer;
29class Program;
30class Renderbuffer;
[email protected]b3cbad12012-12-05 19:56:3631
[email protected]e259eb412012-10-13 05:47:2432// State associated with each texture unit.
[email protected]88a61bf2012-10-27 13:00:4233struct GPU_EXPORT TextureUnit {
[email protected]e259eb412012-10-13 05:47:2434 TextureUnit();
35 ~TextureUnit();
36
37 // The last target that was bound to this texture unit.
38 GLenum bind_target;
39
40 // texture currently bound to this unit's GL_TEXTURE_2D with glBindTexture
[email protected]370eaf12013-05-18 09:19:4941 scoped_refptr<TextureRef> bound_texture_2d;
[email protected]e259eb412012-10-13 05:47:2442
43 // texture currently bound to this unit's GL_TEXTURE_CUBE_MAP with
44 // glBindTexture
[email protected]370eaf12013-05-18 09:19:4945 scoped_refptr<TextureRef> bound_texture_cube_map;
[email protected]e259eb412012-10-13 05:47:2446
47 // texture currently bound to this unit's GL_TEXTURE_EXTERNAL_OES with
48 // glBindTexture
[email protected]370eaf12013-05-18 09:19:4949 scoped_refptr<TextureRef> bound_texture_external_oes;
[email protected]e259eb412012-10-13 05:47:2450
51 // texture currently bound to this unit's GL_TEXTURE_RECTANGLE_ARB with
52 // glBindTexture
[email protected]370eaf12013-05-18 09:19:4953 scoped_refptr<TextureRef> bound_texture_rectangle_arb;
[email protected]e259eb412012-10-13 05:47:2454
zmoea06a6f2015-04-30 01:15:4655 // texture currently bound to this unit's GL_TEXTURE_3D with glBindTexture
56 scoped_refptr<TextureRef> bound_texture_3d;
57
58 // texture currently bound to this unit's GL_TEXTURE_2D_ARRAY with
59 // glBindTexture
60 scoped_refptr<TextureRef> bound_texture_2d_array;
61
[email protected]370eaf12013-05-18 09:19:4962 scoped_refptr<TextureRef> GetInfoForSamplerType(
[email protected]ed9f9cd2013-02-27 21:12:3563 GLenum type) {
[email protected]e259eb412012-10-13 05:47:2464 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE ||
65 type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_2D_RECT_ARB);
66 switch (type) {
67 case GL_SAMPLER_2D:
68 return bound_texture_2d;
69 case GL_SAMPLER_CUBE:
70 return bound_texture_cube_map;
71 case GL_SAMPLER_EXTERNAL_OES:
72 return bound_texture_external_oes;
73 case GL_SAMPLER_2D_RECT_ARB:
74 return bound_texture_rectangle_arb;
zmoea06a6f2015-04-30 01:15:4675 case GL_SAMPLER_3D:
76 return bound_texture_3d;
77 case GL_SAMPLER_2D_ARRAY:
78 return bound_texture_2d_array;
[email protected]e259eb412012-10-13 05:47:2479 }
80
81 NOTREACHED();
82 return NULL;
83 }
84
[email protected]370eaf12013-05-18 09:19:4985 void Unbind(TextureRef* texture) {
[email protected]7cd76fd2013-06-02 21:11:1186 if (bound_texture_2d.get() == texture) {
[email protected]e259eb412012-10-13 05:47:2487 bound_texture_2d = NULL;
88 }
[email protected]7cd76fd2013-06-02 21:11:1189 if (bound_texture_cube_map.get() == texture) {
[email protected]e259eb412012-10-13 05:47:2490 bound_texture_cube_map = NULL;
91 }
[email protected]7cd76fd2013-06-02 21:11:1192 if (bound_texture_external_oes.get() == texture) {
[email protected]e259eb412012-10-13 05:47:2493 bound_texture_external_oes = NULL;
94 }
zmoea06a6f2015-04-30 01:15:4695 if (bound_texture_3d.get() == texture) {
96 bound_texture_3d = NULL;
97 }
98 if (bound_texture_2d_array.get() == texture) {
99 bound_texture_2d_array = NULL;
100 }
[email protected]e259eb412012-10-13 05:47:24101 }
102};
103
zmo5ee097e2015-05-14 19:13:52104class GPU_EXPORT Vec4 {
105 public:
106 enum DataType {
107 kFloat,
108 kInt,
109 kUInt,
110 };
111
[email protected]af6380962012-11-29 23:24:13112 Vec4() {
zmo5ee097e2015-05-14 19:13:52113 v_[0].float_value = 0.0f;
114 v_[1].float_value = 0.0f;
115 v_[2].float_value = 0.0f;
116 v_[3].float_value = 1.0f;
117 type_ = kFloat;
[email protected]af6380962012-11-29 23:24:13118 }
zmo5ee097e2015-05-14 19:13:52119
120 template <typename T>
121 void GetValues(T* values) const;
122
123 template <typename T>
124 void SetValues(const T* values);
125
126 DataType type() const {
127 return type_;
128 }
129
130 bool Equal(const Vec4& other) const;
131
132 private:
133 union ValueUnion {
134 GLfloat float_value;
135 GLint int_value;
136 GLuint uint_value;
137 };
138
139 ValueUnion v_[4];
140 DataType type_;
[email protected]af6380962012-11-29 23:24:13141};
[email protected]e259eb412012-10-13 05:47:24142
zmo5ee097e2015-05-14 19:13:52143template <>
144GPU_EXPORT void Vec4::GetValues<GLfloat>(GLfloat* values) const;
145template <>
146GPU_EXPORT void Vec4::GetValues<GLint>(GLint* values) const;
147template <>
148GPU_EXPORT void Vec4::GetValues<GLuint>(GLuint* values) const;
149
150template <>
151GPU_EXPORT void Vec4::SetValues<GLfloat>(const GLfloat* values);
152template <>
153GPU_EXPORT void Vec4::SetValues<GLint>(const GLint* values);
154template <>
155GPU_EXPORT void Vec4::SetValues<GLuint>(const GLuint* values);
156
[email protected]88a61bf2012-10-27 13:00:42157struct GPU_EXPORT ContextState {
[email protected]828a3932014-04-02 14:43:13158 ContextState(FeatureInfo* feature_info,
159 ErrorStateClient* error_state_client,
160 Logger* logger);
[email protected]e259eb412012-10-13 05:47:24161 ~ContextState();
162
[email protected]f731b9462012-10-30 00:35:22163 void Initialize();
164
[email protected]454157e2014-05-03 02:49:45165 void SetIgnoreCachedStateForTest(bool ignore) {
166 ignore_cached_state = ignore;
167 }
168
[email protected]8875a5f2014-06-27 08:33:47169 void RestoreState(const ContextState* prev_state);
[email protected]88ba52f2014-04-09 12:39:34170 void InitCapabilities(const ContextState* prev_state) const;
171 void InitState(const ContextState* prev_state) const;
[email protected]f731b9462012-10-30 00:35:22172
[email protected]29a4d902013-02-26 20:18:06173 void RestoreActiveTexture() const;
[email protected]5baa86bc2014-01-16 04:33:16174 void RestoreAllTextureUnitBindings(const ContextState* prev_state) const;
[email protected]4b2d2b262014-03-21 22:05:27175 void RestoreActiveTextureUnitBinding(unsigned int target) const;
[email protected]81f20a622014-04-18 01:54:52176 void RestoreVertexAttribValues() const;
177 void RestoreVertexAttribArrays(
178 const scoped_refptr<VertexAttribManager> attrib_manager) const;
179 void RestoreVertexAttribs() const;
[email protected]29a4d902013-02-26 20:18:06180 void RestoreBufferBindings() const;
[email protected]88ba52f2014-04-09 12:39:34181 void RestoreGlobalState(const ContextState* prev_state) const;
[email protected]29a4d902013-02-26 20:18:06182 void RestoreProgramBindings() const;
[email protected]8875a5f2014-06-27 08:33:47183 void RestoreRenderbufferBindings();
[email protected]5baa86bc2014-01-16 04:33:16184 void RestoreTextureUnitBindings(
185 GLuint unit, const ContextState* prev_state) const;
[email protected]29a4d902013-02-26 20:18:06186
[email protected]d058bca2012-11-26 10:27:26187 // Helper for getting cached state.
188 bool GetStateAsGLint(
189 GLenum pname, GLint* params, GLsizei* num_written) const;
190 bool GetStateAsGLfloat(
191 GLenum pname, GLfloat* params, GLsizei* num_written) const;
192 bool GetEnabled(GLenum cap) const;
193
[email protected]454157e2014-05-03 02:49:45194 inline void SetDeviceColorMask(GLboolean red,
195 GLboolean green,
196 GLboolean blue,
197 GLboolean alpha) {
198 if (cached_color_mask_red == red && cached_color_mask_green == green &&
199 cached_color_mask_blue == blue && cached_color_mask_alpha == alpha &&
200 !ignore_cached_state)
201 return;
202 cached_color_mask_red = red;
203 cached_color_mask_green = green;
204 cached_color_mask_blue = blue;
205 cached_color_mask_alpha = alpha;
206 glColorMask(red, green, blue, alpha);
207 }
208
209 inline void SetDeviceDepthMask(GLboolean mask) {
210 if (cached_depth_mask == mask && !ignore_cached_state)
211 return;
212 cached_depth_mask = mask;
213 glDepthMask(mask);
214 }
215
216 inline void SetDeviceStencilMaskSeparate(GLenum op, GLuint mask) {
217 if (op == GL_FRONT) {
218 if (cached_stencil_front_writemask == mask && !ignore_cached_state)
219 return;
220 cached_stencil_front_writemask = mask;
221 } else if (op == GL_BACK) {
222 if (cached_stencil_back_writemask == mask && !ignore_cached_state)
223 return;
224 cached_stencil_back_writemask = mask;
225 } else {
226 NOTREACHED();
227 return;
228 }
229 glStencilMaskSeparate(op, mask);
230 }
231
[email protected]d3eba342013-04-18 21:11:50232 ErrorState* GetErrorState();
233
zmo4c0c3532015-05-22 20:04:48234 void SetBoundBuffer(GLenum target, Buffer* buffer);
235 void RemoveBoundBuffer(Buffer* buffer);
236
[email protected]f731b9462012-10-30 00:35:22237 #include "gpu/command_buffer/service/context_state_autogen.h"
238
239 EnableFlags enable_flags;
240
[email protected]e259eb412012-10-13 05:47:24241 // Current active texture by 0 - n index.
242 // In other words, if we call glActiveTexture(GL_TEXTURE2) this value would
243 // be 2.
244 GLuint active_texture_unit;
245
[email protected]e259eb412012-10-13 05:47:24246 // The currently bound array buffer. If this is 0 it is illegal to call
247 // glVertexAttribPointer.
[email protected]16ccec12013-02-28 03:40:21248 scoped_refptr<Buffer> bound_array_buffer;
[email protected]e259eb412012-10-13 05:47:24249
zmo4c0c3532015-05-22 20:04:48250 scoped_refptr<Buffer> bound_copy_read_buffer;
251 scoped_refptr<Buffer> bound_copy_write_buffer;
252 scoped_refptr<Buffer> bound_pixel_pack_buffer;
253 scoped_refptr<Buffer> bound_pixel_unpack_buffer;
254 scoped_refptr<Buffer> bound_transform_feedback_buffer;
255 scoped_refptr<Buffer> bound_uniform_buffer;
256
[email protected]e259eb412012-10-13 05:47:24257 // Which textures are bound to texture units through glActiveTexture.
[email protected]1868a342012-11-07 15:56:02258 std::vector<TextureUnit> texture_units;
[email protected]e259eb412012-10-13 05:47:24259
[email protected]af6380962012-11-29 23:24:13260 // The values for each attrib.
261 std::vector<Vec4> attrib_values;
262
[email protected]e259eb412012-10-13 05:47:24263 // Class that manages vertex attribs.
[email protected]ed9f9cd2013-02-27 21:12:35264 scoped_refptr<VertexAttribManager> vertex_attrib_manager;
[email protected]81f20a622014-04-18 01:54:52265 scoped_refptr<VertexAttribManager> default_vertex_attrib_manager;
[email protected]e259eb412012-10-13 05:47:24266
267 // The program in use by glUseProgram
[email protected]ed9f9cd2013-02-27 21:12:35268 scoped_refptr<Program> current_program;
[email protected]e259eb412012-10-13 05:47:24269
[email protected]e259eb412012-10-13 05:47:24270 // The currently bound renderbuffer
[email protected]ed9f9cd2013-02-27 21:12:35271 scoped_refptr<Renderbuffer> bound_renderbuffer;
[email protected]8875a5f2014-06-27 08:33:47272 bool bound_renderbuffer_valid;
[email protected]e259eb412012-10-13 05:47:24273
orglofchcad5a6742014-11-07 19:51:12274 // The currently bound valuebuffer
275 scoped_refptr<Valuebuffer> bound_valuebuffer;
276
[email protected]8ebd46c2014-01-08 12:06:13277 // A map of of target -> Query for current queries
278 typedef std::map<GLuint, scoped_refptr<QueryManager::Query> > QueryMap;
279 QueryMap current_queries;
[email protected]e259eb412012-10-13 05:47:24280
[email protected]e259eb412012-10-13 05:47:24281 bool pack_reverse_row_order;
[email protected]454157e2014-05-03 02:49:45282 bool ignore_cached_state;
[email protected]b3cbad12012-12-05 19:56:36283
zmo8ac3bab2015-04-18 02:30:58284 mutable bool fbo_binding_for_scissor_workaround_dirty;
[email protected]d3eba342013-04-18 21:11:50285
286 private:
zmo8ac3bab2015-04-18 02:30:58287 void EnableDisable(GLenum pname, bool enable) const;
288
289 FeatureInfo* feature_info_;
[email protected]d3eba342013-04-18 21:11:50290 scoped_ptr<ErrorState> error_state_;
[email protected]e259eb412012-10-13 05:47:24291};
292
293} // namespace gles2
294} // namespace gpu
295
296#endif // GPU_COMMAND_BUFFER_SERVICE_CONTEXT_STATE_H_
297