Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 12378034: Use client side arrays for GL_STREAM_DRAW attributes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix copy bug Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698