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

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

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
6 6
7 #include <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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/common_decoder.cc ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698