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

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

Issue 278653002: Reland r264914 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 7 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
« no previous file with comments | « no previous file | gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1079 matching lines...) Expand 10 before | Expand all | Expand 10 after
1090 vertex_array_manager()->GetVertexAttribManager(client_id); 1090 vertex_array_manager()->GetVertexAttribManager(client_id);
1091 return info; 1091 return info;
1092 } 1092 }
1093 1093
1094 // Removes the vertex attrib manager for the given vertex array. 1094 // Removes the vertex attrib manager for the given vertex array.
1095 void RemoveVertexAttribManager(GLuint client_id) { 1095 void RemoveVertexAttribManager(GLuint client_id) {
1096 vertex_array_manager()->RemoveVertexAttribManager(client_id); 1096 vertex_array_manager()->RemoveVertexAttribManager(client_id);
1097 } 1097 }
1098 1098
1099 // Creates a vertex attrib manager for the given vertex array. 1099 // Creates a vertex attrib manager for the given vertex array.
1100 void CreateVertexAttribManager(GLuint client_id, GLuint service_id) { 1100 scoped_refptr<VertexAttribManager> CreateVertexAttribManager(
1101 vertex_array_manager()->CreateVertexAttribManager( 1101 GLuint client_id,
1102 client_id, service_id, group_->max_vertex_attribs()); 1102 GLuint service_id,
1103 bool client_visible) {
1104 return vertex_array_manager()->CreateVertexAttribManager(
1105 client_id, service_id, group_->max_vertex_attribs(), client_visible);
1103 } 1106 }
1104 1107
1105 void DoBindAttribLocation(GLuint client_id, GLuint index, const char* name); 1108 void DoBindAttribLocation(GLuint client_id, GLuint index, const char* name);
1106 void DoBindUniformLocationCHROMIUM( 1109 void DoBindUniformLocationCHROMIUM(
1107 GLuint client_id, GLint location, const char* name); 1110 GLuint client_id, GLint location, const char* name);
1108 1111
1109 error::Error GetAttribLocationHelper( 1112 error::Error GetAttribLocationHelper(
1110 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, 1113 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset,
1111 const std::string& name_str); 1114 const std::string& name_str);
1112 1115
(...skipping 1227 matching lines...) Expand 10 before | Expand all | Expand 10 after
2340 << "failed to initialize."; 2343 << "failed to initialize.";
2341 group_ = NULL; // Must not destroy ContextGroup if it is not initialized. 2344 group_ = NULL; // Must not destroy ContextGroup if it is not initialized.
2342 Destroy(true); 2345 Destroy(true);
2343 return false; 2346 return false;
2344 } 2347 }
2345 CHECK_GL_ERROR(); 2348 CHECK_GL_ERROR();
2346 2349
2347 disallowed_features_ = disallowed_features; 2350 disallowed_features_ = disallowed_features;
2348 2351
2349 state_.attrib_values.resize(group_->max_vertex_attribs()); 2352 state_.attrib_values.resize(group_->max_vertex_attribs());
2350 state_.default_vertex_attrib_manager = new VertexAttribManager(); 2353 vertex_array_manager_.reset(new VertexArrayManager());
2354
2355 GLuint default_vertex_attrib_service_id = 0;
2356 if (features().native_vertex_array_object) {
2357 glGenVertexArraysOES(1, &default_vertex_attrib_service_id);
2358 glBindVertexArrayOES(default_vertex_attrib_service_id);
2359 }
2360
2361 state_.default_vertex_attrib_manager =
2362 CreateVertexAttribManager(0, default_vertex_attrib_service_id, false);
2363
2351 state_.default_vertex_attrib_manager->Initialize( 2364 state_.default_vertex_attrib_manager->Initialize(
2352 group_->max_vertex_attribs(), 2365 group_->max_vertex_attribs(),
2353 feature_info_->workarounds().init_vertex_attributes); 2366 feature_info_->workarounds().init_vertex_attributes);
2354 2367
2355 // vertex_attrib_manager is set to default_vertex_attrib_manager by this call 2368 // vertex_attrib_manager is set to default_vertex_attrib_manager by this call
2356 DoBindVertexArrayOES(0); 2369 DoBindVertexArrayOES(0);
2357 2370
2358 query_manager_.reset(new QueryManager(this, feature_info_.get())); 2371 query_manager_.reset(new QueryManager(this, feature_info_.get()));
2359 vertex_array_manager_.reset(new VertexArrayManager());
2360 2372
2361 util_.set_num_compressed_texture_formats( 2373 util_.set_num_compressed_texture_formats(
2362 validators_->compressed_texture_format.GetValues().size()); 2374 validators_->compressed_texture_format.GetValues().size());
2363 2375
2364 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { 2376 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) {
2365 // We have to enable vertex array 0 on OpenGL or it won't render. Note that 2377 // We have to enable vertex array 0 on OpenGL or it won't render. Note that
2366 // OpenGL ES 2.0 does not have this issue. 2378 // OpenGL ES 2.0 does not have this issue.
2367 glEnableVertexAttribArray(0); 2379 glEnableVertexAttribArray(0);
2368 } 2380 }
2369 glGenBuffersARB(1, &attrib_0_buffer_id_); 2381 glGenBuffersARB(1, &attrib_0_buffer_id_);
(...skipping 7307 matching lines...) Expand 10 before | Expand all | Expand 10 after
9677 GLsizei n, const GLuint* client_ids) { 9689 GLsizei n, const GLuint* client_ids) {
9678 for (GLsizei ii = 0; ii < n; ++ii) { 9690 for (GLsizei ii = 0; ii < n; ++ii) {
9679 if (GetVertexAttribManager(client_ids[ii])) { 9691 if (GetVertexAttribManager(client_ids[ii])) {
9680 return false; 9692 return false;
9681 } 9693 }
9682 } 9694 }
9683 9695
9684 if (!features().native_vertex_array_object) { 9696 if (!features().native_vertex_array_object) {
9685 // Emulated VAO 9697 // Emulated VAO
9686 for (GLsizei ii = 0; ii < n; ++ii) { 9698 for (GLsizei ii = 0; ii < n; ++ii) {
9687 CreateVertexAttribManager(client_ids[ii], 0); 9699 CreateVertexAttribManager(client_ids[ii], 0, true);
9688 } 9700 }
9689 } else { 9701 } else {
9690 scoped_ptr<GLuint[]> service_ids(new GLuint[n]); 9702 scoped_ptr<GLuint[]> service_ids(new GLuint[n]);
9691 9703
9692 glGenVertexArraysOES(n, service_ids.get()); 9704 glGenVertexArraysOES(n, service_ids.get());
9693 for (GLsizei ii = 0; ii < n; ++ii) { 9705 for (GLsizei ii = 0; ii < n; ++ii) {
9694 CreateVertexAttribManager(client_ids[ii], service_ids[ii]); 9706 CreateVertexAttribManager(client_ids[ii], service_ids[ii], true);
9695 } 9707 }
9696 } 9708 }
9697 9709
9698 return true; 9710 return true;
9699 } 9711 }
9700 9712
9701 void GLES2DecoderImpl::DeleteVertexArraysOESHelper( 9713 void GLES2DecoderImpl::DeleteVertexArraysOESHelper(
9702 GLsizei n, const GLuint* client_ids) { 9714 GLsizei n, const GLuint* client_ids) {
9703 for (GLsizei ii = 0; ii < n; ++ii) { 9715 for (GLsizei ii = 0; ii < n; ++ii) {
9704 VertexAttribManager* vao = 9716 VertexAttribManager* vao =
9705 GetVertexAttribManager(client_ids[ii]); 9717 GetVertexAttribManager(client_ids[ii]);
9706 if (vao && !vao->IsDeleted()) { 9718 if (vao && !vao->IsDeleted()) {
9707 if (state_.vertex_attrib_manager.get() == vao) { 9719 if (state_.vertex_attrib_manager.get() == vao) {
9708 DoBindVertexArrayOES(0); 9720 DoBindVertexArrayOES(0);
9709 } 9721 }
9710 RemoveVertexAttribManager(client_ids[ii]); 9722 RemoveVertexAttribManager(client_ids[ii]);
9711 } 9723 }
9712 } 9724 }
9713 } 9725 }
9714 9726
9715 void GLES2DecoderImpl::DoBindVertexArrayOES(GLuint client_id) { 9727 void GLES2DecoderImpl::DoBindVertexArrayOES(GLuint client_id) {
9716 VertexAttribManager* vao = NULL; 9728 VertexAttribManager* vao = NULL;
9717 GLuint service_id = 0;
9718 if (client_id != 0) { 9729 if (client_id != 0) {
9719 vao = GetVertexAttribManager(client_id); 9730 vao = GetVertexAttribManager(client_id);
9720 if (!vao) { 9731 if (!vao) {
9721 // Unlike most Bind* methods, the spec explicitly states that VertexArray 9732 // Unlike most Bind* methods, the spec explicitly states that VertexArray
9722 // only allows names that have been previously generated. As such, we do 9733 // only allows names that have been previously generated. As such, we do
9723 // not generate new names here. 9734 // not generate new names here.
9724 LOCAL_SET_GL_ERROR( 9735 LOCAL_SET_GL_ERROR(
9725 GL_INVALID_OPERATION, 9736 GL_INVALID_OPERATION,
9726 "glBindVertexArrayOES", "bad vertex array id."); 9737 "glBindVertexArrayOES", "bad vertex array id.");
9727 current_decoder_error_ = error::kNoError; 9738 current_decoder_error_ = error::kNoError;
9728 return; 9739 return;
9729 } else {
9730 service_id = vao->service_id();
9731 } 9740 }
9732 } else { 9741 } else {
9733 vao = state_.default_vertex_attrib_manager.get(); 9742 vao = state_.default_vertex_attrib_manager.get();
9734 } 9743 }
9735 9744
9736 // Only set the VAO state if it's changed 9745 // Only set the VAO state if it's changed
9737 if (state_.vertex_attrib_manager.get() != vao) { 9746 if (state_.vertex_attrib_manager.get() != vao) {
9738 state_.vertex_attrib_manager = vao; 9747 state_.vertex_attrib_manager = vao;
9739 if (!features().native_vertex_array_object) { 9748 if (!features().native_vertex_array_object) {
9740 EmulateVertexArrayState(); 9749 EmulateVertexArrayState();
9741 } else { 9750 } else {
9751 GLuint service_id = vao->service_id();
9742 glBindVertexArrayOES(service_id); 9752 glBindVertexArrayOES(service_id);
9743 } 9753 }
9744 } 9754 }
9745 } 9755 }
9746 9756
9747 // Used when OES_vertex_array_object isn't natively supported 9757 // Used when OES_vertex_array_object isn't natively supported
9748 void GLES2DecoderImpl::EmulateVertexArrayState() { 9758 void GLES2DecoderImpl::EmulateVertexArrayState() {
9749 // Setup the Vertex attribute state 9759 // Setup the Vertex attribute state
9750 for (uint32 vv = 0; vv < group_->max_vertex_attribs(); ++vv) { 9760 for (uint32 vv = 0; vv < group_->max_vertex_attribs(); ++vv) {
9751 RestoreStateForAttrib(vv); 9761 RestoreStateForAttrib(vv);
(...skipping 1035 matching lines...) Expand 10 before | Expand all | Expand 10 after
10787 } 10797 }
10788 } 10798 }
10789 10799
10790 // Include the auto-generated part of this file. We split this because it means 10800 // Include the auto-generated part of this file. We split this because it means
10791 // we can easily edit the non-auto generated parts right here in this file 10801 // we can easily edit the non-auto generated parts right here in this file
10792 // instead of having to edit some template or the code generator. 10802 // instead of having to edit some template or the code generator.
10793 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 10803 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
10794 10804
10795 } // namespace gles2 10805 } // namespace gles2
10796 } // namespace gpu 10806 } // namespace gpu
OLDNEW
« no previous file with comments | « no previous file | gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698