Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 510 | 510 |
| 511 // The last target that was bound to this texture unit. | 511 // The last target that was bound to this texture unit. |
| 512 GLenum bind_target; | 512 GLenum bind_target; |
| 513 | 513 |
| 514 // texture currently bound to this unit's GL_TEXTURE_2D with glBindTexture | 514 // texture currently bound to this unit's GL_TEXTURE_2D with glBindTexture |
| 515 TextureManager::TextureInfo::Ref bound_texture_2d; | 515 TextureManager::TextureInfo::Ref bound_texture_2d; |
| 516 | 516 |
| 517 // texture currently bound to this unit's GL_TEXTURE_CUBE_MAP with | 517 // texture currently bound to this unit's GL_TEXTURE_CUBE_MAP with |
| 518 // glBindTexture | 518 // glBindTexture |
| 519 TextureManager::TextureInfo::Ref bound_texture_cube_map; | 519 TextureManager::TextureInfo::Ref bound_texture_cube_map; |
| 520 | |
| 521 // texture currently bound to this unit's GL_TEXTURE_EXTERNAL_OES with | |
| 522 // glBindTexture | |
| 523 TextureManager::TextureInfo::Ref bound_texture_external_oes; | |
| 520 }; | 524 }; |
| 521 | 525 |
| 522 // Initialize or re-initialize the shader translator. | 526 // Initialize or re-initialize the shader translator. |
| 523 bool InitializeShaderTranslator(); | 527 bool InitializeShaderTranslator(); |
| 524 | 528 |
| 525 void UpdateCapabilities(); | 529 void UpdateCapabilities(); |
| 526 | 530 |
| 527 // Helpers for the glGen and glDelete functions. | 531 // Helpers for the glGen and glDelete functions. |
| 528 bool GenTexturesHelper(GLsizei n, const GLuint* client_ids); | 532 bool GenTexturesHelper(GLsizei n, const GLuint* client_ids); |
| 529 void DeleteTexturesHelper(GLsizei n, const GLuint* client_ids); | 533 void DeleteTexturesHelper(GLsizei n, const GLuint* client_ids); |
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1087 break; | 1091 break; |
| 1088 case GL_TEXTURE_CUBE_MAP: | 1092 case GL_TEXTURE_CUBE_MAP: |
| 1089 case GL_TEXTURE_CUBE_MAP_POSITIVE_X: | 1093 case GL_TEXTURE_CUBE_MAP_POSITIVE_X: |
| 1090 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: | 1094 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: |
| 1091 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: | 1095 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: |
| 1092 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: | 1096 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: |
| 1093 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: | 1097 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: |
| 1094 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: | 1098 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: |
| 1095 info = unit.bound_texture_cube_map; | 1099 info = unit.bound_texture_cube_map; |
| 1096 break; | 1100 break; |
| 1101 case GL_TEXTURE_EXTERNAL_OES: | |
| 1102 info = unit.bound_texture_external_oes; | |
| 1103 break; | |
| 1097 // Note: If we ever support TEXTURE_RECTANGLE as a target, be sure to | 1104 // Note: If we ever support TEXTURE_RECTANGLE as a target, be sure to |
| 1098 // track |texture_| with the currently bound TEXTURE_RECTANGLE texture, | 1105 // track |texture_| with the currently bound TEXTURE_RECTANGLE texture, |
| 1099 // because |texture_| is used by the FBO rendering mechanism for readback | 1106 // because |texture_| is used by the FBO rendering mechanism for readback |
| 1100 // to the bits that get sent to the browser. | 1107 // to the bits that get sent to the browser. |
| 1101 default: | 1108 default: |
| 1102 NOTREACHED(); | 1109 NOTREACHED(); |
| 1103 return NULL; | 1110 return NULL; |
| 1104 } | 1111 } |
| 1105 return (info && !info->IsDeleted()) ? info : NULL; | 1112 return (info && !info->IsDeleted()) ? info : NULL; |
| 1106 } | 1113 } |
| (...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1720 glGenBuffersARB(1, &attrib_0_buffer_id_); | 1727 glGenBuffersARB(1, &attrib_0_buffer_id_); |
| 1721 glBindBuffer(GL_ARRAY_BUFFER, attrib_0_buffer_id_); | 1728 glBindBuffer(GL_ARRAY_BUFFER, attrib_0_buffer_id_); |
| 1722 glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, NULL); | 1729 glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, NULL); |
| 1723 glBindBuffer(GL_ARRAY_BUFFER, 0); | 1730 glBindBuffer(GL_ARRAY_BUFFER, 0); |
| 1724 glGenBuffersARB(1, &fixed_attrib_buffer_id_); | 1731 glGenBuffersARB(1, &fixed_attrib_buffer_id_); |
| 1725 | 1732 |
| 1726 texture_units_.reset( | 1733 texture_units_.reset( |
| 1727 new TextureUnit[group_->max_texture_units()]); | 1734 new TextureUnit[group_->max_texture_units()]); |
| 1728 for (uint32 tt = 0; tt < group_->max_texture_units(); ++tt) { | 1735 for (uint32 tt = 0; tt < group_->max_texture_units(); ++tt) { |
| 1729 glActiveTexture(GL_TEXTURE0 + tt); | 1736 glActiveTexture(GL_TEXTURE0 + tt); |
| 1730 // Do cube map first because we want the last bind to be 2D. | 1737 // We want the last bind to be 2D. |
| 1731 TextureManager::TextureInfo* info = | 1738 TextureManager::TextureInfo* info; |
| 1732 texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP); | 1739 if (feature_info_->feature_flags().oes_egl_image_external) { |
| 1740 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_EXTERNAL_OES); | |
| 1741 texture_units_[tt].bound_texture_external_oes = info; | |
| 1742 glBindTexture(GL_TEXTURE_EXTERNAL_OES, info->service_id()); | |
| 1743 } | |
| 1744 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP); | |
| 1733 texture_units_[tt].bound_texture_cube_map = info; | 1745 texture_units_[tt].bound_texture_cube_map = info; |
| 1734 glBindTexture(GL_TEXTURE_CUBE_MAP, info->service_id()); | 1746 glBindTexture(GL_TEXTURE_CUBE_MAP, info->service_id()); |
| 1735 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D); | 1747 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D); |
| 1736 texture_units_[tt].bound_texture_2d = info; | 1748 texture_units_[tt].bound_texture_2d = info; |
| 1737 glBindTexture(GL_TEXTURE_2D, info->service_id()); | 1749 glBindTexture(GL_TEXTURE_2D, info->service_id()); |
| 1738 } | 1750 } |
| 1739 glActiveTexture(GL_TEXTURE0); | 1751 glActiveTexture(GL_TEXTURE0); |
| 1740 CHECK_GL_ERROR(); | 1752 CHECK_GL_ERROR(); |
| 1741 | 1753 |
| 1742 ContextCreationAttribParser attrib_parser; | 1754 ContextCreationAttribParser attrib_parser; |
| (...skipping 1069 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2812 glBindTexture(target, info->service_id()); | 2824 glBindTexture(target, info->service_id()); |
| 2813 TextureUnit& unit = texture_units_[active_texture_unit_]; | 2825 TextureUnit& unit = texture_units_[active_texture_unit_]; |
| 2814 unit.bind_target = target; | 2826 unit.bind_target = target; |
| 2815 switch (target) { | 2827 switch (target) { |
| 2816 case GL_TEXTURE_2D: | 2828 case GL_TEXTURE_2D: |
| 2817 unit.bound_texture_2d = info; | 2829 unit.bound_texture_2d = info; |
| 2818 break; | 2830 break; |
| 2819 case GL_TEXTURE_CUBE_MAP: | 2831 case GL_TEXTURE_CUBE_MAP: |
| 2820 unit.bound_texture_cube_map = info; | 2832 unit.bound_texture_cube_map = info; |
| 2821 break; | 2833 break; |
| 2834 case GL_TEXTURE_EXTERNAL_OES: | |
| 2835 if (feature_info_->feature_flags().oes_egl_image_external) | |
|
greggman
2011/07/20 01:41:18
I don't think you need to check here. If the featu
| |
| 2836 unit.bound_texture_external_oes = info; | |
| 2837 else | |
| 2838 NOTREACHED(); // Validation should prevent us getting here. | |
| 2839 break; | |
| 2822 default: | 2840 default: |
| 2823 NOTREACHED(); // Validation should prevent us getting here. | 2841 NOTREACHED(); // Validation should prevent us getting here. |
| 2824 break; | 2842 break; |
| 2825 } | 2843 } |
| 2826 } | 2844 } |
| 2827 | 2845 |
| 2828 void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) { | 2846 void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) { |
| 2829 if (vertex_attrib_manager_.Enable(index, false)) { | 2847 if (vertex_attrib_manager_.Enable(index, false)) { |
| 2830 if (index != 0 || | 2848 if (index != 0 || |
| 2831 gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) { | 2849 gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) { |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3106 if (unit.bound_texture_cube_map) { | 3124 if (unit.bound_texture_cube_map) { |
| 3107 GLuint client_id = 0; | 3125 GLuint client_id = 0; |
| 3108 texture_manager()->GetClientId( | 3126 texture_manager()->GetClientId( |
| 3109 unit.bound_texture_cube_map->service_id(), &client_id); | 3127 unit.bound_texture_cube_map->service_id(), &client_id); |
| 3110 *params = client_id; | 3128 *params = client_id; |
| 3111 } else { | 3129 } else { |
| 3112 *params = 0; | 3130 *params = 0; |
| 3113 } | 3131 } |
| 3114 } | 3132 } |
| 3115 return true; | 3133 return true; |
| 3134 case GL_TEXTURE_BINDING_EXTERNAL_OES: | |
| 3135 *num_written = 1; | |
| 3136 if (params) { | |
| 3137 TextureUnit& unit = texture_units_[active_texture_unit_]; | |
| 3138 if (unit.bound_texture_external_oes) { | |
| 3139 GLuint client_id = 0; | |
| 3140 texture_manager()->GetClientId( | |
| 3141 unit.bound_texture_external_oes->service_id(), &client_id); | |
| 3142 *params = client_id; | |
| 3143 } else { | |
| 3144 *params = 0; | |
| 3145 } | |
| 3146 } | |
| 3147 return true; | |
| 3116 default: | 3148 default: |
| 3117 *num_written = util_.GLGetNumValuesReturned(pname); | 3149 *num_written = util_.GLGetNumValuesReturned(pname); |
| 3118 return false; | 3150 return false; |
| 3119 } | 3151 } |
| 3120 } | 3152 } |
| 3121 | 3153 |
| 3122 bool GLES2DecoderImpl::GetNumValuesReturnedForGLGet( | 3154 bool GLES2DecoderImpl::GetNumValuesReturnedForGLGet( |
| 3123 GLenum pname, GLsizei* num_values) { | 3155 GLenum pname, GLsizei* num_values) { |
| 3124 return GetHelper(pname, NULL, num_values); | 3156 return GetHelper(pname, NULL, num_values); |
| 3125 } | 3157 } |
| (...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3875 | 3907 |
| 3876 void GLES2DecoderImpl::DoUniform1iv( | 3908 void GLES2DecoderImpl::DoUniform1iv( |
| 3877 GLint location, GLsizei count, const GLint *value) { | 3909 GLint location, GLsizei count, const GLint *value) { |
| 3878 if (!CheckCurrentProgramForUniform(location, "glUniform1iv")) { | 3910 if (!CheckCurrentProgramForUniform(location, "glUniform1iv")) { |
| 3879 return; | 3911 return; |
| 3880 } | 3912 } |
| 3881 GLenum type = 0; | 3913 GLenum type = 0; |
| 3882 if (!PrepForSetUniformByLocation(location, "glUniform1iv", &type, &count)) { | 3914 if (!PrepForSetUniformByLocation(location, "glUniform1iv", &type, &count)) { |
| 3883 return; | 3915 return; |
| 3884 } | 3916 } |
| 3885 if (type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE) { | 3917 if (type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || |
| 3918 type == GL_SAMPLER_EXTERNAL_OES) { | |
| 3886 current_program_->SetSamplers(location, count, value); | 3919 current_program_->SetSamplers(location, count, value); |
| 3887 } | 3920 } |
| 3888 glUniform1iv(location, count, value); | 3921 glUniform1iv(location, count, value); |
| 3889 } | 3922 } |
| 3890 | 3923 |
| 3891 void GLES2DecoderImpl::DoUniform1fv( | 3924 void GLES2DecoderImpl::DoUniform1fv( |
| 3892 GLint location, GLsizei count, const GLfloat* value) { | 3925 GLint location, GLsizei count, const GLfloat* value) { |
| 3893 GLenum type = 0; | 3926 GLenum type = 0; |
| 3894 if (!PrepForSetUniformByLocation(location, "glUniform1fv", &type, &count)) { | 3927 if (!PrepForSetUniformByLocation(location, "glUniform1fv", &type, &count)) { |
| 3895 return; | 3928 return; |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4100 const ProgramManager::ProgramInfo::SamplerIndices& sampler_indices = | 4133 const ProgramManager::ProgramInfo::SamplerIndices& sampler_indices = |
| 4101 current_program_->sampler_indices(); | 4134 current_program_->sampler_indices(); |
| 4102 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { | 4135 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { |
| 4103 const ProgramManager::ProgramInfo::UniformInfo* uniform_info = | 4136 const ProgramManager::ProgramInfo::UniformInfo* uniform_info = |
| 4104 current_program_->GetUniformInfo(sampler_indices[ii]); | 4137 current_program_->GetUniformInfo(sampler_indices[ii]); |
| 4105 DCHECK(uniform_info); | 4138 DCHECK(uniform_info); |
| 4106 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { | 4139 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { |
| 4107 GLuint texture_unit_index = uniform_info->texture_units[jj]; | 4140 GLuint texture_unit_index = uniform_info->texture_units[jj]; |
| 4108 if (texture_unit_index < group_->max_texture_units()) { | 4141 if (texture_unit_index < group_->max_texture_units()) { |
| 4109 TextureUnit& texture_unit = texture_units_[texture_unit_index]; | 4142 TextureUnit& texture_unit = texture_units_[texture_unit_index]; |
| 4110 TextureManager::TextureInfo* texture_info = | 4143 TextureManager::TextureInfo* texture_info = |
|
greggman
2011/07/20 01:41:18
This seems like it should be a function now that i
| |
| 4111 uniform_info->type == GL_SAMPLER_2D ? | 4144 uniform_info->type == GL_SAMPLER_2D ? |
| 4112 texture_unit.bound_texture_2d : | 4145 texture_unit.bound_texture_2d : |
| 4113 texture_unit.bound_texture_cube_map; | 4146 (uniform_info->type == GL_SAMPLER_EXTERNAL_OES ? |
| 4147 texture_unit.bound_texture_external_oes : | |
| 4148 texture_unit.bound_texture_cube_map); | |
| 4114 if (!texture_info || !texture_info->CanRender(feature_info_)) { | 4149 if (!texture_info || !texture_info->CanRender(feature_info_)) { |
| 4115 textures_set = true; | 4150 textures_set = true; |
| 4116 glActiveTexture(GL_TEXTURE0 + texture_unit_index); | 4151 glActiveTexture(GL_TEXTURE0 + texture_unit_index); |
| 4117 glBindTexture( | 4152 glBindTexture( |
| 4118 uniform_info->type == GL_SAMPLER_2D ? GL_TEXTURE_2D : | 4153 uniform_info->type == GL_SAMPLER_2D ? GL_TEXTURE_2D : |
| 4119 GL_TEXTURE_CUBE_MAP, | 4154 (uniform_info->type == GL_SAMPLER_EXTERNAL_OES ? |
|
greggman
2011/07/20 01:41:18
This also seems like it might be better as a funct
| |
| 4155 GL_TEXTURE_EXTERNAL_OES : GL_TEXTURE_CUBE_MAP), | |
| 4120 texture_manager()->black_texture_id(uniform_info->type)); | 4156 texture_manager()->black_texture_id(uniform_info->type)); |
| 4121 } | 4157 } |
| 4122 } | 4158 } |
| 4123 // else: should this be an error? | 4159 // else: should this be an error? |
| 4124 } | 4160 } |
| 4125 } | 4161 } |
| 4126 return textures_set; | 4162 return textures_set; |
| 4127 } | 4163 } |
| 4128 | 4164 |
| 4129 void GLES2DecoderImpl::RestoreStateForNonRenderableTextures() { | 4165 void GLES2DecoderImpl::RestoreStateForNonRenderableTextures() { |
| (...skipping 2668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6798 return false; | 6834 return false; |
| 6799 } | 6835 } |
| 6800 | 6836 |
| 6801 // Include the auto-generated part of this file. We split this because it means | 6837 // Include the auto-generated part of this file. We split this because it means |
| 6802 // we can easily edit the non-auto generated parts right here in this file | 6838 // we can easily edit the non-auto generated parts right here in this file |
| 6803 // instead of having to edit some template or the code generator. | 6839 // instead of having to edit some template or the code generator. |
| 6804 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 6840 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 6805 | 6841 |
| 6806 } // namespace gles2 | 6842 } // namespace gles2 |
| 6807 } // namespace gpu | 6843 } // namespace gpu |
| OLD | NEW |