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

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

Issue 1922633002: Implement TransformFeedbackManager in GPU command buffer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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
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 <limits.h> 7 #include <limits.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 #include <stdio.h> 10 #include <stdio.h>
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 #include "gpu/command_buffer/service/mailbox_manager.h" 49 #include "gpu/command_buffer/service/mailbox_manager.h"
50 #include "gpu/command_buffer/service/memory_tracking.h" 50 #include "gpu/command_buffer/service/memory_tracking.h"
51 #include "gpu/command_buffer/service/path_manager.h" 51 #include "gpu/command_buffer/service/path_manager.h"
52 #include "gpu/command_buffer/service/program_manager.h" 52 #include "gpu/command_buffer/service/program_manager.h"
53 #include "gpu/command_buffer/service/query_manager.h" 53 #include "gpu/command_buffer/service/query_manager.h"
54 #include "gpu/command_buffer/service/renderbuffer_manager.h" 54 #include "gpu/command_buffer/service/renderbuffer_manager.h"
55 #include "gpu/command_buffer/service/sampler_manager.h" 55 #include "gpu/command_buffer/service/sampler_manager.h"
56 #include "gpu/command_buffer/service/shader_manager.h" 56 #include "gpu/command_buffer/service/shader_manager.h"
57 #include "gpu/command_buffer/service/shader_translator.h" 57 #include "gpu/command_buffer/service/shader_translator.h"
58 #include "gpu/command_buffer/service/texture_manager.h" 58 #include "gpu/command_buffer/service/texture_manager.h"
59 #include "gpu/command_buffer/service/transform_feedback_manager.h"
59 #include "gpu/command_buffer/service/vertex_array_manager.h" 60 #include "gpu/command_buffer/service/vertex_array_manager.h"
60 #include "gpu/command_buffer/service/vertex_attrib_manager.h" 61 #include "gpu/command_buffer/service/vertex_attrib_manager.h"
61 #include "third_party/smhasher/src/City.h" 62 #include "third_party/smhasher/src/City.h"
62 #include "ui/gfx/geometry/point.h" 63 #include "ui/gfx/geometry/point.h"
63 #include "ui/gfx/geometry/rect.h" 64 #include "ui/gfx/geometry/rect.h"
64 #include "ui/gfx/geometry/size.h" 65 #include "ui/gfx/geometry/size.h"
65 #include "ui/gfx/overlay_transform.h" 66 #include "ui/gfx/overlay_transform.h"
66 #include "ui/gfx/transform.h" 67 #include "ui/gfx/transform.h"
67 #include "ui/gl/gl_bindings.h" 68 #include "ui/gl/gl_bindings.h"
68 #include "ui/gl/gl_context.h" 69 #include "ui/gl/gl_context.h"
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after
744 bool GenRenderbuffersHelper(GLsizei n, const GLuint* client_ids); 745 bool GenRenderbuffersHelper(GLsizei n, const GLuint* client_ids);
745 void DeleteRenderbuffersHelper(GLsizei n, const GLuint* client_ids); 746 void DeleteRenderbuffersHelper(GLsizei n, const GLuint* client_ids);
746 bool GenQueriesEXTHelper(GLsizei n, const GLuint* client_ids); 747 bool GenQueriesEXTHelper(GLsizei n, const GLuint* client_ids);
747 void DeleteQueriesEXTHelper(GLsizei n, const GLuint* client_ids); 748 void DeleteQueriesEXTHelper(GLsizei n, const GLuint* client_ids);
748 bool GenVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); 749 bool GenVertexArraysOESHelper(GLsizei n, const GLuint* client_ids);
749 void DeleteVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); 750 void DeleteVertexArraysOESHelper(GLsizei n, const GLuint* client_ids);
750 bool GenPathsCHROMIUMHelper(GLuint first_client_id, GLsizei range); 751 bool GenPathsCHROMIUMHelper(GLuint first_client_id, GLsizei range);
751 bool DeletePathsCHROMIUMHelper(GLuint first_client_id, GLsizei range); 752 bool DeletePathsCHROMIUMHelper(GLuint first_client_id, GLsizei range);
752 bool GenSamplersHelper(GLsizei n, const GLuint* client_ids); 753 bool GenSamplersHelper(GLsizei n, const GLuint* client_ids);
753 void DeleteSamplersHelper(GLsizei n, const GLuint* client_ids); 754 void DeleteSamplersHelper(GLsizei n, const GLuint* client_ids);
755 bool GenTransformFeedbacksHelper(GLsizei n, const GLuint* client_ids);
756 void DeleteTransformFeedbacksHelper(GLsizei n, const GLuint* client_ids);
754 757
755 // Workarounds 758 // Workarounds
756 void OnFboChanged() const; 759 void OnFboChanged() const;
757 void OnUseFramebuffer() const; 760 void OnUseFramebuffer() const;
758 761
759 error::ContextLostReason GetContextLostReasonFromResetStatus( 762 error::ContextLostReason GetContextLostReasonFromResetStatus(
760 GLenum reset_status) const; 763 GLenum reset_status) const;
761 764
762 // TODO(gman): Cache these pointers? 765 // TODO(gman): Cache these pointers?
763 BufferManager* buffer_manager() { 766 BufferManager* buffer_manager() {
764 return group_->buffer_manager(); 767 return group_->buffer_manager();
765 } 768 }
766 769
767 RenderbufferManager* renderbuffer_manager() { 770 RenderbufferManager* renderbuffer_manager() {
768 return group_->renderbuffer_manager(); 771 return group_->renderbuffer_manager();
769 } 772 }
770 773
771 FramebufferManager* framebuffer_manager() { 774 FramebufferManager* framebuffer_manager() {
772 return group_->framebuffer_manager(); 775 return group_->framebuffer_manager();
773 } 776 }
774 777
775 ProgramManager* program_manager() { 778 ProgramManager* program_manager() {
776 return group_->program_manager(); 779 return group_->program_manager();
777 } 780 }
778 781
779 SamplerManager* sampler_manager() { 782 SamplerManager* sampler_manager() {
780 return group_->sampler_manager(); 783 return group_->sampler_manager();
781 } 784 }
782 785
786 TransformFeedbackManager* transform_feedback_manager() {
787 return group_->transform_feedback_manager();
788 }
789
783 ShaderManager* shader_manager() { 790 ShaderManager* shader_manager() {
784 return group_->shader_manager(); 791 return group_->shader_manager();
785 } 792 }
786 793
787 ShaderTranslatorCache* shader_translator_cache() { 794 ShaderTranslatorCache* shader_translator_cache() {
788 return group_->shader_translator_cache(); 795 return group_->shader_translator_cache();
789 } 796 }
790 797
791 const TextureManager* texture_manager() const { 798 const TextureManager* texture_manager() const {
792 return group_->texture_manager(); 799 return group_->texture_manager();
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
847 // Gets the sampler info for the given sampler. Returns NULL if none exists. 854 // Gets the sampler info for the given sampler. Returns NULL if none exists.
848 Sampler* GetSampler(GLuint client_id) { 855 Sampler* GetSampler(GLuint client_id) {
849 return sampler_manager()->GetSampler(client_id); 856 return sampler_manager()->GetSampler(client_id);
850 } 857 }
851 858
852 // Deletes the sampler info for the given sampler. 859 // Deletes the sampler info for the given sampler.
853 void RemoveSampler(GLuint client_id) { 860 void RemoveSampler(GLuint client_id) {
854 sampler_manager()->RemoveSampler(client_id); 861 sampler_manager()->RemoveSampler(client_id);
855 } 862 }
856 863
864 // Creates a TransformFeedback for the given transformfeedback.
865 TransformFeedback* CreateTransformFeedback(
866 GLuint client_id, GLuint service_id) {
867 return transform_feedback_manager()->CreateTransformFeedback(
868 client_id, service_id);
869 }
870
871 // Gets the TransformFeedback info for the given transformfeedback.
872 // Returns nullptr if none exists.
873 TransformFeedback* GetTransformFeedback(GLuint client_id) {
874 return transform_feedback_manager()->GetTransformFeedback(client_id);
875 }
876
877 // Deletes the TransformFeedback info for the given transformfeedback.
878 void RemoveTransformFeedback(GLuint client_id) {
879 transform_feedback_manager()->RemoveTransformFeedback(client_id);
880 }
881
857 // Get the size (in pixels) of the currently bound frame buffer (either FBO 882 // Get the size (in pixels) of the currently bound frame buffer (either FBO
858 // or regular back buffer). 883 // or regular back buffer).
859 gfx::Size GetBoundReadFrameBufferSize(); 884 gfx::Size GetBoundReadFrameBufferSize();
860 885
861 // Get the format/type of the currently bound frame buffer (either FBO or 886 // Get the format/type of the currently bound frame buffer (either FBO or
862 // regular back buffer). 887 // regular back buffer).
863 // If the color image is a renderbuffer, returns 0 for type. 888 // If the color image is a renderbuffer, returns 0 for type.
864 GLenum GetBoundReadFrameBufferTextureType(); 889 GLenum GetBoundReadFrameBufferTextureType();
865 GLenum GetBoundReadFrameBufferInternalFormat(); 890 GLenum GetBoundReadFrameBufferInternalFormat();
866 891
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
1364 1389
1365 // Wrapper for glBindRenderbuffer since we need to track the current targets. 1390 // Wrapper for glBindRenderbuffer since we need to track the current targets.
1366 void DoBindRenderbuffer(GLenum target, GLuint renderbuffer); 1391 void DoBindRenderbuffer(GLenum target, GLuint renderbuffer);
1367 1392
1368 // Wrapper for glBindTexture since we need to track the current targets. 1393 // Wrapper for glBindTexture since we need to track the current targets.
1369 void DoBindTexture(GLenum target, GLuint texture); 1394 void DoBindTexture(GLenum target, GLuint texture);
1370 1395
1371 // Wrapper for glBindSampler since we need to track the current targets. 1396 // Wrapper for glBindSampler since we need to track the current targets.
1372 void DoBindSampler(GLuint unit, GLuint sampler); 1397 void DoBindSampler(GLuint unit, GLuint sampler);
1373 1398
1399 // Wrapper for glBindTransformFeedback since we need to emulate ES3 behaviors
1400 // for BindBufferRange on Desktop GL lower than 4.2.
1401 void DoBindTransformFeedback(GLenum target, GLuint transform_feedback);
1402
1403 // Wrapper for glBeginTransformFeedback.
1404 void DoBeginTransformFeedback(GLenum primitive_mode);
1405
1406 // Wrapper for glEndTransformFeedback.
1407 void DoEndTransformFeedback();
1408
1409 // Wrapper for glPauseTransformFeedback.
1410 void DoPauseTransformFeedback();
1411
1412 // Wrapper for glResumeTransformFeedback.
1413 void DoResumeTransformFeedback();
1414
1374 // Wrapper for glBindVertexArrayOES 1415 // Wrapper for glBindVertexArrayOES
1375 void DoBindVertexArrayOES(GLuint array); 1416 void DoBindVertexArrayOES(GLuint array);
1376 void EmulateVertexArrayState(); 1417 void EmulateVertexArrayState();
1377 1418
1378 // Wrapper for glBlitFramebufferCHROMIUM. 1419 // Wrapper for glBlitFramebufferCHROMIUM.
1379 void DoBlitFramebufferCHROMIUM( 1420 void DoBlitFramebufferCHROMIUM(
1380 GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, 1421 GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
1381 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, 1422 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
1382 GLbitfield mask, GLenum filter); 1423 GLbitfield mask, GLenum filter);
1383 1424
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
1539 1580
1540 // Wrappers for glIsXXX functions. 1581 // Wrappers for glIsXXX functions.
1541 bool DoIsEnabled(GLenum cap); 1582 bool DoIsEnabled(GLenum cap);
1542 bool DoIsBuffer(GLuint client_id); 1583 bool DoIsBuffer(GLuint client_id);
1543 bool DoIsFramebuffer(GLuint client_id); 1584 bool DoIsFramebuffer(GLuint client_id);
1544 bool DoIsProgram(GLuint client_id); 1585 bool DoIsProgram(GLuint client_id);
1545 bool DoIsRenderbuffer(GLuint client_id); 1586 bool DoIsRenderbuffer(GLuint client_id);
1546 bool DoIsShader(GLuint client_id); 1587 bool DoIsShader(GLuint client_id);
1547 bool DoIsTexture(GLuint client_id); 1588 bool DoIsTexture(GLuint client_id);
1548 bool DoIsSampler(GLuint client_id); 1589 bool DoIsSampler(GLuint client_id);
1590 bool DoIsTransformFeedback(GLuint client_id);
1549 bool DoIsVertexArrayOES(GLuint client_id); 1591 bool DoIsVertexArrayOES(GLuint client_id);
1550 bool DoIsPathCHROMIUM(GLuint client_id); 1592 bool DoIsPathCHROMIUM(GLuint client_id);
1551 1593
1552 void DoLineWidth(GLfloat width); 1594 void DoLineWidth(GLfloat width);
1553 1595
1554 // Wrapper for glLinkProgram 1596 // Wrapper for glLinkProgram
1555 void DoLinkProgram(GLuint program); 1597 void DoLinkProgram(GLuint program);
1556 1598
1557 // Wrapper for glReadBuffer 1599 // Wrapper for glReadBuffer
1558 void DoReadBuffer(GLenum src); 1600 void DoReadBuffer(GLenum src);
(...skipping 1164 matching lines...) Expand 10 before | Expand all | Expand 10 after
2723 LOG(ERROR) << "Underlying driver does not support ES3."; 2765 LOG(ERROR) << "Underlying driver does not support ES3.";
2724 Destroy(true); 2766 Destroy(true);
2725 return false; 2767 return false;
2726 } 2768 }
2727 feature_info_->EnableES3Validators(); 2769 feature_info_->EnableES3Validators();
2728 set_unsafe_es3_apis_enabled(true); 2770 set_unsafe_es3_apis_enabled(true);
2729 2771
2730 frag_depth_explicitly_enabled_ = true; 2772 frag_depth_explicitly_enabled_ = true;
2731 draw_buffers_explicitly_enabled_ = true; 2773 draw_buffers_explicitly_enabled_ = true;
2732 // TODO(zmo): Look into shader_texture_lod_explicitly_enabled_ situation. 2774 // TODO(zmo): Look into shader_texture_lod_explicitly_enabled_ situation.
2775
2776 // Create a fake default transform feedback and bind to it.
2777 GLuint default_transform_feedback = 0;
2778 glGenTransformFeedbacks(1, &default_transform_feedback);
2779 state_.default_transform_feedback = new TransformFeedback(
2780 group_->transform_feedback_manager(), default_transform_feedback);
2781 glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, default_transform_feedback);
2782 state_.bound_transform_feedback = state_.default_transform_feedback.get();
2733 } 2783 }
2734 2784
2735 state_.attrib_values.resize(group_->max_vertex_attribs()); 2785 state_.attrib_values.resize(group_->max_vertex_attribs());
2736 vertex_array_manager_.reset(new VertexArrayManager()); 2786 vertex_array_manager_.reset(new VertexArrayManager());
2737 2787
2738 GLuint default_vertex_attrib_service_id = 0; 2788 GLuint default_vertex_attrib_service_id = 0;
2739 if (features().native_vertex_array_object) { 2789 if (features().native_vertex_array_object) {
2740 glGenVertexArraysOES(1, &default_vertex_attrib_service_id); 2790 glGenVertexArraysOES(1, &default_vertex_attrib_service_id);
2741 glBindVertexArrayOES(default_vertex_attrib_service_id); 2791 glBindVertexArrayOES(default_vertex_attrib_service_id);
2742 } 2792 }
(...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after
3466 } 3516 }
3467 } 3517 }
3468 std::unique_ptr<GLuint[]> service_ids(new GLuint[n]); 3518 std::unique_ptr<GLuint[]> service_ids(new GLuint[n]);
3469 glGenSamplers(n, service_ids.get()); 3519 glGenSamplers(n, service_ids.get());
3470 for (GLsizei ii = 0; ii < n; ++ii) { 3520 for (GLsizei ii = 0; ii < n; ++ii) {
3471 CreateSampler(client_ids[ii], service_ids[ii]); 3521 CreateSampler(client_ids[ii], service_ids[ii]);
3472 } 3522 }
3473 return true; 3523 return true;
3474 } 3524 }
3475 3525
3526 bool GLES2DecoderImpl::GenTransformFeedbacksHelper(
3527 GLsizei n, const GLuint* client_ids) {
3528 for (GLsizei ii = 0; ii < n; ++ii) {
3529 if (GetTransformFeedback(client_ids[ii])) {
3530 return false;
3531 }
3532 }
3533 std::unique_ptr<GLuint[]> service_ids(new GLuint[n]);
3534 glGenTransformFeedbacks(n, service_ids.get());
3535 for (GLsizei ii = 0; ii < n; ++ii) {
3536 CreateTransformFeedback(client_ids[ii], service_ids[ii]);
3537 }
3538 return true;
3539 }
3540
3476 bool GLES2DecoderImpl::GenPathsCHROMIUMHelper(GLuint first_client_id, 3541 bool GLES2DecoderImpl::GenPathsCHROMIUMHelper(GLuint first_client_id,
3477 GLsizei range) { 3542 GLsizei range) {
3478 GLuint last_client_id; 3543 GLuint last_client_id;
3479 if (!SafeAddUint32(first_client_id, range - 1, &last_client_id)) 3544 if (!SafeAddUint32(first_client_id, range - 1, &last_client_id))
3480 return false; 3545 return false;
3481 3546
3482 if (path_manager()->HasPathsInRange(first_client_id, last_client_id)) 3547 if (path_manager()->HasPathsInRange(first_client_id, last_client_id))
3483 return false; 3548 return false;
3484 3549
3485 GLuint first_service_id = glGenPathsNV(range); 3550 GLuint first_service_id = glGenPathsNV(range);
(...skipping 23 matching lines...) Expand all
3509 return true; 3574 return true;
3510 } 3575 }
3511 3576
3512 void GLES2DecoderImpl::DeleteBuffersHelper( 3577 void GLES2DecoderImpl::DeleteBuffersHelper(
3513 GLsizei n, const GLuint* client_ids) { 3578 GLsizei n, const GLuint* client_ids) {
3514 for (GLsizei ii = 0; ii < n; ++ii) { 3579 for (GLsizei ii = 0; ii < n; ++ii) {
3515 Buffer* buffer = GetBuffer(client_ids[ii]); 3580 Buffer* buffer = GetBuffer(client_ids[ii]);
3516 if (buffer && !buffer->IsDeleted()) { 3581 if (buffer && !buffer->IsDeleted()) {
3517 buffer->RemoveMappedRange(); 3582 buffer->RemoveMappedRange();
3518 state_.RemoveBoundBuffer(buffer); 3583 state_.RemoveBoundBuffer(buffer);
3584 if (transform_feedback_manager()) {
piman 2016/04/28 01:38:47 nit: transform_feedback_manager() is always non-nu
Zhenyao Mo 2016/04/29 21:07:54 Done.
3585 transform_feedback_manager()->RemoveBoundBuffer(buffer);
3586 }
3519 RemoveBuffer(client_ids[ii]); 3587 RemoveBuffer(client_ids[ii]);
3520 } 3588 }
3521 } 3589 }
3522 } 3590 }
3523 3591
3524 void GLES2DecoderImpl::DeleteFramebuffersHelper( 3592 void GLES2DecoderImpl::DeleteFramebuffersHelper(
3525 GLsizei n, const GLuint* client_ids) { 3593 GLsizei n, const GLuint* client_ids) {
3526 bool supports_separate_framebuffer_binds = 3594 bool supports_separate_framebuffer_binds =
3527 features().chromium_framebuffer_multisample; 3595 features().chromium_framebuffer_multisample;
3528 3596
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
3634 Sampler* sampler = GetSampler(client_ids[ii]); 3702 Sampler* sampler = GetSampler(client_ids[ii]);
3635 if (sampler && !sampler->IsDeleted()) { 3703 if (sampler && !sampler->IsDeleted()) {
3636 // Unbind from current sampler units. 3704 // Unbind from current sampler units.
3637 state_.UnbindSampler(sampler); 3705 state_.UnbindSampler(sampler);
3638 3706
3639 RemoveSampler(client_ids[ii]); 3707 RemoveSampler(client_ids[ii]);
3640 } 3708 }
3641 } 3709 }
3642 } 3710 }
3643 3711
3644 // } // anonymous namespace 3712 void GLES2DecoderImpl::DeleteTransformFeedbacksHelper(
3713 GLsizei n, const GLuint* client_ids) {
3714 for (GLsizei ii = 0; ii < n; ++ii) {
3715 TransformFeedback* transform_feedback = GetTransformFeedback(
3716 client_ids[ii]);
3717 if (transform_feedback && !transform_feedback->deleted()) {
piman 2016/04/28 01:38:47 nit: because the transform feedback objects are no
Zhenyao Mo 2016/04/29 21:07:54 Done.
3718 if (state_.bound_transform_feedback.get() == transform_feedback) {
3719 // Bind to the default transform feedback.
3720 DCHECK(state_.default_transform_feedback.get());
3721 state_.default_transform_feedback->DoBindTransformFeedback(
3722 feature_info_->gl_version_info(), GL_TRANSFORM_FEEDBACK);
3723 state_.bound_transform_feedback =
3724 state_.default_transform_feedback.get();
3725 }
3726
3727 RemoveTransformFeedback(client_ids[ii]);
3728 }
3729 }
3730 }
3645 3731
3646 bool GLES2DecoderImpl::MakeCurrent() { 3732 bool GLES2DecoderImpl::MakeCurrent() {
3647 if (!context_.get()) 3733 if (!context_.get())
3648 return false; 3734 return false;
3649 3735
3650 if (WasContextLost()) { 3736 if (WasContextLost()) {
3651 LOG(ERROR) << " GLES2DecoderImpl: Trying to make lost context current."; 3737 LOG(ERROR) << " GLES2DecoderImpl: Trying to make lost context current.";
3652 return false; 3738 return false;
3653 } 3739 }
3654 3740
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
4035 } 4121 }
4036 4122
4037 void GLES2DecoderImpl::AddProcessingCommandsTime(base::TimeDelta time) { 4123 void GLES2DecoderImpl::AddProcessingCommandsTime(base::TimeDelta time) {
4038 total_processing_commands_time_ += time; 4124 total_processing_commands_time_ += time;
4039 } 4125 }
4040 4126
4041 void GLES2DecoderImpl::Destroy(bool have_context) { 4127 void GLES2DecoderImpl::Destroy(bool have_context) {
4042 if (!initialized()) 4128 if (!initialized())
4043 return; 4129 return;
4044 4130
4045 DCHECK(!have_context || context_->IsCurrent(NULL)); 4131 DCHECK(!have_context || context_->IsCurrent(nullptr));
4046 4132
4047 // Unbind everything. 4133 // Unbind everything.
4048 state_.vertex_attrib_manager = NULL; 4134 state_.vertex_attrib_manager = nullptr;
4049 state_.default_vertex_attrib_manager = NULL; 4135 state_.default_vertex_attrib_manager = nullptr;
4050 state_.texture_units.clear(); 4136 state_.texture_units.clear();
4051 state_.sampler_units.clear(); 4137 state_.sampler_units.clear();
4052 state_.bound_array_buffer = NULL; 4138 state_.bound_array_buffer = nullptr;
4053 state_.bound_copy_read_buffer = NULL; 4139 state_.bound_copy_read_buffer = nullptr;
4054 state_.bound_copy_write_buffer = NULL; 4140 state_.bound_copy_write_buffer = nullptr;
4055 state_.bound_pixel_pack_buffer = NULL; 4141 state_.bound_pixel_pack_buffer = nullptr;
4056 state_.bound_pixel_unpack_buffer = NULL; 4142 state_.bound_pixel_unpack_buffer = nullptr;
4057 state_.bound_transform_feedback_buffer = NULL; 4143 state_.bound_transform_feedback_buffer = nullptr;
4058 state_.bound_uniform_buffer = NULL; 4144 state_.bound_uniform_buffer = nullptr;
4059 framebuffer_state_.bound_read_framebuffer = NULL; 4145 framebuffer_state_.bound_read_framebuffer = nullptr;
4060 framebuffer_state_.bound_draw_framebuffer = NULL; 4146 framebuffer_state_.bound_draw_framebuffer = nullptr;
4061 state_.bound_renderbuffer = NULL; 4147 state_.bound_renderbuffer = nullptr;
4148 state_.bound_transform_feedback = nullptr;
4149 state_.default_transform_feedback = nullptr;
4062 4150
4063 if (offscreen_saved_color_texture_info_.get()) { 4151 if (offscreen_saved_color_texture_info_.get()) {
4064 DCHECK(offscreen_target_color_texture_); 4152 DCHECK(offscreen_target_color_texture_);
4065 DCHECK_EQ(offscreen_saved_color_texture_info_->service_id(), 4153 DCHECK_EQ(offscreen_saved_color_texture_info_->service_id(),
4066 offscreen_saved_color_texture_->id()); 4154 offscreen_saved_color_texture_->id());
4067 offscreen_saved_color_texture_->Invalidate(); 4155 offscreen_saved_color_texture_->Invalidate();
4068 offscreen_saved_color_texture_info_ = NULL; 4156 offscreen_saved_color_texture_info_ = NULL;
4069 } 4157 }
4070 if (have_context) { 4158 if (have_context) {
4071 if (copy_texture_CHROMIUM_.get()) { 4159 if (copy_texture_CHROMIUM_.get()) {
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after
4588 GLenum target, GLuint index, GLuint client_id, 4676 GLenum target, GLuint index, GLuint client_id,
4589 GLintptr offset, GLsizeiptr size, 4677 GLintptr offset, GLsizeiptr size,
4590 BindIndexedBufferFunctionType function_type, const char* function_name) { 4678 BindIndexedBufferFunctionType function_type, const char* function_name) {
4591 switch (target) { 4679 switch (target) {
4592 case GL_TRANSFORM_FEEDBACK_BUFFER: { 4680 case GL_TRANSFORM_FEEDBACK_BUFFER: {
4593 if (index >= group_->max_transform_feedback_separate_attribs()) { 4681 if (index >= group_->max_transform_feedback_separate_attribs()) {
4594 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, 4682 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name,
4595 "index out of range"); 4683 "index out of range");
4596 return; 4684 return;
4597 } 4685 }
4598 // TODO(zmo): Check transform feedback isn't currently active. 4686 DCHECK(state_.bound_transform_feedback.get());
4687 if (state_.bound_transform_feedback->active()) {
4688 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
4689 "bound transform feedback is active");
4690 return;
4691 }
4599 break; 4692 break;
4600 } 4693 }
4601 case GL_UNIFORM_BUFFER: { 4694 case GL_UNIFORM_BUFFER: {
4602 if (index >= group_->max_uniform_buffer_bindings()) { 4695 if (index >= group_->max_uniform_buffer_bindings()) {
4603 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, 4696 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name,
4604 "index out of range"); 4697 "index out of range");
4605 return; 4698 return;
4606 } 4699 }
4607 break; 4700 break;
4608 } 4701 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
4659 // It's a new id so make a buffer for it. 4752 // It's a new id so make a buffer for it.
4660 glGenBuffersARB(1, &service_id); 4753 glGenBuffersARB(1, &service_id);
4661 CreateBuffer(client_id, service_id); 4754 CreateBuffer(client_id, service_id);
4662 buffer = GetBuffer(client_id); 4755 buffer = GetBuffer(client_id);
4663 DCHECK(buffer); 4756 DCHECK(buffer);
4664 } 4757 }
4665 service_id = buffer->service_id(); 4758 service_id = buffer->service_id();
4666 } 4759 }
4667 LogClientServiceForInfo(buffer, client_id, function_name); 4760 LogClientServiceForInfo(buffer, client_id, function_name);
4668 4761
4669 switch (function_type) { 4762 switch (target) {
4670 case kBindBufferBase: 4763 case GL_TRANSFORM_FEEDBACK_BUFFER:
4671 glBindBufferBase(target, index, service_id); 4764 DCHECK(state_.bound_transform_feedback.get());
4765 switch (function_type) {
4766 case kBindBufferBase:
4767 state_.bound_transform_feedback->DoBindBufferBase(
4768 target, index, buffer);
4769 break;
4770 case kBindBufferRange:
4771 state_.bound_transform_feedback->DoBindBufferRange(
4772 feature_info_->gl_version_info(),
4773 target, index, buffer, offset, size);
4774 break;
4775 }
4672 break; 4776 break;
4673 case kBindBufferRange: 4777 case GL_UNIFORM_BUFFER:
4674 // TODO(zmo): On Desktop GL 4.1 or lower, clamp the offset/size not to 4778 // TODO(zmo): emulate Desktop GL 4.1 or lower behavior and keep track of
4675 // exceed the size of the buffer. crbug.com/604436. 4779 // indexed buffer bindings.
4676 glBindBufferRange(target, index, service_id, offset, size); 4780 switch (function_type) {
4781 case kBindBufferBase:
4782 glBindBufferBase(target, index, service_id);
4783 break;
4784 case kBindBufferRange:
4785 glBindBufferRange(target, index, service_id, offset, size);
4786 break;
4787 }
4788 break;
4789 default:
4790 NOTREACHED();
4677 break; 4791 break;
4678 } 4792 }
4679 // TODO(kbr): track indexed bound buffers.
4680 } 4793 }
4681 4794
4682 void GLES2DecoderImpl::DoBindBufferBase(GLenum target, GLuint index, 4795 void GLES2DecoderImpl::DoBindBufferBase(GLenum target, GLuint index,
4683 GLuint client_id) { 4796 GLuint client_id) {
4684 BindIndexedBufferImpl(target, index, client_id, 0, 0, 4797 BindIndexedBufferImpl(target, index, client_id, 0, 0,
4685 kBindBufferBase, "glBindBufferBase"); 4798 kBindBufferBase, "glBindBufferBase");
4686 } 4799 }
4687 4800
4688 void GLES2DecoderImpl::DoBindBufferRange(GLenum target, GLuint index, 4801 void GLES2DecoderImpl::DoBindBufferRange(GLenum target, GLuint index,
4689 GLuint client_id, 4802 GLuint client_id,
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
5003 if (sampler) { 5116 if (sampler) {
5004 LogClientServiceForInfo(sampler, client_id, "glBindSampler"); 5117 LogClientServiceForInfo(sampler, client_id, "glBindSampler");
5005 glBindSampler(unit, sampler->service_id()); 5118 glBindSampler(unit, sampler->service_id());
5006 } else { 5119 } else {
5007 glBindSampler(unit, 0); 5120 glBindSampler(unit, 0);
5008 } 5121 }
5009 5122
5010 state_.sampler_units[unit] = sampler; 5123 state_.sampler_units[unit] = sampler;
5011 } 5124 }
5012 5125
5126 void GLES2DecoderImpl::DoBindTransformFeedback(
5127 GLenum target, GLuint client_id) {
5128 const char* function_name = "glBindTransformFeedback";
5129 if (!validators_->transform_feedback_bind_target.IsValid(target)) {
5130 LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, target, "target");
5131 return;
5132 }
piman 2016/04/28 01:38:47 If the currently bound transform feedback is activ
Zhenyao Mo 2016/04/29 21:07:54 Done.
5133
5134 TransformFeedback* transform_feedback = nullptr;
5135 if (client_id != 0) {
5136 transform_feedback = GetTransformFeedback(client_id);
5137 if (!transform_feedback) {
5138 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
5139 "id not generated by glGenTransformFeedbacks");
5140 return;
5141 }
5142 } else {
5143 transform_feedback = state_.default_transform_feedback.get();
5144 }
5145 DCHECK(transform_feedback);
5146 LogClientServiceForInfo(transform_feedback, client_id, function_name);
5147 transform_feedback->DoBindTransformFeedback(
5148 feature_info_->gl_version_info(), target);
5149 state_.bound_transform_feedback = transform_feedback;
5150 }
5151
5152 void GLES2DecoderImpl::DoBeginTransformFeedback(GLenum primitive_mode) {
5153 const char* function_name = "glBeginTransformFeedback";
5154 DCHECK(state_.bound_transform_feedback.get());
5155 if (!validators_->transform_feedback_primitive_mode.IsValid(primitive_mode)) {
5156 LOCAL_SET_GL_ERROR_INVALID_ENUM(
5157 function_name, primitive_mode, "primitiveMode");
5158 return;
5159 }
5160 if (state_.bound_transform_feedback->active()) {
5161 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
5162 "transform feedback is already active");
5163 return;
5164 }
5165 state_.bound_transform_feedback->DoBeginTransformFeedback(primitive_mode);
5166 }
5167
5168 void GLES2DecoderImpl::DoEndTransformFeedback() {
5169 const char* function_name = "glEndTransformFeedback";
5170 DCHECK(state_.bound_transform_feedback.get());
5171 if (!state_.bound_transform_feedback->active()) {
5172 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
5173 "transform feedback is not active");
5174 return;
5175 }
5176 // TODO(zmo): Validate binding points.
5177 state_.bound_transform_feedback->DoEndTransformFeedback();
5178 }
5179
5180 void GLES2DecoderImpl::DoPauseTransformFeedback() {
5181 DCHECK(state_.bound_transform_feedback.get());
5182 if (!state_.bound_transform_feedback->active() ||
5183 state_.bound_transform_feedback->paused()) {
5184 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glPauseTransformFeedback",
5185 "transform feedback is not active or already paused");
5186 return;
5187 }
5188 state_.bound_transform_feedback->DoPauseTransformFeedback();
5189 }
5190
5191 void GLES2DecoderImpl::DoResumeTransformFeedback() {
5192 DCHECK(state_.bound_transform_feedback.get());
5193 if (!state_.bound_transform_feedback->active() ||
5194 !state_.bound_transform_feedback->paused()) {
5195 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glResumeTransformFeedback",
5196 "transform feedback is not active or not paused");
5197 return;
5198 }
5199 state_.bound_transform_feedback->DoResumeTransformFeedback();
5200 }
5201
5013 void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) { 5202 void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) {
5014 if (state_.vertex_attrib_manager->Enable(index, false)) { 5203 if (state_.vertex_attrib_manager->Enable(index, false)) {
5015 if (index != 0 || feature_info_->gl_version_info().BehavesLikeGLES()) { 5204 if (index != 0 || feature_info_->gl_version_info().BehavesLikeGLES()) {
5016 glDisableVertexAttribArray(index); 5205 glDisableVertexAttribArray(index);
5017 } 5206 }
5018 } else { 5207 } else {
5019 LOCAL_SET_GL_ERROR( 5208 LOCAL_SET_GL_ERROR(
5020 GL_INVALID_VALUE, 5209 GL_INVALID_VALUE,
5021 "glDisableVertexAttribArray", "index out of range"); 5210 "glDisableVertexAttribArray", "index out of range");
5022 } 5211 }
(...skipping 3680 matching lines...) Expand 10 before | Expand all | Expand 10 after
8703 bool GLES2DecoderImpl::DoIsTexture(GLuint client_id) { 8892 bool GLES2DecoderImpl::DoIsTexture(GLuint client_id) {
8704 const TextureRef* texture_ref = GetTexture(client_id); 8893 const TextureRef* texture_ref = GetTexture(client_id);
8705 return texture_ref && texture_ref->texture()->IsValid(); 8894 return texture_ref && texture_ref->texture()->IsValid();
8706 } 8895 }
8707 8896
8708 bool GLES2DecoderImpl::DoIsSampler(GLuint client_id) { 8897 bool GLES2DecoderImpl::DoIsSampler(GLuint client_id) {
8709 const Sampler* sampler = GetSampler(client_id); 8898 const Sampler* sampler = GetSampler(client_id);
8710 return sampler && !sampler->IsDeleted(); 8899 return sampler && !sampler->IsDeleted();
8711 } 8900 }
8712 8901
8902 bool GLES2DecoderImpl::DoIsTransformFeedback(GLuint client_id) {
8903 const TransformFeedback* transform_feedback =
8904 GetTransformFeedback(client_id);
8905 return transform_feedback && !transform_feedback->deleted();
piman 2016/04/28 01:38:47 Also, technically, IsTransformFeedback should only
piman 2016/04/28 01:38:47 nit: same as above, I don't think deleted() is pos
Zhenyao Mo 2016/04/29 21:07:54 Done.
Zhenyao Mo 2016/04/29 21:07:54 Done.
8906 }
8907
8713 void GLES2DecoderImpl::DoAttachShader( 8908 void GLES2DecoderImpl::DoAttachShader(
8714 GLuint program_client_id, GLint shader_client_id) { 8909 GLuint program_client_id, GLint shader_client_id) {
8715 Program* program = GetProgramInfoNotShader( 8910 Program* program = GetProgramInfoNotShader(
8716 program_client_id, "glAttachShader"); 8911 program_client_id, "glAttachShader");
8717 if (!program) { 8912 if (!program) {
8718 return; 8913 return;
8719 } 8914 }
8720 Shader* shader = GetShaderInfoNotProgram(shader_client_id, "glAttachShader"); 8915 Shader* shader = GetShaderInfoNotProgram(shader_client_id, "glAttachShader");
8721 if (!shader) { 8916 if (!shader) {
8722 return; 8917 return;
(...skipping 7634 matching lines...) Expand 10 before | Expand all | Expand 10 after
16357 } 16552 }
16358 16553
16359 // Include the auto-generated part of this file. We split this because it means 16554 // Include the auto-generated part of this file. We split this because it means
16360 // we can easily edit the non-auto generated parts right here in this file 16555 // we can easily edit the non-auto generated parts right here in this file
16361 // instead of having to edit some template or the code generator. 16556 // instead of having to edit some template or the code generator.
16362 #include "base/macros.h" 16557 #include "base/macros.h"
16363 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 16558 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
16364 16559
16365 } // namespace gles2 16560 } // namespace gles2
16366 } // namespace gpu 16561 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698