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 6816 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6827 // memory.) | 6827 // memory.) |
6828 error::Error GLES2DecoderImpl::ShaderSourceHelper( | 6828 error::Error GLES2DecoderImpl::ShaderSourceHelper( |
6829 GLuint client_id, const char* data, uint32 data_size) { | 6829 GLuint client_id, const char* data, uint32 data_size) { |
6830 std::string str(data, data + data_size); | 6830 std::string str(data, data + data_size); |
6831 Shader* shader = GetShaderInfoNotProgram(client_id, "glShaderSource"); | 6831 Shader* shader = GetShaderInfoNotProgram(client_id, "glShaderSource"); |
6832 if (!shader) { | 6832 if (!shader) { |
6833 return error::kNoError; | 6833 return error::kNoError; |
6834 } | 6834 } |
6835 // Note: We don't actually call glShaderSource here. We wait until | 6835 // Note: We don't actually call glShaderSource here. We wait until |
6836 // the call to glCompileShader. | 6836 // the call to glCompileShader. |
6837 shader->UpdateSource(str.c_str()); | 6837 shader->set_source(str); |
6838 return error::kNoError; | 6838 return error::kNoError; |
6839 } | 6839 } |
6840 | 6840 |
6841 error::Error GLES2DecoderImpl::HandleShaderSourceBucket( | 6841 error::Error GLES2DecoderImpl::HandleShaderSourceBucket( |
6842 uint32 immediate_data_size, | 6842 uint32 immediate_data_size, |
6843 const void* cmd_data) { | 6843 const void* cmd_data) { |
6844 const gles2::cmds::ShaderSourceBucket& c = | 6844 const gles2::cmds::ShaderSourceBucket& c = |
6845 *static_cast<const gles2::cmds::ShaderSourceBucket*>(cmd_data); | 6845 *static_cast<const gles2::cmds::ShaderSourceBucket*>(cmd_data); |
6846 Bucket* bucket = GetBucket(c.data_bucket_id); | 6846 Bucket* bucket = GetBucket(c.data_bucket_id); |
6847 if (!bucket || bucket->size() == 0) { | 6847 if (!bucket || bucket->size() == 0) { |
6848 return error::kInvalidArguments; | 6848 return error::kInvalidArguments; |
6849 } | 6849 } |
6850 return ShaderSourceHelper( | 6850 return ShaderSourceHelper( |
6851 c.shader, bucket->GetDataAs<const char*>(0, bucket->size() - 1), | 6851 c.shader, bucket->GetDataAs<const char*>(0, bucket->size() - 1), |
6852 bucket->size() - 1); | 6852 bucket->size() - 1); |
6853 } | 6853 } |
6854 | 6854 |
6855 void GLES2DecoderImpl::DoCompileShader(GLuint client_id) { | 6855 void GLES2DecoderImpl::DoCompileShader(GLuint client_id) { |
6856 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompileShader"); | 6856 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompileShader"); |
6857 Shader* shader = GetShaderInfoNotProgram(client_id, "glCompileShader"); | 6857 Shader* shader = GetShaderInfoNotProgram(client_id, "glCompileShader"); |
6858 if (!shader) { | 6858 if (!shader) { |
6859 return; | 6859 return; |
6860 } | 6860 } |
6861 ShaderTranslator* translator = NULL; | 6861 ShaderTranslator* translator = NULL; |
6862 if (use_shader_translator_) { | 6862 if (use_shader_translator_) { |
6863 translator = shader->shader_type() == GL_VERTEX_SHADER ? | 6863 translator = shader->shader_type() == GL_VERTEX_SHADER ? |
6864 vertex_translator_.get() : fragment_translator_.get(); | 6864 vertex_translator_.get() : fragment_translator_.get(); |
6865 } | 6865 } |
6866 | 6866 |
6867 program_manager()->DoCompileShader( | 6867 shader->DoCompile( |
6868 shader, | |
6869 translator, | 6868 translator, |
6870 feature_info_->feature_flags().angle_translated_shader_source ? | 6869 feature_info_->feature_flags().angle_translated_shader_source ? |
6871 ProgramManager::kANGLE : ProgramManager::kGL); | 6870 Shader::kANGLE : Shader::kGL); |
6872 | 6871 |
6873 // CompileShader can be very slow. Exit command processing to allow for | 6872 // CompileShader can be very slow. Exit command processing to allow for |
6874 // context preemption and GPU watchdog checks. | 6873 // context preemption and GPU watchdog checks. |
6875 ExitCommandProcessingEarly(); | 6874 ExitCommandProcessingEarly(); |
6876 } | 6875 } |
6877 | 6876 |
6878 void GLES2DecoderImpl::DoGetShaderiv( | 6877 void GLES2DecoderImpl::DoGetShaderiv( |
6879 GLuint shader_id, GLenum pname, GLint* params) { | 6878 GLuint shader_id, GLenum pname, GLint* params) { |
6880 Shader* shader = GetShaderInfoNotProgram(shader_id, "glGetShaderiv"); | 6879 Shader* shader = GetShaderInfoNotProgram(shader_id, "glGetShaderiv"); |
6881 if (!shader) { | 6880 if (!shader) { |
6882 return; | 6881 return; |
6883 } | 6882 } |
6884 switch (pname) { | 6883 switch (pname) { |
6885 case GL_SHADER_SOURCE_LENGTH: | 6884 case GL_SHADER_SOURCE_LENGTH: |
6886 *params = shader->source() ? shader->source()->size() + 1 : 0; | 6885 *params = shader->source().size(); |
| 6886 if (*params) |
| 6887 ++(*params); |
6887 return; | 6888 return; |
6888 case GL_COMPILE_STATUS: | 6889 case GL_COMPILE_STATUS: |
6889 *params = compile_shader_always_succeeds_ ? true : shader->IsValid(); | 6890 *params = compile_shader_always_succeeds_ ? true : shader->valid(); |
6890 return; | 6891 return; |
6891 case GL_INFO_LOG_LENGTH: | 6892 case GL_INFO_LOG_LENGTH: |
6892 *params = shader->log_info() ? shader->log_info()->size() + 1 : 0; | 6893 *params = shader->log_info().size(); |
| 6894 if (*params) |
| 6895 ++(*params); |
6893 return; | 6896 return; |
6894 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE: | 6897 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE: |
6895 *params = shader->translated_source() ? | 6898 *params = shader->translated_source().size(); |
6896 shader->translated_source()->size() + 1 : 0; | 6899 if (*params) |
| 6900 ++(*params); |
6897 return; | 6901 return; |
6898 default: | 6902 default: |
6899 break; | 6903 break; |
6900 } | 6904 } |
6901 glGetShaderiv(shader->service_id(), pname, params); | 6905 glGetShaderiv(shader->service_id(), pname, params); |
6902 } | 6906 } |
6903 | 6907 |
6904 error::Error GLES2DecoderImpl::HandleGetShaderSource(uint32 immediate_data_size, | 6908 error::Error GLES2DecoderImpl::HandleGetShaderSource(uint32 immediate_data_size, |
6905 const void* cmd_data) { | 6909 const void* cmd_data) { |
6906 const gles2::cmds::GetShaderSource& c = | 6910 const gles2::cmds::GetShaderSource& c = |
6907 *static_cast<const gles2::cmds::GetShaderSource*>(cmd_data); | 6911 *static_cast<const gles2::cmds::GetShaderSource*>(cmd_data); |
6908 GLuint shader_id = c.shader; | 6912 GLuint shader_id = c.shader; |
6909 uint32 bucket_id = static_cast<uint32>(c.bucket_id); | 6913 uint32 bucket_id = static_cast<uint32>(c.bucket_id); |
6910 Bucket* bucket = CreateBucket(bucket_id); | 6914 Bucket* bucket = CreateBucket(bucket_id); |
6911 Shader* shader = GetShaderInfoNotProgram(shader_id, "glGetShaderSource"); | 6915 Shader* shader = GetShaderInfoNotProgram(shader_id, "glGetShaderSource"); |
6912 if (!shader || !shader->source()) { | 6916 if (!shader || shader->source().empty()) { |
6913 bucket->SetSize(0); | 6917 bucket->SetSize(0); |
6914 return error::kNoError; | 6918 return error::kNoError; |
6915 } | 6919 } |
6916 bucket->SetFromString(shader->source()->c_str()); | 6920 bucket->SetFromString(shader->source().c_str()); |
6917 return error::kNoError; | 6921 return error::kNoError; |
6918 } | 6922 } |
6919 | 6923 |
6920 error::Error GLES2DecoderImpl::HandleGetTranslatedShaderSourceANGLE( | 6924 error::Error GLES2DecoderImpl::HandleGetTranslatedShaderSourceANGLE( |
6921 uint32 immediate_data_size, | 6925 uint32 immediate_data_size, |
6922 const void* cmd_data) { | 6926 const void* cmd_data) { |
6923 const gles2::cmds::GetTranslatedShaderSourceANGLE& c = | 6927 const gles2::cmds::GetTranslatedShaderSourceANGLE& c = |
6924 *static_cast<const gles2::cmds::GetTranslatedShaderSourceANGLE*>( | 6928 *static_cast<const gles2::cmds::GetTranslatedShaderSourceANGLE*>( |
6925 cmd_data); | 6929 cmd_data); |
6926 GLuint shader_id = c.shader; | 6930 GLuint shader_id = c.shader; |
6927 uint32 bucket_id = static_cast<uint32>(c.bucket_id); | 6931 uint32 bucket_id = static_cast<uint32>(c.bucket_id); |
6928 Bucket* bucket = CreateBucket(bucket_id); | 6932 Bucket* bucket = CreateBucket(bucket_id); |
6929 Shader* shader = GetShaderInfoNotProgram( | 6933 Shader* shader = GetShaderInfoNotProgram( |
6930 shader_id, "glGetTranslatedShaderSourceANGLE"); | 6934 shader_id, "glGetTranslatedShaderSourceANGLE"); |
6931 if (!shader) { | 6935 if (!shader) { |
6932 bucket->SetSize(0); | 6936 bucket->SetSize(0); |
6933 return error::kNoError; | 6937 return error::kNoError; |
6934 } | 6938 } |
6935 | 6939 |
6936 bucket->SetFromString(shader->translated_source() ? | 6940 bucket->SetFromString(shader->translated_source().c_str()); |
6937 shader->translated_source()->c_str() : NULL); | |
6938 return error::kNoError; | 6941 return error::kNoError; |
6939 } | 6942 } |
6940 | 6943 |
6941 error::Error GLES2DecoderImpl::HandleGetProgramInfoLog( | 6944 error::Error GLES2DecoderImpl::HandleGetProgramInfoLog( |
6942 uint32 immediate_data_size, | 6945 uint32 immediate_data_size, |
6943 const void* cmd_data) { | 6946 const void* cmd_data) { |
6944 const gles2::cmds::GetProgramInfoLog& c = | 6947 const gles2::cmds::GetProgramInfoLog& c = |
6945 *static_cast<const gles2::cmds::GetProgramInfoLog*>(cmd_data); | 6948 *static_cast<const gles2::cmds::GetProgramInfoLog*>(cmd_data); |
6946 GLuint program_id = c.program; | 6949 GLuint program_id = c.program; |
6947 uint32 bucket_id = static_cast<uint32>(c.bucket_id); | 6950 uint32 bucket_id = static_cast<uint32>(c.bucket_id); |
(...skipping 10 matching lines...) Expand all Loading... |
6958 | 6961 |
6959 error::Error GLES2DecoderImpl::HandleGetShaderInfoLog( | 6962 error::Error GLES2DecoderImpl::HandleGetShaderInfoLog( |
6960 uint32 immediate_data_size, | 6963 uint32 immediate_data_size, |
6961 const void* cmd_data) { | 6964 const void* cmd_data) { |
6962 const gles2::cmds::GetShaderInfoLog& c = | 6965 const gles2::cmds::GetShaderInfoLog& c = |
6963 *static_cast<const gles2::cmds::GetShaderInfoLog*>(cmd_data); | 6966 *static_cast<const gles2::cmds::GetShaderInfoLog*>(cmd_data); |
6964 GLuint shader_id = c.shader; | 6967 GLuint shader_id = c.shader; |
6965 uint32 bucket_id = static_cast<uint32>(c.bucket_id); | 6968 uint32 bucket_id = static_cast<uint32>(c.bucket_id); |
6966 Bucket* bucket = CreateBucket(bucket_id); | 6969 Bucket* bucket = CreateBucket(bucket_id); |
6967 Shader* shader = GetShaderInfoNotProgram(shader_id, "glGetShaderInfoLog"); | 6970 Shader* shader = GetShaderInfoNotProgram(shader_id, "glGetShaderInfoLog"); |
6968 if (!shader || !shader->log_info()) { | 6971 if (!shader) { |
6969 bucket->SetFromString(""); | 6972 bucket->SetFromString(""); |
6970 return error::kNoError; | 6973 return error::kNoError; |
6971 } | 6974 } |
6972 bucket->SetFromString(shader->log_info()->c_str()); | 6975 bucket->SetFromString(shader->log_info().c_str()); |
6973 return error::kNoError; | 6976 return error::kNoError; |
6974 } | 6977 } |
6975 | 6978 |
6976 bool GLES2DecoderImpl::DoIsEnabled(GLenum cap) { | 6979 bool GLES2DecoderImpl::DoIsEnabled(GLenum cap) { |
6977 return state_.GetEnabled(cap); | 6980 return state_.GetEnabled(cap); |
6978 } | 6981 } |
6979 | 6982 |
6980 bool GLES2DecoderImpl::DoIsBuffer(GLuint client_id) { | 6983 bool GLES2DecoderImpl::DoIsBuffer(GLuint client_id) { |
6981 const Buffer* buffer = GetBuffer(client_id); | 6984 const Buffer* buffer = GetBuffer(client_id); |
6982 return buffer && buffer->IsValid() && !buffer->IsDeleted(); | 6985 return buffer && buffer->IsValid() && !buffer->IsDeleted(); |
(...skipping 4255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11238 } | 11241 } |
11239 } | 11242 } |
11240 | 11243 |
11241 // Include the auto-generated part of this file. We split this because it means | 11244 // Include the auto-generated part of this file. We split this because it means |
11242 // we can easily edit the non-auto generated parts right here in this file | 11245 // we can easily edit the non-auto generated parts right here in this file |
11243 // instead of having to edit some template or the code generator. | 11246 // instead of having to edit some template or the code generator. |
11244 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 11247 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
11245 | 11248 |
11246 } // namespace gles2 | 11249 } // namespace gles2 |
11247 } // namespace gpu | 11250 } // namespace gpu |
OLD | NEW |