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 |