OLD | NEW |
---|---|
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
701 GLenum bind_target; | 701 GLenum bind_target; |
702 | 702 |
703 // texture currently bound to this unit's GL_TEXTURE_2D with glBindTexture | 703 // texture currently bound to this unit's GL_TEXTURE_2D with glBindTexture |
704 TextureManager::TextureInfo::Ref bound_texture_2d; | 704 TextureManager::TextureInfo::Ref bound_texture_2d; |
705 | 705 |
706 // texture currently bound to this unit's GL_TEXTURE_CUBE_MAP with | 706 // texture currently bound to this unit's GL_TEXTURE_CUBE_MAP with |
707 // glBindTexture | 707 // glBindTexture |
708 TextureManager::TextureInfo::Ref bound_texture_cube_map; | 708 TextureManager::TextureInfo::Ref bound_texture_cube_map; |
709 }; | 709 }; |
710 | 710 |
711 // Initialize or re-initialize the shader translator. | |
712 bool InitializeShaderTranslator(); | |
713 | |
711 // Helpers for the glGen and glDelete functions. | 714 // Helpers for the glGen and glDelete functions. |
712 bool GenTexturesHelper(GLsizei n, const GLuint* client_ids); | 715 bool GenTexturesHelper(GLsizei n, const GLuint* client_ids); |
713 void DeleteTexturesHelper(GLsizei n, const GLuint* client_ids); | 716 void DeleteTexturesHelper(GLsizei n, const GLuint* client_ids); |
714 bool GenBuffersHelper(GLsizei n, const GLuint* client_ids); | 717 bool GenBuffersHelper(GLsizei n, const GLuint* client_ids); |
715 void DeleteBuffersHelper(GLsizei n, const GLuint* client_ids); | 718 void DeleteBuffersHelper(GLsizei n, const GLuint* client_ids); |
716 bool GenFramebuffersHelper(GLsizei n, const GLuint* client_ids); | 719 bool GenFramebuffersHelper(GLsizei n, const GLuint* client_ids); |
717 void DeleteFramebuffersHelper(GLsizei n, const GLuint* client_ids); | 720 void DeleteFramebuffersHelper(GLsizei n, const GLuint* client_ids); |
718 bool GenRenderbuffersHelper(GLsizei n, const GLuint* client_ids); | 721 bool GenRenderbuffersHelper(GLsizei n, const GLuint* client_ids); |
719 void DeleteRenderbuffersHelper(GLsizei n, const GLuint* client_ids); | 722 void DeleteRenderbuffersHelper(GLsizei n, const GLuint* client_ids); |
720 | 723 |
(...skipping 1039 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1760 offscreen_saved_color_format_(0), | 1763 offscreen_saved_color_format_(0), |
1761 current_decoder_error_(error::kNoError), | 1764 current_decoder_error_(error::kNoError), |
1762 use_shader_translator_(true), | 1765 use_shader_translator_(true), |
1763 validators_(group_->feature_info()->validators()), | 1766 validators_(group_->feature_info()->validators()), |
1764 feature_info_(group_->feature_info()) { | 1767 feature_info_(group_->feature_info()) { |
1765 attrib_0_value_.v[0] = 0.0f; | 1768 attrib_0_value_.v[0] = 0.0f; |
1766 attrib_0_value_.v[1] = 0.0f; | 1769 attrib_0_value_.v[1] = 0.0f; |
1767 attrib_0_value_.v[2] = 0.0f; | 1770 attrib_0_value_.v[2] = 0.0f; |
1768 attrib_0_value_.v[3] = 1.0f; | 1771 attrib_0_value_.v[3] = 1.0f; |
1769 | 1772 |
1770 // The shader translator is not needed for EGL because it already uses the | 1773 // The shader translator is used for WebGL even when running on EGL |
1771 // GLSL ES syntax. It is translated for the unit tests because | 1774 // because additional restrictions are needed (like only enabling |
1772 // GLES2DecoderWithShaderTest.GetShaderInfoLogValidArgs passes the empty | 1775 // GL_OES_standard_derivatives on demand). It is used for the unit |
1773 // string to CompileShader and this is not a valid shader. TODO(apatrick): | 1776 // tests because |
1774 // fix this test. | 1777 // GLES2DecoderWithShaderTest.GetShaderInfoLogValidArgs passes the |
1775 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 || | 1778 // empty string to CompileShader and this is not a valid shader. |
1779 // TODO(apatrick): fix this test. | |
1780 if ((gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 && | |
1781 !feature_info_->feature_flags().chromium_webglsl) || | |
1776 gfx::GetGLImplementation() == gfx::kGLImplementationMockGL) { | 1782 gfx::GetGLImplementation() == gfx::kGLImplementationMockGL) { |
1777 use_shader_translator_ = false; | 1783 use_shader_translator_ = false; |
1778 } | 1784 } |
1779 } | 1785 } |
1780 | 1786 |
1781 bool GLES2DecoderImpl::Initialize(gfx::GLContext* context, | 1787 bool GLES2DecoderImpl::Initialize(gfx::GLContext* context, |
1782 const gfx::Size& size, | 1788 const gfx::Size& size, |
1783 const char* allowed_extensions, | 1789 const char* allowed_extensions, |
1784 const std::vector<int32>& attribs, | 1790 const std::vector<int32>& attribs, |
1785 GLES2Decoder* parent, | 1791 GLES2Decoder* parent, |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1974 // VERTEX_PROGRAM_POINT_SIZE and doesn't expose this enum. This fact | 1980 // VERTEX_PROGRAM_POINT_SIZE and doesn't expose this enum. This fact |
1975 // isn't well documented; it was discovered in the Khronos OpenGL ES | 1981 // isn't well documented; it was discovered in the Khronos OpenGL ES |
1976 // mailing list archives. It also implicitly enables the desktop GL | 1982 // mailing list archives. It also implicitly enables the desktop GL |
1977 // capability GL_POINT_SPRITE to provide access to the gl_PointCoord | 1983 // capability GL_POINT_SPRITE to provide access to the gl_PointCoord |
1978 // variable in fragment shaders. | 1984 // variable in fragment shaders. |
1979 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { | 1985 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { |
1980 glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); | 1986 glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); |
1981 glEnable(GL_POINT_SPRITE); | 1987 glEnable(GL_POINT_SPRITE); |
1982 } | 1988 } |
1983 | 1989 |
1984 if (use_shader_translator_) { | 1990 if (!InitializeShaderTranslator()) { |
1985 ShBuiltInResources resources; | 1991 return false; |
1986 ShInitBuiltInResources(&resources); | |
1987 resources.MaxVertexAttribs = group_->max_vertex_attribs(); | |
1988 resources.MaxVertexUniformVectors = | |
1989 group_->max_vertex_uniform_vectors(); | |
1990 resources.MaxVaryingVectors = group_->max_varying_vectors(); | |
1991 resources.MaxVertexTextureImageUnits = | |
1992 group_->max_vertex_texture_image_units(); | |
1993 resources.MaxCombinedTextureImageUnits = group_->max_texture_units(); | |
1994 resources.MaxTextureImageUnits = group_->max_texture_image_units(); | |
1995 resources.MaxFragmentUniformVectors = | |
1996 group_->max_fragment_uniform_vectors(); | |
1997 resources.MaxDrawBuffers = 1; | |
1998 resources.OES_standard_derivatives = | |
1999 feature_info_->feature_flags().oes_standard_derivatives ? 1 : 0; | |
2000 vertex_translator_.reset(new ShaderTranslator); | |
2001 ShShaderSpec shader_spec = feature_info_->feature_flags().chromium_webglsl ? | |
2002 SH_WEBGL_SPEC : SH_GLES2_SPEC; | |
2003 if (!vertex_translator_->Init(SH_VERTEX_SHADER, shader_spec, &resources)) { | |
2004 LOG(ERROR) << "Could not initialize vertex shader translator."; | |
2005 Destroy(); | |
2006 return false; | |
2007 } | |
2008 fragment_translator_.reset(new ShaderTranslator); | |
2009 if (!fragment_translator_->Init( | |
2010 SH_FRAGMENT_SHADER, shader_spec, &resources)) { | |
2011 LOG(ERROR) << "Could not initialize fragment shader translator."; | |
2012 Destroy(); | |
2013 return false; | |
2014 } | |
2015 } | 1992 } |
2016 | 1993 |
2017 return true; | 1994 return true; |
2018 } | 1995 } |
2019 | 1996 |
1997 bool GLES2DecoderImpl::InitializeShaderTranslator() { | |
1998 // Re-check the state of use_shader_translator_ each time this is called. | |
1999 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 && | |
2000 feature_info_->feature_flags().chromium_webglsl && | |
2001 !use_shader_translator_) { | |
2002 use_shader_translator_ = true; | |
2003 } | |
2004 if (!use_shader_translator_) { | |
2005 return true; | |
2006 } | |
2007 ShBuiltInResources resources; | |
2008 ShInitBuiltInResources(&resources); | |
2009 resources.MaxVertexAttribs = group_->max_vertex_attribs(); | |
2010 resources.MaxVertexUniformVectors = | |
2011 group_->max_vertex_uniform_vectors(); | |
2012 resources.MaxVaryingVectors = group_->max_varying_vectors(); | |
2013 resources.MaxVertexTextureImageUnits = | |
2014 group_->max_vertex_texture_image_units(); | |
2015 resources.MaxCombinedTextureImageUnits = group_->max_texture_units(); | |
2016 resources.MaxTextureImageUnits = group_->max_texture_image_units(); | |
2017 resources.MaxFragmentUniformVectors = | |
2018 group_->max_fragment_uniform_vectors(); | |
2019 resources.MaxDrawBuffers = 1; | |
2020 resources.OES_standard_derivatives = | |
2021 feature_info_->feature_flags().oes_standard_derivatives ? 1 : 0; | |
2022 vertex_translator_.reset(new ShaderTranslator); | |
2023 ShShaderSpec shader_spec = feature_info_->feature_flags().chromium_webglsl ? | |
2024 SH_WEBGL_SPEC : SH_GLES2_SPEC; | |
2025 bool is_glsl_es = | |
2026 gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2; | |
2027 if (!vertex_translator_->Init( | |
2028 SH_VERTEX_SHADER, shader_spec, &resources, is_glsl_es)) { | |
2029 LOG(ERROR) << "Could not initialize vertex shader translator."; | |
2030 Destroy(); | |
2031 return false; | |
2032 } | |
2033 fragment_translator_.reset(new ShaderTranslator); | |
2034 if (!fragment_translator_->Init( | |
2035 SH_FRAGMENT_SHADER, shader_spec, &resources, is_glsl_es)) { | |
2036 LOG(ERROR) << "Could not initialize fragment shader translator."; | |
2037 Destroy(); | |
2038 return false; | |
2039 } | |
2040 return true; | |
2041 } | |
2042 | |
2020 bool GLES2DecoderImpl::GenBuffersHelper(GLsizei n, const GLuint* client_ids) { | 2043 bool GLES2DecoderImpl::GenBuffersHelper(GLsizei n, const GLuint* client_ids) { |
2021 for (GLsizei ii = 0; ii < n; ++ii) { | 2044 for (GLsizei ii = 0; ii < n; ++ii) { |
2022 if (GetBufferInfo(client_ids[ii])) { | 2045 if (GetBufferInfo(client_ids[ii])) { |
2023 return false; | 2046 return false; |
2024 } | 2047 } |
2025 } | 2048 } |
2026 scoped_array<GLuint> service_ids(new GLuint[n]); | 2049 scoped_array<GLuint> service_ids(new GLuint[n]); |
2027 glGenBuffersARB(n, service_ids.get()); | 2050 glGenBuffersARB(n, service_ids.get()); |
2028 for (GLsizei ii = 0; ii < n; ++ii) { | 2051 for (GLsizei ii = 0; ii < n; ++ii) { |
2029 CreateBufferInfo(client_ids[ii], service_ids[ii]); | 2052 CreateBufferInfo(client_ids[ii], service_ids[ii]); |
(...skipping 3898 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5928 } else if (feature_str.compare(PEPPER3D_SKIP_GLSL_TRANSLATION) == 0) { | 5951 } else if (feature_str.compare(PEPPER3D_SKIP_GLSL_TRANSLATION) == 0) { |
5929 use_shader_translator_ = false; | 5952 use_shader_translator_ = false; |
5930 } else { | 5953 } else { |
5931 return error::kNoError; | 5954 return error::kNoError; |
5932 } | 5955 } |
5933 | 5956 |
5934 *result = 1; // true. | 5957 *result = 1; // true. |
5935 return error::kNoError; | 5958 return error::kNoError; |
5936 } | 5959 } |
5937 | 5960 |
5961 error::Error GLES2DecoderImpl::HandleGetRequestableExtensionsCHROMIUM( | |
5962 uint32 immediate_data_size, | |
5963 const gles2::GetRequestableExtensionsCHROMIUM& c) { | |
5964 Bucket* bucket = CreateBucket(c.bucket_id); | |
5965 const char* str = feature_info_->RequestableExtensions().c_str(); | |
5966 bucket->SetFromString(str); | |
5967 return error::kNoError; | |
5968 } | |
5969 | |
5970 error::Error GLES2DecoderImpl::HandleRequestExtensionCHROMIUM( | |
5971 uint32 immediate_data_size, const gles2::RequestExtensionCHROMIUM& c) { | |
5972 Bucket* bucket = GetBucket(c.bucket_id); | |
5973 std::string feature_str; | |
5974 if (!bucket->GetAsString(&feature_str)) { | |
5975 return error::kInvalidArguments; | |
5976 } | |
5977 | |
5978 feature_info_->AddFeatures(feature_str.c_str()); | |
5979 | |
5980 // If we just enabled a feature which affects the shader translator, | |
5981 // we may need to re-initialize it. | |
5982 if (feature_str == "GL_OES_standard_derivatives" || | |
greggman
2010/12/04 01:28:44
FeatureInfo::AddFeatures works with multiple featu
| |
5983 feature_str == "GL_CHROMIUM_webglsl") { | |
5984 InitializeShaderTranslator(); | |
5985 } | |
5986 | |
5987 return error::kNoError; | |
5988 } | |
5989 | |
5938 // Include the auto-generated part of this file. We split this because it means | 5990 // Include the auto-generated part of this file. We split this because it means |
5939 // we can easily edit the non-auto generated parts right here in this file | 5991 // we can easily edit the non-auto generated parts right here in this file |
5940 // instead of having to edit some template or the code generator. | 5992 // instead of having to edit some template or the code generator. |
5941 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 5993 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
5942 | 5994 |
5943 } // namespace gles2 | 5995 } // namespace gles2 |
5944 } // namespace gpu | 5996 } // namespace gpu |
OLD | NEW |