| 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 1666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1677 framebuffer_state_.bound_draw_framebuffer.get() == NULL && | 1677 framebuffer_state_.bound_draw_framebuffer.get() == NULL && |
| 1678 surface_->DeferDraws(); | 1678 surface_->DeferDraws(); |
| 1679 } | 1679 } |
| 1680 | 1680 |
| 1681 bool ShouldDeferReads() { | 1681 bool ShouldDeferReads() { |
| 1682 return !offscreen_target_frame_buffer_.get() && | 1682 return !offscreen_target_frame_buffer_.get() && |
| 1683 framebuffer_state_.bound_read_framebuffer.get() == NULL && | 1683 framebuffer_state_.bound_read_framebuffer.get() == NULL && |
| 1684 surface_->DeferDraws(); | 1684 surface_->DeferDraws(); |
| 1685 } | 1685 } |
| 1686 | 1686 |
| 1687 bool IsRobustnessSupported() { |
| 1688 return has_robustness_extension_ && |
| 1689 context_->WasAllocatedUsingRobustnessExtension(); |
| 1690 } |
| 1691 |
| 1687 error::Error WillAccessBoundFramebufferForDraw() { | 1692 error::Error WillAccessBoundFramebufferForDraw() { |
| 1688 if (ShouldDeferDraws()) | 1693 if (ShouldDeferDraws()) |
| 1689 return error::kDeferCommandUntilLater; | 1694 return error::kDeferCommandUntilLater; |
| 1690 if (!offscreen_target_frame_buffer_.get() && | 1695 if (!offscreen_target_frame_buffer_.get() && |
| 1691 !framebuffer_state_.bound_draw_framebuffer.get() && | 1696 !framebuffer_state_.bound_draw_framebuffer.get() && |
| 1692 !surface_->SetBackbufferAllocation(true)) | 1697 !surface_->SetBackbufferAllocation(true)) |
| 1693 return error::kLostContext; | 1698 return error::kLostContext; |
| 1694 return error::kNoError; | 1699 return error::kNoError; |
| 1695 } | 1700 } |
| 1696 | 1701 |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1813 | 1818 |
| 1814 // Backbuffer attachments that are currently undefined. | 1819 // Backbuffer attachments that are currently undefined. |
| 1815 uint32 backbuffer_needs_clear_bits_; | 1820 uint32 backbuffer_needs_clear_bits_; |
| 1816 | 1821 |
| 1817 // The current decoder error communicates the decoder error through command | 1822 // The current decoder error communicates the decoder error through command |
| 1818 // processing functions that do not return the error value. Should be set only | 1823 // processing functions that do not return the error value. Should be set only |
| 1819 // if not returning an error. | 1824 // if not returning an error. |
| 1820 error::Error current_decoder_error_; | 1825 error::Error current_decoder_error_; |
| 1821 | 1826 |
| 1822 bool use_shader_translator_; | 1827 bool use_shader_translator_; |
| 1823 scoped_refptr<ShaderTranslator> vertex_translator_; | 1828 scoped_refptr<ShaderTranslatorInterface> vertex_translator_; |
| 1824 scoped_refptr<ShaderTranslator> fragment_translator_; | 1829 scoped_refptr<ShaderTranslatorInterface> fragment_translator_; |
| 1825 | 1830 |
| 1826 DisallowedFeatures disallowed_features_; | 1831 DisallowedFeatures disallowed_features_; |
| 1827 | 1832 |
| 1828 // Cached from ContextGroup | 1833 // Cached from ContextGroup |
| 1829 const Validators* validators_; | 1834 const Validators* validators_; |
| 1830 scoped_refptr<FeatureInfo> feature_info_; | 1835 scoped_refptr<FeatureInfo> feature_info_; |
| 1831 | 1836 |
| 1832 int frame_number_; | 1837 int frame_number_; |
| 1833 | 1838 |
| 1834 // Number of commands remaining to be processed in DoCommands(). | 1839 // Number of commands remaining to be processed in DoCommands(). |
| (...skipping 3995 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5830 | 5835 |
| 5831 void GLES2DecoderImpl::DoLinkProgram(GLuint program_id) { | 5836 void GLES2DecoderImpl::DoLinkProgram(GLuint program_id) { |
| 5832 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoLinkProgram"); | 5837 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoLinkProgram"); |
| 5833 Program* program = GetProgramInfoNotShader( | 5838 Program* program = GetProgramInfoNotShader( |
| 5834 program_id, "glLinkProgram"); | 5839 program_id, "glLinkProgram"); |
| 5835 if (!program) { | 5840 if (!program) { |
| 5836 return; | 5841 return; |
| 5837 } | 5842 } |
| 5838 | 5843 |
| 5839 LogClientServiceForInfo(program, program_id, "glLinkProgram"); | 5844 LogClientServiceForInfo(program, program_id, "glLinkProgram"); |
| 5840 ShaderTranslator* vertex_translator = NULL; | |
| 5841 ShaderTranslator* fragment_translator = NULL; | |
| 5842 if (use_shader_translator_) { | |
| 5843 vertex_translator = vertex_translator_.get(); | |
| 5844 fragment_translator = fragment_translator_.get(); | |
| 5845 } | |
| 5846 if (program->Link(shader_manager(), | 5845 if (program->Link(shader_manager(), |
| 5847 vertex_translator, | |
| 5848 fragment_translator, | |
| 5849 workarounds().count_all_in_varyings_packing ? | 5846 workarounds().count_all_in_varyings_packing ? |
| 5850 Program::kCountAll : Program::kCountOnlyStaticallyUsed, | 5847 Program::kCountAll : Program::kCountOnlyStaticallyUsed, |
| 5851 shader_cache_callback_)) { | 5848 shader_cache_callback_)) { |
| 5852 if (program == state_.current_program.get()) { | 5849 if (program == state_.current_program.get()) { |
| 5853 if (workarounds().use_current_program_after_successful_link) | 5850 if (workarounds().use_current_program_after_successful_link) |
| 5854 glUseProgram(program->service_id()); | 5851 glUseProgram(program->service_id()); |
| 5855 if (workarounds().clear_uniforms_before_first_program_use) | 5852 if (workarounds().clear_uniforms_before_first_program_use) |
| 5856 program_manager()->ClearUniforms(program); | 5853 program_manager()->ClearUniforms(program); |
| 5857 } | 5854 } |
| 5858 } | 5855 } |
| (...skipping 1225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7084 glTransformFeedbackVaryings( | 7081 glTransformFeedbackVaryings( |
| 7085 program->service_id(), count, varyings, buffer_mode); | 7082 program->service_id(), count, varyings, buffer_mode); |
| 7086 } | 7083 } |
| 7087 | 7084 |
| 7088 void GLES2DecoderImpl::DoCompileShader(GLuint client_id) { | 7085 void GLES2DecoderImpl::DoCompileShader(GLuint client_id) { |
| 7089 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompileShader"); | 7086 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompileShader"); |
| 7090 Shader* shader = GetShaderInfoNotProgram(client_id, "glCompileShader"); | 7087 Shader* shader = GetShaderInfoNotProgram(client_id, "glCompileShader"); |
| 7091 if (!shader) { | 7088 if (!shader) { |
| 7092 return; | 7089 return; |
| 7093 } | 7090 } |
| 7094 ShaderTranslator* translator = NULL; | 7091 |
| 7092 scoped_refptr<ShaderTranslatorInterface> translator; |
| 7095 if (use_shader_translator_) { | 7093 if (use_shader_translator_) { |
| 7096 translator = shader->shader_type() == GL_VERTEX_SHADER ? | 7094 translator = shader->shader_type() == GL_VERTEX_SHADER ? |
| 7097 vertex_translator_.get() : fragment_translator_.get(); | 7095 vertex_translator_ : fragment_translator_; |
| 7098 } | 7096 } |
| 7099 | 7097 |
| 7100 shader->RequestCompile(); | 7098 const Shader::TranslatedShaderSourceType source_type = |
| 7101 | 7099 feature_info_->feature_flags().angle_translated_shader_source ? |
| 7102 // TODO(dyen): Currently we compile immediately when glCompileShader is | 7100 Shader::kANGLE : Shader::kGL; |
| 7103 // requested. Eventually this should be deffered to the linker stage. | 7101 shader->RequestCompile(translator, source_type); |
| 7104 shader->DoCompile( | |
| 7105 translator, | |
| 7106 feature_info_->feature_flags().angle_translated_shader_source ? | |
| 7107 Shader::kANGLE : Shader::kGL); | |
| 7108 | |
| 7109 // CompileShader can be very slow. Exit command processing to allow for | |
| 7110 // context preemption and GPU watchdog checks. | |
| 7111 ExitCommandProcessingEarly(); | |
| 7112 } | 7102 } |
| 7113 | 7103 |
| 7114 void GLES2DecoderImpl::DoGetShaderiv( | 7104 void GLES2DecoderImpl::DoGetShaderiv( |
| 7115 GLuint shader_id, GLenum pname, GLint* params) { | 7105 GLuint shader_id, GLenum pname, GLint* params) { |
| 7116 Shader* shader = GetShaderInfoNotProgram(shader_id, "glGetShaderiv"); | 7106 Shader* shader = GetShaderInfoNotProgram(shader_id, "glGetShaderiv"); |
| 7117 if (!shader) { | 7107 if (!shader) { |
| 7118 return; | 7108 return; |
| 7119 } | 7109 } |
| 7110 |
| 7111 // Compile now for statuses that require it. |
| 7112 switch (pname) { |
| 7113 case GL_COMPILE_STATUS: |
| 7114 case GL_INFO_LOG_LENGTH: |
| 7115 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE: |
| 7116 shader->DoCompile(); |
| 7117 break; |
| 7118 |
| 7119 default: |
| 7120 break; |
| 7121 } |
| 7122 |
| 7120 switch (pname) { | 7123 switch (pname) { |
| 7121 case GL_SHADER_SOURCE_LENGTH: | 7124 case GL_SHADER_SOURCE_LENGTH: |
| 7122 *params = shader->source().size(); | 7125 *params = shader->source().size(); |
| 7123 if (*params) | 7126 if (*params) |
| 7124 ++(*params); | 7127 ++(*params); |
| 7125 return; | 7128 return; |
| 7126 case GL_COMPILE_STATUS: | 7129 case GL_COMPILE_STATUS: |
| 7127 *params = compile_shader_always_succeeds_ ? true : shader->valid(); | 7130 *params = compile_shader_always_succeeds_ ? true : shader->valid(); |
| 7128 return; | 7131 return; |
| 7129 case GL_INFO_LOG_LENGTH: | 7132 case GL_INFO_LOG_LENGTH: |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7167 GLuint shader_id = c.shader; | 7170 GLuint shader_id = c.shader; |
| 7168 uint32 bucket_id = static_cast<uint32>(c.bucket_id); | 7171 uint32 bucket_id = static_cast<uint32>(c.bucket_id); |
| 7169 Bucket* bucket = CreateBucket(bucket_id); | 7172 Bucket* bucket = CreateBucket(bucket_id); |
| 7170 Shader* shader = GetShaderInfoNotProgram( | 7173 Shader* shader = GetShaderInfoNotProgram( |
| 7171 shader_id, "glGetTranslatedShaderSourceANGLE"); | 7174 shader_id, "glGetTranslatedShaderSourceANGLE"); |
| 7172 if (!shader) { | 7175 if (!shader) { |
| 7173 bucket->SetSize(0); | 7176 bucket->SetSize(0); |
| 7174 return error::kNoError; | 7177 return error::kNoError; |
| 7175 } | 7178 } |
| 7176 | 7179 |
| 7180 // Make sure translator has been utilized in compile. |
| 7181 shader->DoCompile(); |
| 7182 |
| 7177 bucket->SetFromString(shader->translated_source().c_str()); | 7183 bucket->SetFromString(shader->translated_source().c_str()); |
| 7178 return error::kNoError; | 7184 return error::kNoError; |
| 7179 } | 7185 } |
| 7180 | 7186 |
| 7181 error::Error GLES2DecoderImpl::HandleGetProgramInfoLog( | 7187 error::Error GLES2DecoderImpl::HandleGetProgramInfoLog( |
| 7182 uint32 immediate_data_size, | 7188 uint32 immediate_data_size, |
| 7183 const void* cmd_data) { | 7189 const void* cmd_data) { |
| 7184 const gles2::cmds::GetProgramInfoLog& c = | 7190 const gles2::cmds::GetProgramInfoLog& c = |
| 7185 *static_cast<const gles2::cmds::GetProgramInfoLog*>(cmd_data); | 7191 *static_cast<const gles2::cmds::GetProgramInfoLog*>(cmd_data); |
| 7186 GLuint program_id = c.program; | 7192 GLuint program_id = c.program; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 7202 const gles2::cmds::GetShaderInfoLog& c = | 7208 const gles2::cmds::GetShaderInfoLog& c = |
| 7203 *static_cast<const gles2::cmds::GetShaderInfoLog*>(cmd_data); | 7209 *static_cast<const gles2::cmds::GetShaderInfoLog*>(cmd_data); |
| 7204 GLuint shader_id = c.shader; | 7210 GLuint shader_id = c.shader; |
| 7205 uint32 bucket_id = static_cast<uint32>(c.bucket_id); | 7211 uint32 bucket_id = static_cast<uint32>(c.bucket_id); |
| 7206 Bucket* bucket = CreateBucket(bucket_id); | 7212 Bucket* bucket = CreateBucket(bucket_id); |
| 7207 Shader* shader = GetShaderInfoNotProgram(shader_id, "glGetShaderInfoLog"); | 7213 Shader* shader = GetShaderInfoNotProgram(shader_id, "glGetShaderInfoLog"); |
| 7208 if (!shader) { | 7214 if (!shader) { |
| 7209 bucket->SetFromString(""); | 7215 bucket->SetFromString(""); |
| 7210 return error::kNoError; | 7216 return error::kNoError; |
| 7211 } | 7217 } |
| 7218 |
| 7219 // Shader must be compiled in order to get the info log. |
| 7220 shader->DoCompile(); |
| 7221 |
| 7212 bucket->SetFromString(shader->log_info().c_str()); | 7222 bucket->SetFromString(shader->log_info().c_str()); |
| 7213 return error::kNoError; | 7223 return error::kNoError; |
| 7214 } | 7224 } |
| 7215 | 7225 |
| 7216 bool GLES2DecoderImpl::DoIsEnabled(GLenum cap) { | 7226 bool GLES2DecoderImpl::DoIsEnabled(GLenum cap) { |
| 7217 return state_.GetEnabled(cap); | 7227 return state_.GetEnabled(cap); |
| 7218 } | 7228 } |
| 7219 | 7229 |
| 7220 bool GLES2DecoderImpl::DoIsBuffer(GLuint client_id) { | 7230 bool GLES2DecoderImpl::DoIsBuffer(GLuint client_id) { |
| 7221 const Buffer* buffer = GetBuffer(client_id); | 7231 const Buffer* buffer = GetBuffer(client_id); |
| (...skipping 931 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8153 return error::kInvalidArguments; | 8163 return error::kInvalidArguments; |
| 8154 } | 8164 } |
| 8155 std::string name_str; | 8165 std::string name_str; |
| 8156 if (!bucket->GetAsString(&name_str)) { | 8166 if (!bucket->GetAsString(&name_str)) { |
| 8157 return error::kInvalidArguments; | 8167 return error::kInvalidArguments; |
| 8158 } | 8168 } |
| 8159 return GetUniformLocationHelper( | 8169 return GetUniformLocationHelper( |
| 8160 c.program, c.location_shm_id, c.location_shm_offset, name_str); | 8170 c.program, c.location_shm_id, c.location_shm_offset, name_str); |
| 8161 } | 8171 } |
| 8162 | 8172 |
| 8173 error::Error GLES2DecoderImpl::HandleGetUniformIndices( |
| 8174 uint32 immediate_data_size, |
| 8175 const void* cmd_data) { |
| 8176 if (!unsafe_es3_apis_enabled()) |
| 8177 return error::kUnknownCommand; |
| 8178 const gles2::cmds::GetUniformIndices& c = |
| 8179 *static_cast<const gles2::cmds::GetUniformIndices*>(cmd_data); |
| 8180 Bucket* bucket = GetBucket(c.names_bucket_id); |
| 8181 if (!bucket) { |
| 8182 return error::kInvalidArguments; |
| 8183 } |
| 8184 GLsizei count = 0; |
| 8185 std::vector<char*> names; |
| 8186 std::vector<GLint> len; |
| 8187 if (!bucket->GetAsStrings(&count, &names, &len) || count <= 0) { |
| 8188 return error::kInvalidArguments; |
| 8189 } |
| 8190 typedef cmds::GetUniformIndices::Result Result; |
| 8191 Result* result = GetSharedMemoryAs<Result*>( |
| 8192 c.indices_shm_id, c.indices_shm_offset, |
| 8193 Result::ComputeSize(static_cast<size_t>(count))); |
| 8194 GLuint* indices = result ? result->GetData() : NULL; |
| 8195 if (indices == NULL) { |
| 8196 return error::kOutOfBounds; |
| 8197 } |
| 8198 // Check that the client initialized the result. |
| 8199 if (result->size != 0) { |
| 8200 return error::kInvalidArguments; |
| 8201 } |
| 8202 Program* program = GetProgramInfoNotShader(c.program, "glGetUniformIndices"); |
| 8203 if (!program) { |
| 8204 return error::kNoError; |
| 8205 } |
| 8206 GLuint service_id = program->service_id(); |
| 8207 GLint link_status = GL_FALSE; |
| 8208 glGetProgramiv(service_id, GL_LINK_STATUS, &link_status); |
| 8209 if (link_status != GL_TRUE) { |
| 8210 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, |
| 8211 "glGetUniformIndices", "program not linked"); |
| 8212 return error::kNoError; |
| 8213 } |
| 8214 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetUniformIndices"); |
| 8215 glGetUniformIndices(service_id, count, &names[0], indices); |
| 8216 GLenum error = glGetError(); |
| 8217 if (error == GL_NO_ERROR) { |
| 8218 result->SetNumResults(count); |
| 8219 } else { |
| 8220 LOCAL_SET_GL_ERROR(error, "GetUniformIndices", ""); |
| 8221 } |
| 8222 return error::kNoError; |
| 8223 } |
| 8224 |
| 8163 error::Error GLES2DecoderImpl::GetFragDataLocationHelper( | 8225 error::Error GLES2DecoderImpl::GetFragDataLocationHelper( |
| 8164 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, | 8226 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, |
| 8165 const std::string& name_str) { | 8227 const std::string& name_str) { |
| 8166 GLint* location = GetSharedMemoryAs<GLint*>( | 8228 GLint* location = GetSharedMemoryAs<GLint*>( |
| 8167 location_shm_id, location_shm_offset, sizeof(GLint)); | 8229 location_shm_id, location_shm_offset, sizeof(GLint)); |
| 8168 if (!location) { | 8230 if (!location) { |
| 8169 return error::kOutOfBounds; | 8231 return error::kOutOfBounds; |
| 8170 } | 8232 } |
| 8171 // Require the client to init this incase the context is lost and we are no | 8233 // Require the client to init this incase the context is lost and we are no |
| 8172 // longer executing commands. | 8234 // longer executing commands. |
| (...skipping 1550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9723 return error::kNoError; | 9785 return error::kNoError; |
| 9724 } | 9786 } |
| 9725 result->success = 1; // true. | 9787 result->success = 1; // true. |
| 9726 result->size = uniform_info->size; | 9788 result->size = uniform_info->size; |
| 9727 result->type = uniform_info->type; | 9789 result->type = uniform_info->type; |
| 9728 Bucket* bucket = CreateBucket(name_bucket_id); | 9790 Bucket* bucket = CreateBucket(name_bucket_id); |
| 9729 bucket->SetFromString(uniform_info->name.c_str()); | 9791 bucket->SetFromString(uniform_info->name.c_str()); |
| 9730 return error::kNoError; | 9792 return error::kNoError; |
| 9731 } | 9793 } |
| 9732 | 9794 |
| 9795 error::Error GLES2DecoderImpl::HandleGetActiveUniformBlockiv( |
| 9796 uint32 immediate_data_size, const void* cmd_data) { |
| 9797 if (!unsafe_es3_apis_enabled()) |
| 9798 return error::kUnknownCommand; |
| 9799 const gles2::cmds::GetActiveUniformBlockiv& c = |
| 9800 *static_cast<const gles2::cmds::GetActiveUniformBlockiv*>(cmd_data); |
| 9801 GLuint program_id = c.program; |
| 9802 GLuint index = static_cast<GLuint>(c.index); |
| 9803 GLenum pname = static_cast<GLenum>(c.pname); |
| 9804 Program* program = GetProgramInfoNotShader( |
| 9805 program_id, "glGetActiveUniformBlockiv"); |
| 9806 if (!program) { |
| 9807 return error::kNoError; |
| 9808 } |
| 9809 GLuint service_id = program->service_id(); |
| 9810 GLint link_status = GL_FALSE; |
| 9811 glGetProgramiv(service_id, GL_LINK_STATUS, &link_status); |
| 9812 if (link_status != GL_TRUE) { |
| 9813 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, |
| 9814 "glGetActiveActiveUniformBlockiv", "program not linked"); |
| 9815 return error::kNoError; |
| 9816 } |
| 9817 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetActiveUniformBlockiv"); |
| 9818 GLsizei num_values = 1; |
| 9819 if (pname == GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES) { |
| 9820 GLint num = 0; |
| 9821 glGetActiveUniformBlockiv( |
| 9822 service_id, index, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &num); |
| 9823 GLenum error = glGetError(); |
| 9824 if (error != GL_NO_ERROR) { |
| 9825 // Assume this will the same error if calling with pname. |
| 9826 LOCAL_SET_GL_ERROR(error, "GetActiveUniformBlockiv", ""); |
| 9827 return error::kNoError; |
| 9828 } |
| 9829 num_values = static_cast<GLsizei>(num); |
| 9830 } |
| 9831 typedef cmds::GetActiveUniformBlockiv::Result Result; |
| 9832 Result* result = GetSharedMemoryAs<Result*>( |
| 9833 c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values)); |
| 9834 GLint* params = result ? result->GetData() : NULL; |
| 9835 if (params == NULL) { |
| 9836 return error::kOutOfBounds; |
| 9837 } |
| 9838 // Check that the client initialized the result. |
| 9839 if (result->size != 0) { |
| 9840 return error::kInvalidArguments; |
| 9841 } |
| 9842 glGetActiveUniformBlockiv(service_id, index, pname, params); |
| 9843 GLenum error = glGetError(); |
| 9844 if (error == GL_NO_ERROR) { |
| 9845 result->SetNumResults(num_values); |
| 9846 } else { |
| 9847 LOCAL_SET_GL_ERROR(error, "GetActiveUniformBlockiv", ""); |
| 9848 } |
| 9849 return error::kNoError; |
| 9850 } |
| 9851 |
| 9733 error::Error GLES2DecoderImpl::HandleGetActiveUniformBlockName( | 9852 error::Error GLES2DecoderImpl::HandleGetActiveUniformBlockName( |
| 9734 uint32 immediate_data_size, const void* cmd_data) { | 9853 uint32 immediate_data_size, const void* cmd_data) { |
| 9735 if (!unsafe_es3_apis_enabled()) | 9854 if (!unsafe_es3_apis_enabled()) |
| 9736 return error::kUnknownCommand; | 9855 return error::kUnknownCommand; |
| 9737 const gles2::cmds::GetActiveUniformBlockName& c = | 9856 const gles2::cmds::GetActiveUniformBlockName& c = |
| 9738 *static_cast<const gles2::cmds::GetActiveUniformBlockName*>(cmd_data); | 9857 *static_cast<const gles2::cmds::GetActiveUniformBlockName*>(cmd_data); |
| 9739 GLuint program_id = c.program; | 9858 GLuint program_id = c.program; |
| 9740 GLuint index = c.index; | 9859 GLuint index = c.index; |
| 9741 uint32 name_bucket_id = c.name_bucket_id; | 9860 uint32 name_bucket_id = c.name_bucket_id; |
| 9742 typedef cmds::GetActiveUniformBlockName::Result Result; | 9861 typedef cmds::GetActiveUniformBlockName::Result Result; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9776 return error::kNoError; | 9895 return error::kNoError; |
| 9777 } | 9896 } |
| 9778 *result = 1; | 9897 *result = 1; |
| 9779 Bucket* bucket = CreateBucket(name_bucket_id); | 9898 Bucket* bucket = CreateBucket(name_bucket_id); |
| 9780 DCHECK_GT(buf_size, length); | 9899 DCHECK_GT(buf_size, length); |
| 9781 DCHECK_EQ(0, buffer[length]); | 9900 DCHECK_EQ(0, buffer[length]); |
| 9782 bucket->SetFromString(&buffer[0]); | 9901 bucket->SetFromString(&buffer[0]); |
| 9783 return error::kNoError; | 9902 return error::kNoError; |
| 9784 } | 9903 } |
| 9785 | 9904 |
| 9905 error::Error GLES2DecoderImpl::HandleGetActiveUniformsiv( |
| 9906 uint32 immediate_data_size, const void* cmd_data) { |
| 9907 if (!unsafe_es3_apis_enabled()) |
| 9908 return error::kUnknownCommand; |
| 9909 const gles2::cmds::GetActiveUniformsiv& c = |
| 9910 *static_cast<const gles2::cmds::GetActiveUniformsiv*>(cmd_data); |
| 9911 GLuint program_id = c.program; |
| 9912 GLenum pname = static_cast<GLenum>(c.pname); |
| 9913 Bucket* bucket = GetBucket(c.indices_bucket_id); |
| 9914 if (!bucket) { |
| 9915 return error::kInvalidArguments; |
| 9916 } |
| 9917 GLsizei count = static_cast<GLsizei>(bucket->size() / sizeof(GLuint)); |
| 9918 const GLuint* indices = bucket->GetDataAs<const GLuint*>(0, bucket->size()); |
| 9919 typedef cmds::GetActiveUniformsiv::Result Result; |
| 9920 Result* result = GetSharedMemoryAs<Result*>( |
| 9921 c.params_shm_id, c.params_shm_offset, Result::ComputeSize(count)); |
| 9922 GLint* params = result ? result->GetData() : NULL; |
| 9923 if (params == NULL) { |
| 9924 return error::kOutOfBounds; |
| 9925 } |
| 9926 // Check that the client initialized the result. |
| 9927 if (result->size != 0) { |
| 9928 return error::kInvalidArguments; |
| 9929 } |
| 9930 Program* program = GetProgramInfoNotShader( |
| 9931 program_id, "glGetActiveUniformsiv"); |
| 9932 if (!program) { |
| 9933 return error::kNoError; |
| 9934 } |
| 9935 GLuint service_id = program->service_id(); |
| 9936 GLint link_status = GL_FALSE; |
| 9937 glGetProgramiv(service_id, GL_LINK_STATUS, &link_status); |
| 9938 if (link_status != GL_TRUE) { |
| 9939 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, |
| 9940 "glGetActiveUniformsiv", "program not linked"); |
| 9941 return error::kNoError; |
| 9942 } |
| 9943 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetActiveUniformsiv"); |
| 9944 glGetActiveUniformsiv(service_id, count, indices, pname, params); |
| 9945 GLenum error = glGetError(); |
| 9946 if (error == GL_NO_ERROR) { |
| 9947 result->SetNumResults(count); |
| 9948 } else { |
| 9949 LOCAL_SET_GL_ERROR(error, "GetActiveUniformsiv", ""); |
| 9950 } |
| 9951 return error::kNoError; |
| 9952 } |
| 9953 |
| 9786 error::Error GLES2DecoderImpl::HandleGetActiveAttrib(uint32 immediate_data_size, | 9954 error::Error GLES2DecoderImpl::HandleGetActiveAttrib(uint32 immediate_data_size, |
| 9787 const void* cmd_data) { | 9955 const void* cmd_data) { |
| 9788 const gles2::cmds::GetActiveAttrib& c = | 9956 const gles2::cmds::GetActiveAttrib& c = |
| 9789 *static_cast<const gles2::cmds::GetActiveAttrib*>(cmd_data); | 9957 *static_cast<const gles2::cmds::GetActiveAttrib*>(cmd_data); |
| 9790 GLuint program_id = c.program; | 9958 GLuint program_id = c.program; |
| 9791 GLuint index = c.index; | 9959 GLuint index = c.index; |
| 9792 uint32 name_bucket_id = c.name_bucket_id; | 9960 uint32 name_bucket_id = c.name_bucket_id; |
| 9793 typedef cmds::GetActiveAttrib::Result Result; | 9961 typedef cmds::GetActiveAttrib::Result Result; |
| 9794 Result* result = GetSharedMemoryAs<Result*>( | 9962 Result* result = GetSharedMemoryAs<Result*>( |
| 9795 c.result_shm_id, c.result_shm_offset, sizeof(*result)); | 9963 c.result_shm_id, c.result_shm_offset, sizeof(*result)); |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10129 bucket->SetSize(sizeof(UniformBlocksHeader)); // in case we fail. | 10297 bucket->SetSize(sizeof(UniformBlocksHeader)); // in case we fail. |
| 10130 Program* program = NULL; | 10298 Program* program = NULL; |
| 10131 program = GetProgram(program_id); | 10299 program = GetProgram(program_id); |
| 10132 if (!program || !program->IsValid()) { | 10300 if (!program || !program->IsValid()) { |
| 10133 return error::kNoError; | 10301 return error::kNoError; |
| 10134 } | 10302 } |
| 10135 program->GetUniformBlocks(bucket); | 10303 program->GetUniformBlocks(bucket); |
| 10136 return error::kNoError; | 10304 return error::kNoError; |
| 10137 } | 10305 } |
| 10138 | 10306 |
| 10307 error::Error GLES2DecoderImpl::HandleGetUniformsES3CHROMIUM( |
| 10308 uint32 immediate_data_size, const void* cmd_data) { |
| 10309 if (!unsafe_es3_apis_enabled()) |
| 10310 return error::kUnknownCommand; |
| 10311 const gles2::cmds::GetUniformsES3CHROMIUM& c = |
| 10312 *static_cast<const gles2::cmds::GetUniformsES3CHROMIUM*>(cmd_data); |
| 10313 GLuint program_id = static_cast<GLuint>(c.program); |
| 10314 uint32 bucket_id = c.bucket_id; |
| 10315 Bucket* bucket = CreateBucket(bucket_id); |
| 10316 bucket->SetSize(sizeof(UniformsES3Header)); // in case we fail. |
| 10317 Program* program = NULL; |
| 10318 program = GetProgram(program_id); |
| 10319 if (!program || !program->IsValid()) { |
| 10320 return error::kNoError; |
| 10321 } |
| 10322 program->GetUniformsES3(bucket); |
| 10323 return error::kNoError; |
| 10324 } |
| 10325 |
| 10326 error::Error GLES2DecoderImpl::HandleGetTransformFeedbackVarying( |
| 10327 uint32 immediate_data_size, |
| 10328 const void* cmd_data) { |
| 10329 if (!unsafe_es3_apis_enabled()) |
| 10330 return error::kUnknownCommand; |
| 10331 const gles2::cmds::GetTransformFeedbackVarying& c = |
| 10332 *static_cast<const gles2::cmds::GetTransformFeedbackVarying*>(cmd_data); |
| 10333 GLuint program_id = c.program; |
| 10334 GLuint index = c.index; |
| 10335 uint32 name_bucket_id = c.name_bucket_id; |
| 10336 typedef cmds::GetTransformFeedbackVarying::Result Result; |
| 10337 Result* result = GetSharedMemoryAs<Result*>( |
| 10338 c.result_shm_id, c.result_shm_offset, sizeof(*result)); |
| 10339 if (!result) { |
| 10340 return error::kOutOfBounds; |
| 10341 } |
| 10342 // Check that the client initialized the result. |
| 10343 if (result->success != 0) { |
| 10344 return error::kInvalidArguments; |
| 10345 } |
| 10346 Program* program = GetProgramInfoNotShader( |
| 10347 program_id, "glGetTransformFeedbackVarying"); |
| 10348 if (!program) { |
| 10349 return error::kNoError; |
| 10350 } |
| 10351 GLuint service_id = program->service_id(); |
| 10352 GLint link_status = GL_FALSE; |
| 10353 glGetProgramiv(service_id, GL_LINK_STATUS, &link_status); |
| 10354 if (link_status != GL_TRUE) { |
| 10355 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, |
| 10356 "glGetTransformFeedbackVarying", "program not linked"); |
| 10357 return error::kNoError; |
| 10358 } |
| 10359 GLint max_length = 0; |
| 10360 glGetProgramiv( |
| 10361 service_id, GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH, &max_length); |
| 10362 max_length = std::max(1, max_length); |
| 10363 std::vector<char> buffer(max_length); |
| 10364 GLsizei length = 0; |
| 10365 GLsizei size = 0; |
| 10366 GLenum type = 0; |
| 10367 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetTransformFeedbackVarying"); |
| 10368 glGetTransformFeedbackVarying( |
| 10369 service_id, index, max_length, &length, &size, &type, &buffer[0]); |
| 10370 GLenum error = glGetError(); |
| 10371 if (error != GL_NO_ERROR) { |
| 10372 LOCAL_SET_GL_ERROR(error, "glGetTransformFeedbackVarying", ""); |
| 10373 return error::kNoError; |
| 10374 } |
| 10375 result->success = 1; // true. |
| 10376 result->size = static_cast<int32_t>(size); |
| 10377 result->type = static_cast<uint32_t>(type); |
| 10378 Bucket* bucket = CreateBucket(name_bucket_id); |
| 10379 DCHECK(length >= 0 && length < max_length); |
| 10380 buffer[length] = '\0'; // Just to be safe. |
| 10381 bucket->SetFromString(&buffer[0]); |
| 10382 return error::kNoError; |
| 10383 } |
| 10384 |
| 10385 error::Error GLES2DecoderImpl::HandleGetTransformFeedbackVaryingsCHROMIUM( |
| 10386 uint32 immediate_data_size, const void* cmd_data) { |
| 10387 if (!unsafe_es3_apis_enabled()) |
| 10388 return error::kUnknownCommand; |
| 10389 const gles2::cmds::GetTransformFeedbackVaryingsCHROMIUM& c = |
| 10390 *static_cast<const gles2::cmds::GetTransformFeedbackVaryingsCHROMIUM*>( |
| 10391 cmd_data); |
| 10392 GLuint program_id = static_cast<GLuint>(c.program); |
| 10393 uint32 bucket_id = c.bucket_id; |
| 10394 Bucket* bucket = CreateBucket(bucket_id); |
| 10395 bucket->SetSize(sizeof(TransformFeedbackVaryingsHeader)); // in case we fail. |
| 10396 Program* program = NULL; |
| 10397 program = GetProgram(program_id); |
| 10398 if (!program || !program->IsValid()) { |
| 10399 return error::kNoError; |
| 10400 } |
| 10401 program->GetTransformFeedbackVaryings(bucket); |
| 10402 return error::kNoError; |
| 10403 } |
| 10404 |
| 10139 error::ContextLostReason GLES2DecoderImpl::GetContextLostReason() { | 10405 error::ContextLostReason GLES2DecoderImpl::GetContextLostReason() { |
| 10140 switch (reset_status_) { | 10406 switch (reset_status_) { |
| 10141 case GL_NO_ERROR: | 10407 case GL_NO_ERROR: |
| 10142 // TODO(kbr): improve the precision of the error code in this case. | 10408 // TODO(kbr): improve the precision of the error code in this case. |
| 10143 // Consider delegating to context for error code if MakeCurrent fails. | 10409 // Consider delegating to context for error code if MakeCurrent fails. |
| 10144 return error::kUnknown; | 10410 return error::kUnknown; |
| 10145 case GL_GUILTY_CONTEXT_RESET_ARB: | 10411 case GL_GUILTY_CONTEXT_RESET_ARB: |
| 10146 return error::kGuilty; | 10412 return error::kGuilty; |
| 10147 case GL_INNOCENT_CONTEXT_RESET_ARB: | 10413 case GL_INNOCENT_CONTEXT_RESET_ARB: |
| 10148 return error::kInnocent; | 10414 return error::kInnocent; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 10165 #endif | 10431 #endif |
| 10166 exit(0); | 10432 exit(0); |
| 10167 } | 10433 } |
| 10168 } | 10434 } |
| 10169 | 10435 |
| 10170 bool GLES2DecoderImpl::WasContextLost() { | 10436 bool GLES2DecoderImpl::WasContextLost() { |
| 10171 if (reset_status_ != GL_NO_ERROR) { | 10437 if (reset_status_ != GL_NO_ERROR) { |
| 10172 MaybeExitOnContextLost(); | 10438 MaybeExitOnContextLost(); |
| 10173 return true; | 10439 return true; |
| 10174 } | 10440 } |
| 10175 if (context_->WasAllocatedUsingRobustnessExtension()) { | 10441 if (IsRobustnessSupported()) { |
| 10176 GLenum status = GL_NO_ERROR; | 10442 GLenum status = glGetGraphicsResetStatusARB(); |
| 10177 if (has_robustness_extension_) | |
| 10178 status = glGetGraphicsResetStatusARB(); | |
| 10179 if (status != GL_NO_ERROR) { | 10443 if (status != GL_NO_ERROR) { |
| 10180 // The graphics card was reset. Signal a lost context to the application. | 10444 // The graphics card was reset. Signal a lost context to the application. |
| 10181 reset_status_ = status; | 10445 reset_status_ = status; |
| 10182 reset_by_robustness_extension_ = true; | 10446 reset_by_robustness_extension_ = true; |
| 10183 LOG(ERROR) << (surface_->IsOffscreen() ? "Offscreen" : "Onscreen") | 10447 LOG(ERROR) << (surface_->IsOffscreen() ? "Offscreen" : "Onscreen") |
| 10184 << " context lost via ARB/EXT_robustness. Reset status = " | 10448 << " context lost via ARB/EXT_robustness. Reset status = " |
| 10185 << GLES2Util::GetStringEnum(status); | 10449 << GLES2Util::GetStringEnum(status); |
| 10186 MaybeExitOnContextLost(); | 10450 MaybeExitOnContextLost(); |
| 10187 return true; | 10451 return true; |
| 10188 } | 10452 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 10200 return; | 10464 return; |
| 10201 } | 10465 } |
| 10202 | 10466 |
| 10203 if (workarounds().use_virtualized_gl_contexts) { | 10467 if (workarounds().use_virtualized_gl_contexts) { |
| 10204 // If the context is virtual, the real context being guilty does not ensure | 10468 // If the context is virtual, the real context being guilty does not ensure |
| 10205 // that the virtual context is guilty. | 10469 // that the virtual context is guilty. |
| 10206 if (reset_status == GL_GUILTY_CONTEXT_RESET_ARB) { | 10470 if (reset_status == GL_GUILTY_CONTEXT_RESET_ARB) { |
| 10207 reset_status = GL_UNKNOWN_CONTEXT_RESET_ARB; | 10471 reset_status = GL_UNKNOWN_CONTEXT_RESET_ARB; |
| 10208 } | 10472 } |
| 10209 } else if (reset_status == GL_UNKNOWN_CONTEXT_RESET_ARB && | 10473 } else if (reset_status == GL_UNKNOWN_CONTEXT_RESET_ARB && |
| 10210 has_robustness_extension_) { | 10474 IsRobustnessSupported()) { |
| 10211 // If the reason for the call was a GL error, we can try to determine the | 10475 // If the reason for the call was a GL error, we can try to determine the |
| 10212 // reset status more accurately. | 10476 // reset status more accurately. |
| 10213 GLenum driver_status = glGetGraphicsResetStatusARB(); | 10477 GLenum driver_status = glGetGraphicsResetStatusARB(); |
| 10214 if (driver_status == GL_GUILTY_CONTEXT_RESET_ARB || | 10478 if (driver_status == GL_GUILTY_CONTEXT_RESET_ARB || |
| 10215 driver_status == GL_INNOCENT_CONTEXT_RESET_ARB) { | 10479 driver_status == GL_INNOCENT_CONTEXT_RESET_ARB) { |
| 10216 reset_status = driver_status; | 10480 reset_status = driver_status; |
| 10217 } | 10481 } |
| 10218 } | 10482 } |
| 10219 | 10483 |
| 10220 // Marks this context as lost. | 10484 // Marks this context as lost. |
| (...skipping 1544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11765 error::Error GLES2DecoderImpl::HandleWaitAllAsyncTexImage2DCHROMIUM( | 12029 error::Error GLES2DecoderImpl::HandleWaitAllAsyncTexImage2DCHROMIUM( |
| 11766 uint32 immediate_data_size, | 12030 uint32 immediate_data_size, |
| 11767 const void* data) { | 12031 const void* data) { |
| 11768 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleWaitAsyncTexImage2DCHROMIUM"); | 12032 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleWaitAsyncTexImage2DCHROMIUM"); |
| 11769 | 12033 |
| 11770 GetAsyncPixelTransferManager()->WaitAllAsyncTexImage2D(); | 12034 GetAsyncPixelTransferManager()->WaitAllAsyncTexImage2D(); |
| 11771 ProcessFinishedAsyncTransfers(); | 12035 ProcessFinishedAsyncTransfers(); |
| 11772 return error::kNoError; | 12036 return error::kNoError; |
| 11773 } | 12037 } |
| 11774 | 12038 |
| 12039 error::Error GLES2DecoderImpl::HandleUniformBlockBinding( |
| 12040 uint32_t immediate_data_size, const void* cmd_data) { |
| 12041 if (!unsafe_es3_apis_enabled()) |
| 12042 return error::kUnknownCommand; |
| 12043 const gles2::cmds::UniformBlockBinding& c = |
| 12044 *static_cast<const gles2::cmds::UniformBlockBinding*>(cmd_data); |
| 12045 GLuint client_id = c.program; |
| 12046 GLuint index = static_cast<GLuint>(c.index); |
| 12047 GLuint binding = static_cast<GLuint>(c.binding); |
| 12048 Program* program = GetProgramInfoNotShader( |
| 12049 client_id, "glUniformBlockBinding"); |
| 12050 if (!program) { |
| 12051 return error::kNoError; |
| 12052 } |
| 12053 GLuint service_id = program->service_id(); |
| 12054 glUniformBlockBinding(service_id, index, binding); |
| 12055 return error::kNoError; |
| 12056 } |
| 12057 |
| 11775 void GLES2DecoderImpl::OnTextureRefDetachedFromFramebuffer( | 12058 void GLES2DecoderImpl::OnTextureRefDetachedFromFramebuffer( |
| 11776 TextureRef* texture_ref) { | 12059 TextureRef* texture_ref) { |
| 11777 Texture* texture = texture_ref->texture(); | 12060 Texture* texture = texture_ref->texture(); |
| 11778 DoDidUseTexImageIfNeeded(texture, texture->target()); | 12061 DoDidUseTexImageIfNeeded(texture, texture->target()); |
| 11779 } | 12062 } |
| 11780 | 12063 |
| 11781 void GLES2DecoderImpl::OnContextLostError() { | 12064 void GLES2DecoderImpl::OnContextLostError() { |
| 11782 group_->LoseContexts(GL_UNKNOWN_CONTEXT_RESET_ARB); | 12065 group_->LoseContexts(GL_UNKNOWN_CONTEXT_RESET_ARB); |
| 11783 } | 12066 } |
| 11784 | 12067 |
| 11785 void GLES2DecoderImpl::OnOutOfMemoryError() { | 12068 void GLES2DecoderImpl::OnOutOfMemoryError() { |
| 11786 if (lose_context_when_out_of_memory_) { | 12069 if (lose_context_when_out_of_memory_) { |
| 11787 group_->LoseContexts(GL_UNKNOWN_CONTEXT_RESET_ARB); | 12070 group_->LoseContexts(GL_UNKNOWN_CONTEXT_RESET_ARB); |
| 11788 } | 12071 } |
| 11789 } | 12072 } |
| 11790 | 12073 |
| 11791 // Include the auto-generated part of this file. We split this because it means | 12074 // Include the auto-generated part of this file. We split this because it means |
| 11792 // we can easily edit the non-auto generated parts right here in this file | 12075 // we can easily edit the non-auto generated parts right here in this file |
| 11793 // instead of having to edit some template or the code generator. | 12076 // instead of having to edit some template or the code generator. |
| 11794 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 12077 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 11795 | 12078 |
| 11796 } // namespace gles2 | 12079 } // namespace gles2 |
| 11797 } // namespace gpu | 12080 } // namespace gpu |
| OLD | NEW |