OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
6 | 6 |
7 #include <stdio.h> | 7 #include <stdio.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <list> | 10 #include <list> |
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
566 virtual void RestoreTextureState(unsigned service_id) const OVERRIDE; | 566 virtual void RestoreTextureState(unsigned service_id) const OVERRIDE; |
567 | 567 |
568 virtual QueryManager* GetQueryManager() OVERRIDE { | 568 virtual QueryManager* GetQueryManager() OVERRIDE { |
569 return query_manager_.get(); | 569 return query_manager_.get(); |
570 } | 570 } |
571 virtual VertexArrayManager* GetVertexArrayManager() OVERRIDE { | 571 virtual VertexArrayManager* GetVertexArrayManager() OVERRIDE { |
572 return vertex_array_manager_.get(); | 572 return vertex_array_manager_.get(); |
573 } | 573 } |
574 virtual bool ProcessPendingQueries() OVERRIDE; | 574 virtual bool ProcessPendingQueries() OVERRIDE; |
575 | 575 |
576 virtual void SetGLError(GLenum error, | 576 virtual void SetGLError(unsigned error, |
577 const char* function_name, | 577 const char* function_name, |
578 const char* msg); | 578 const char* msg) OVERRIDE; |
579 virtual void SetGLErrorInvalidEnum(const char* function_name, | 579 virtual void SetGLErrorInvalidEnum(const char* function_name, |
580 GLenum value, | 580 unsigned value, |
581 const char* label); | 581 const char* label) OVERRIDE; |
582 virtual void SetResizeCallback( | 582 virtual void SetResizeCallback( |
583 const base::Callback<void(gfx::Size)>& callback) OVERRIDE; | 583 const base::Callback<void(gfx::Size)>& callback) OVERRIDE; |
584 | 584 |
585 virtual void SetMsgCallback(const MsgCallback& callback) OVERRIDE; | 585 virtual void SetMsgCallback(const MsgCallback& callback) OVERRIDE; |
586 virtual void SetWaitSyncPointCallback( | 586 virtual void SetWaitSyncPointCallback( |
587 const WaitSyncPointCallback& callback) OVERRIDE; | 587 const WaitSyncPointCallback& callback) OVERRIDE; |
588 | 588 |
589 virtual void SetStreamTextureManager(StreamTextureManager* manager) OVERRIDE; | 589 virtual void SetStreamTextureManager(StreamTextureManager* manager) OVERRIDE; |
590 | 590 |
591 virtual gfx::AsyncPixelTransferDelegate* | 591 virtual gfx::AsyncPixelTransferDelegate* |
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1232 void DoGetFramebufferAttachmentParameteriv( | 1232 void DoGetFramebufferAttachmentParameteriv( |
1233 GLenum target, GLenum attachment, GLenum pname, GLint* params); | 1233 GLenum target, GLenum attachment, GLenum pname, GLint* params); |
1234 | 1234 |
1235 // Wrapper for glGetIntegerv. | 1235 // Wrapper for glGetIntegerv. |
1236 void DoGetIntegerv(GLenum pname, GLint* params); | 1236 void DoGetIntegerv(GLenum pname, GLint* params); |
1237 | 1237 |
1238 // Gets the max value in a range in a buffer. | 1238 // Gets the max value in a range in a buffer. |
1239 GLuint DoGetMaxValueInBufferCHROMIUM( | 1239 GLuint DoGetMaxValueInBufferCHROMIUM( |
1240 GLuint buffer_id, GLsizei count, GLenum type, GLuint offset); | 1240 GLuint buffer_id, GLsizei count, GLenum type, GLuint offset); |
1241 | 1241 |
| 1242 // Wrapper for glGetBufferParameteriv. |
| 1243 void DoGetBufferParameteriv( |
| 1244 GLenum target, GLenum pname, GLint* params); |
| 1245 |
1242 // Wrapper for glGetProgramiv. | 1246 // Wrapper for glGetProgramiv. |
1243 void DoGetProgramiv( | 1247 void DoGetProgramiv( |
1244 GLuint program_id, GLenum pname, GLint* params); | 1248 GLuint program_id, GLenum pname, GLint* params); |
1245 | 1249 |
1246 // Wrapper for glRenderbufferParameteriv. | 1250 // Wrapper for glRenderbufferParameteriv. |
1247 void DoGetRenderbufferParameteriv( | 1251 void DoGetRenderbufferParameteriv( |
1248 GLenum target, GLenum pname, GLint* params); | 1252 GLenum target, GLenum pname, GLint* params); |
1249 | 1253 |
1250 // Wrapper for glGetShaderiv | 1254 // Wrapper for glGetShaderiv |
1251 void DoGetShaderiv(GLuint shader, GLenum pname, GLint* params); | 1255 void DoGetShaderiv(GLuint shader, GLenum pname, GLint* params); |
(...skipping 3060 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4312 void GLES2DecoderImpl::DoGetProgramiv( | 4316 void GLES2DecoderImpl::DoGetProgramiv( |
4313 GLuint program_id, GLenum pname, GLint* params) { | 4317 GLuint program_id, GLenum pname, GLint* params) { |
4314 Program* info = GetProgramInfoNotShader( | 4318 Program* info = GetProgramInfoNotShader( |
4315 program_id, "glGetProgramiv"); | 4319 program_id, "glGetProgramiv"); |
4316 if (!info) { | 4320 if (!info) { |
4317 return; | 4321 return; |
4318 } | 4322 } |
4319 info->GetProgramiv(pname, params); | 4323 info->GetProgramiv(pname, params); |
4320 } | 4324 } |
4321 | 4325 |
| 4326 void GLES2DecoderImpl::DoGetBufferParameteriv( |
| 4327 GLenum target, GLenum pname, GLint* params) { |
| 4328 Buffer* buffer = GetBufferInfoForTarget(target); |
| 4329 if (!buffer) { |
| 4330 return; |
| 4331 } |
| 4332 switch (pname) { |
| 4333 case GL_BUFFER_SIZE: |
| 4334 *params = buffer->size(); |
| 4335 break; |
| 4336 case GL_BUFFER_USAGE: |
| 4337 *params = buffer->usage(); |
| 4338 break; |
| 4339 default: |
| 4340 NOTREACHED(); |
| 4341 } |
| 4342 } |
| 4343 |
4322 void GLES2DecoderImpl::DoBindAttribLocation( | 4344 void GLES2DecoderImpl::DoBindAttribLocation( |
4323 GLuint program, GLuint index, const char* name) { | 4345 GLuint program, GLuint index, const char* name) { |
4324 if (!StringIsValidForGLES(name)) { | 4346 if (!StringIsValidForGLES(name)) { |
4325 SetGLError(GL_INVALID_VALUE, "glBindAttribLocation", "Invalid character"); | 4347 SetGLError(GL_INVALID_VALUE, "glBindAttribLocation", "Invalid character"); |
4326 return; | 4348 return; |
4327 } | 4349 } |
4328 if (ProgramManager::IsInvalidPrefix(name, strlen(name))) { | 4350 if (ProgramManager::IsInvalidPrefix(name, strlen(name))) { |
4329 SetGLError(GL_INVALID_OPERATION, "glBindAttribLocation", "reserved prefix"); | 4351 SetGLError(GL_INVALID_OPERATION, "glBindAttribLocation", "reserved prefix"); |
4330 return; | 4352 return; |
4331 } | 4353 } |
(...skipping 1180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5512 | 5534 |
5513 GLenum GLES2DecoderImpl::PeekGLError() { | 5535 GLenum GLES2DecoderImpl::PeekGLError() { |
5514 GLenum error = glGetError(); | 5536 GLenum error = glGetError(); |
5515 if (error != GL_NO_ERROR) { | 5537 if (error != GL_NO_ERROR) { |
5516 SetGLError(error, "", ""); | 5538 SetGLError(error, "", ""); |
5517 } | 5539 } |
5518 return error; | 5540 return error; |
5519 } | 5541 } |
5520 | 5542 |
5521 void GLES2DecoderImpl::SetGLError( | 5543 void GLES2DecoderImpl::SetGLError( |
5522 GLenum error, const char* function_name, const char* msg) { | 5544 unsigned error, const char* function_name, const char* msg) { |
5523 if (msg) { | 5545 if (msg) { |
5524 last_error_ = msg; | 5546 last_error_ = msg; |
5525 LogMessage(GetLogPrefix() + ": " + std::string("GL ERROR :") + | 5547 LogMessage(GetLogPrefix() + ": " + std::string("GL ERROR :") + |
5526 GLES2Util::GetStringEnum(error) + " : " + | 5548 GLES2Util::GetStringEnum(error) + " : " + |
5527 function_name + ": " + msg); | 5549 function_name + ": " + msg); |
5528 } | 5550 } |
5529 error_bits_ |= GLES2Util::GLErrorToErrorBit(error); | 5551 error_bits_ |= GLES2Util::GLErrorToErrorBit(error); |
5530 } | 5552 } |
5531 | 5553 |
5532 void GLES2DecoderImpl::SetGLErrorInvalidEnum( | 5554 void GLES2DecoderImpl::SetGLErrorInvalidEnum( |
5533 const char* function_name, GLenum value, const char* label) { | 5555 const char* function_name, unsigned value, const char* label) { |
5534 SetGLError(GL_INVALID_ENUM, function_name, | 5556 SetGLError(GL_INVALID_ENUM, function_name, |
5535 (std::string(label) + " was " + | 5557 (std::string(label) + " was " + |
5536 GLES2Util::GetStringEnum(value)).c_str()); | 5558 GLES2Util::GetStringEnum(value)).c_str()); |
5537 } | 5559 } |
5538 | 5560 |
5539 void GLES2DecoderImpl::SetGLErrorInvalidParam( | 5561 void GLES2DecoderImpl::SetGLErrorInvalidParam( |
5540 GLenum error, | 5562 GLenum error, |
5541 const char* function_name, | 5563 const char* function_name, |
5542 GLenum pname, | 5564 GLenum pname, |
5543 GLint param) { | 5565 GLint param) { |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5736 // it could never be invalid since glUseProgram would have failed. While | 5758 // it could never be invalid since glUseProgram would have failed. While |
5737 // glLinkProgram could later mark the program as invalid the previous | 5759 // glLinkProgram could later mark the program as invalid the previous |
5738 // valid program will still function if it is still the current program. | 5760 // valid program will still function if it is still the current program. |
5739 if (!state_.current_program) { | 5761 if (!state_.current_program) { |
5740 // The program does not exist. | 5762 // The program does not exist. |
5741 // But GL says no ERROR. | 5763 // But GL says no ERROR. |
5742 RenderWarning("Drawing with no current shader program."); | 5764 RenderWarning("Drawing with no current shader program."); |
5743 return false; | 5765 return false; |
5744 } | 5766 } |
5745 | 5767 |
5746 // true if any enabled, used divisor is zero | 5768 return state_.vertex_attrib_manager->ValidateBindings( |
5747 bool divisor0 = false; | 5769 function_name, |
5748 // Validate all attribs currently enabled. If they are used by the current | 5770 this, |
5749 // program then check that they have enough elements to handle the draw call. | 5771 feature_info_.get(), |
5750 // If they are not used by the current program check that they have a buffer | 5772 state_.current_program, |
5751 // assigned. | 5773 max_vertex_accessed, |
5752 const VertexAttribManager::VertexAttribInfoList& infos = | 5774 primcount); |
5753 state_.vertex_attrib_manager->GetEnabledVertexAttribInfos(); | |
5754 for (VertexAttribManager::VertexAttribInfoList::const_iterator it = | |
5755 infos.begin(); it != infos.end(); ++it) { | |
5756 const VertexAttrib* info = *it; | |
5757 const Program::VertexAttrib* attrib_info = | |
5758 state_.current_program->GetAttribInfoByLocation(info->index()); | |
5759 if (attrib_info) { | |
5760 divisor0 |= (info->divisor() == 0); | |
5761 GLuint count = info->MaxVertexAccessed(primcount, max_vertex_accessed); | |
5762 // This attrib is used in the current program. | |
5763 if (!info->CanAccess(count)) { | |
5764 SetGLError( | |
5765 GL_INVALID_OPERATION, function_name, | |
5766 (std::string( | |
5767 "attempt to access out of range vertices in attribute ") + | |
5768 base::IntToString(info->index())).c_str()); | |
5769 return false; | |
5770 } | |
5771 } else { | |
5772 // This attrib is not used in the current program. | |
5773 if (!info->buffer()) { | |
5774 SetGLError( | |
5775 GL_INVALID_OPERATION, function_name, | |
5776 (std::string( | |
5777 "attempt to render with no buffer attached to " | |
5778 "enabled attribute ") + | |
5779 base::IntToString(info->index())).c_str()); | |
5780 return false; | |
5781 } | |
5782 } | |
5783 } | |
5784 | |
5785 if (primcount && !divisor0) { | |
5786 SetGLError( | |
5787 GL_INVALID_OPERATION, function_name, | |
5788 "attempt instanced render with all attributes having " | |
5789 "non-zero divisors"); | |
5790 return false; | |
5791 } | |
5792 | |
5793 return true; | |
5794 } | 5775 } |
5795 | 5776 |
5796 bool GLES2DecoderImpl::SimulateAttrib0( | 5777 bool GLES2DecoderImpl::SimulateAttrib0( |
5797 const char* function_name, GLuint max_vertex_accessed, bool* simulated) { | 5778 const char* function_name, GLuint max_vertex_accessed, bool* simulated) { |
5798 DCHECK(simulated); | 5779 DCHECK(simulated); |
5799 *simulated = false; | 5780 *simulated = false; |
5800 | 5781 |
5801 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) | 5782 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) |
5802 return true; | 5783 return true; |
5803 | 5784 |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6144 | 6125 |
6145 if (!CheckBoundFramebuffersValid(function_name)) { | 6126 if (!CheckBoundFramebuffersValid(function_name)) { |
6146 return error::kNoError; | 6127 return error::kNoError; |
6147 } | 6128 } |
6148 | 6129 |
6149 if (count == 0 || (instanced && primcount == 0)) { | 6130 if (count == 0 || (instanced && primcount == 0)) { |
6150 return error::kNoError; | 6131 return error::kNoError; |
6151 } | 6132 } |
6152 | 6133 |
6153 GLuint max_vertex_accessed; | 6134 GLuint max_vertex_accessed; |
6154 if (!state_.vertex_attrib_manager->element_array_buffer()-> | 6135 Buffer* element_array_buffer = |
6155 GetMaxValueForRange(offset, count, type, &max_vertex_accessed)) { | 6136 state_.vertex_attrib_manager->element_array_buffer(); |
| 6137 |
| 6138 if (!element_array_buffer->GetMaxValueForRange( |
| 6139 offset, count, type, &max_vertex_accessed)) { |
6156 SetGLError(GL_INVALID_OPERATION, | 6140 SetGLError(GL_INVALID_OPERATION, |
6157 function_name, "range out of bounds for buffer"); | 6141 function_name, "range out of bounds for buffer"); |
6158 return error::kNoError; | 6142 return error::kNoError; |
6159 } | 6143 } |
6160 | 6144 |
6161 if (IsDrawValid(function_name, max_vertex_accessed, primcount)) { | 6145 if (IsDrawValid(function_name, max_vertex_accessed, primcount)) { |
6162 if (!ClearUnclearedTextures()) { | 6146 if (!ClearUnclearedTextures()) { |
6163 SetGLError(GL_INVALID_VALUE, function_name, "out of memory"); | 6147 SetGLError(GL_INVALID_VALUE, function_name, "out of memory"); |
6164 return error::kNoError; | 6148 return error::kNoError; |
6165 } | 6149 } |
6166 bool simulated_attrib_0 = false; | 6150 bool simulated_attrib_0 = false; |
6167 if (!SimulateAttrib0( | 6151 if (!SimulateAttrib0( |
6168 function_name, max_vertex_accessed, &simulated_attrib_0)) { | 6152 function_name, max_vertex_accessed, &simulated_attrib_0)) { |
6169 return error::kNoError; | 6153 return error::kNoError; |
6170 } | 6154 } |
6171 bool simulated_fixed_attribs = false; | 6155 bool simulated_fixed_attribs = false; |
6172 if (SimulateFixedAttribs( | 6156 if (SimulateFixedAttribs( |
6173 function_name, max_vertex_accessed, &simulated_fixed_attribs, | 6157 function_name, max_vertex_accessed, &simulated_fixed_attribs, |
6174 primcount)) { | 6158 primcount)) { |
6175 bool textures_set = SetBlackTextureForNonRenderableTextures(); | 6159 bool textures_set = SetBlackTextureForNonRenderableTextures(); |
6176 ApplyDirtyState(); | 6160 ApplyDirtyState(); |
| 6161 // REFACTOR BEFORE CHECK IN |
6177 const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset); | 6162 const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset); |
| 6163 bool used_client_side_array = false; |
| 6164 if (workarounds().use_client_side_arrays_for_stream_buffers) { |
| 6165 if (element_array_buffer->usage() == GL_STREAM_DRAW) { |
| 6166 used_client_side_array = true; |
| 6167 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); |
| 6168 indices = element_array_buffer->GetRange(offset, 0); |
| 6169 } |
| 6170 } |
| 6171 |
6178 if (!instanced) { | 6172 if (!instanced) { |
6179 glDrawElements(mode, count, type, indices); | 6173 glDrawElements(mode, count, type, indices); |
6180 } else { | 6174 } else { |
6181 glDrawElementsInstancedANGLE(mode, count, type, indices, primcount); | 6175 glDrawElementsInstancedANGLE(mode, count, type, indices, primcount); |
6182 } | 6176 } |
| 6177 |
| 6178 if (used_client_side_array) { |
| 6179 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, |
| 6180 element_array_buffer->service_id()); |
| 6181 } |
| 6182 |
6183 ProcessPendingQueries(); | 6183 ProcessPendingQueries(); |
6184 if (textures_set) { | 6184 if (textures_set) { |
6185 RestoreStateForNonRenderableTextures(); | 6185 RestoreStateForNonRenderableTextures(); |
6186 } | 6186 } |
6187 if (simulated_fixed_attribs) { | 6187 if (simulated_fixed_attribs) { |
6188 RestoreStateForSimulatedFixedAttribs(); | 6188 RestoreStateForSimulatedFixedAttribs(); |
6189 } | 6189 } |
6190 } | 6190 } |
6191 if (simulated_attrib_0) { | 6191 if (simulated_attrib_0) { |
6192 RestoreStateForAttrib(0); | 6192 RestoreStateForAttrib(0); |
(...skipping 1016 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7209 } | 7209 } |
7210 | 7210 |
7211 // Clear the buffer to 0 if no initial data was passed in. | 7211 // Clear the buffer to 0 if no initial data was passed in. |
7212 scoped_array<int8> zero; | 7212 scoped_array<int8> zero; |
7213 if (!data) { | 7213 if (!data) { |
7214 zero.reset(new int8[size]); | 7214 zero.reset(new int8[size]); |
7215 memset(zero.get(), 0, size); | 7215 memset(zero.get(), 0, size); |
7216 data = zero.get(); | 7216 data = zero.get(); |
7217 } | 7217 } |
7218 | 7218 |
| 7219 // TODO(gman): move to buffer manager BEFORE CHECK IN! |
7219 CopyRealGLErrorsToWrapper(); | 7220 CopyRealGLErrorsToWrapper(); |
7220 glBufferData(target, size, data, usage); | 7221 if (workarounds().use_client_side_arrays_for_stream_buffers && |
| 7222 usage == GL_STREAM_DRAW) { |
| 7223 glBufferData(target, 0, NULL, GL_STREAM_DRAW); |
| 7224 } else { |
| 7225 glBufferData(target, size, data, usage); |
| 7226 } |
7221 GLenum error = PeekGLError(); | 7227 GLenum error = PeekGLError(); |
7222 if (error == GL_NO_ERROR) { | 7228 if (error == GL_NO_ERROR) { |
7223 buffer_manager()->SetInfo(info, size, usage); | 7229 buffer_manager()->SetInfo(info, size, usage, data); |
7224 info->SetRange(0, size, data); | |
7225 } else { | 7230 } else { |
7226 buffer_manager()->SetInfo(info, 0, usage); | 7231 buffer_manager()->SetInfo(info, 0, usage, NULL); |
7227 } | 7232 } |
7228 } | 7233 } |
7229 | 7234 |
7230 error::Error GLES2DecoderImpl::HandleBufferData( | 7235 error::Error GLES2DecoderImpl::HandleBufferData( |
7231 uint32 immediate_data_size, const cmds::BufferData& c) { | 7236 uint32 immediate_data_size, const cmds::BufferData& c) { |
7232 GLenum target = static_cast<GLenum>(c.target); | 7237 GLenum target = static_cast<GLenum>(c.target); |
7233 GLsizeiptr size = static_cast<GLsizeiptr>(c.size); | 7238 GLsizeiptr size = static_cast<GLsizeiptr>(c.size); |
7234 uint32 data_shm_id = static_cast<uint32>(c.data_shm_id); | 7239 uint32 data_shm_id = static_cast<uint32>(c.data_shm_id); |
7235 uint32 data_shm_offset = static_cast<uint32>(c.data_shm_offset); | 7240 uint32 data_shm_offset = static_cast<uint32>(c.data_shm_offset); |
7236 GLenum usage = static_cast<GLenum>(c.usage); | 7241 GLenum usage = static_cast<GLenum>(c.usage); |
(...skipping 17 matching lines...) Expand all Loading... |
7254 if (!data) { | 7259 if (!data) { |
7255 return error::kOutOfBounds; | 7260 return error::kOutOfBounds; |
7256 } | 7261 } |
7257 GLenum usage = static_cast<GLenum>(c.usage); | 7262 GLenum usage = static_cast<GLenum>(c.usage); |
7258 DoBufferData(target, size, data, usage); | 7263 DoBufferData(target, size, data, usage); |
7259 return error::kNoError; | 7264 return error::kNoError; |
7260 } | 7265 } |
7261 | 7266 |
7262 void GLES2DecoderImpl::DoBufferSubData( | 7267 void GLES2DecoderImpl::DoBufferSubData( |
7263 GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) { | 7268 GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) { |
7264 Buffer* info = GetBufferInfoForTarget(target); | 7269 Buffer* buffer = GetBufferInfoForTarget(target); |
7265 if (!info) { | 7270 if (!buffer) { |
7266 SetGLError(GL_INVALID_VALUE, "glBufferSubData", "unknown buffer"); | 7271 SetGLError(GL_INVALID_VALUE, "glBufferSubData", "unknown buffer"); |
7267 return; | 7272 return; |
7268 } | 7273 } |
7269 if (!info->SetRange(offset, size, data)) { | 7274 if (!buffer->SetRange(offset, size, data)) { |
7270 SetGLError(GL_INVALID_VALUE, "glBufferSubData", "out of range"); | 7275 SetGLError(GL_INVALID_VALUE, "glBufferSubData", "out of range"); |
7271 return; | 7276 return; |
7272 } | 7277 } |
7273 glBufferSubData(target, offset, size, data); | 7278 |
| 7279 // TODO(gman): move to buffer manager BEFORE CHECKIN! |
| 7280 if (!(workarounds().use_client_side_arrays_for_stream_buffers && |
| 7281 buffer->usage() == GL_STREAM_DRAW)) { |
| 7282 glBufferSubData(target, offset, size, data); |
| 7283 } |
7274 } | 7284 } |
7275 | 7285 |
7276 bool GLES2DecoderImpl::ClearLevel( | 7286 bool GLES2DecoderImpl::ClearLevel( |
7277 unsigned service_id, | 7287 unsigned service_id, |
7278 unsigned bind_target, | 7288 unsigned bind_target, |
7279 unsigned target, | 7289 unsigned target, |
7280 int level, | 7290 int level, |
7281 unsigned format, | 7291 unsigned format, |
7282 unsigned type, | 7292 unsigned type, |
7283 int width, | 7293 int width, |
(...skipping 2873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10157 return error::kNoError; | 10167 return error::kNoError; |
10158 } | 10168 } |
10159 | 10169 |
10160 // Include the auto-generated part of this file. We split this because it means | 10170 // Include the auto-generated part of this file. We split this because it means |
10161 // we can easily edit the non-auto generated parts right here in this file | 10171 // we can easily edit the non-auto generated parts right here in this file |
10162 // instead of having to edit some template or the code generator. | 10172 // instead of having to edit some template or the code generator. |
10163 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10173 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
10164 | 10174 |
10165 } // namespace gles2 | 10175 } // namespace gles2 |
10166 } // namespace gpu | 10176 } // namespace gpu |
OLD | NEW |