Commit a6739bcd authored by zmo@chromium.org's avatar zmo@chromium.org

Add driver bug workaround for SH_INIT_GL_POSITION.

BUG=286468
TEST=webgl conformance tests (1.0.3), gpu_unittests

Review URL: https://chromiumcodereview.appspot.com/23441050

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221895 0039d316-1c4b-4281-b951-d872f2087c98
parent d3b9651b
...@@ -2509,15 +2509,18 @@ bool GLES2DecoderImpl::InitializeShaderTranslator() { ...@@ -2509,15 +2509,18 @@ bool GLES2DecoderImpl::InitializeShaderTranslator() {
ShaderTranslatorInterface::GlslImplementationType implementation_type = ShaderTranslatorInterface::GlslImplementationType implementation_type =
gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 ? gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 ?
ShaderTranslatorInterface::kGlslES : ShaderTranslatorInterface::kGlsl; ShaderTranslatorInterface::kGlslES : ShaderTranslatorInterface::kGlsl;
ShaderTranslatorInterface::GlslBuiltInFunctionBehavior function_behavior = int driver_bug_workarounds = 0;
workarounds().needs_glsl_built_in_function_emulation ? if (workarounds().needs_glsl_built_in_function_emulation)
ShaderTranslatorInterface::kGlslBuiltInFunctionEmulated : driver_bug_workarounds |= SH_EMULATE_BUILT_IN_FUNCTIONS;
ShaderTranslatorInterface::kGlslBuiltInFunctionOriginal; // TODO(zmo): Uncomment the below two lines when ANGLE CL is rolled in.
// if (workarounds().init_gl_position_in_vertex_shader)
// driver_bug_workarounds |= SH_INIT_GL_POSITION;
ShaderTranslatorCache* cache = ShaderTranslatorCache::GetInstance(); ShaderTranslatorCache* cache = ShaderTranslatorCache::GetInstance();
vertex_translator_ = cache->GetTranslator( vertex_translator_ = cache->GetTranslator(
SH_VERTEX_SHADER, shader_spec, &resources, SH_VERTEX_SHADER, shader_spec, &resources,
implementation_type, function_behavior); implementation_type,
static_cast<ShCompileOptions>(driver_bug_workarounds));
if (!vertex_translator_.get()) { if (!vertex_translator_.get()) {
LOG(ERROR) << "Could not initialize vertex shader translator."; LOG(ERROR) << "Could not initialize vertex shader translator.";
Destroy(true); Destroy(true);
...@@ -2526,7 +2529,8 @@ bool GLES2DecoderImpl::InitializeShaderTranslator() { ...@@ -2526,7 +2529,8 @@ bool GLES2DecoderImpl::InitializeShaderTranslator() {
fragment_translator_ = cache->GetTranslator( fragment_translator_ = cache->GetTranslator(
SH_FRAGMENT_SHADER, shader_spec, &resources, SH_FRAGMENT_SHADER, shader_spec, &resources,
implementation_type, function_behavior); implementation_type,
static_cast<ShCompileOptions>(driver_bug_workarounds));
if (!fragment_translator_.get()) { if (!fragment_translator_.get()) {
LOG(ERROR) << "Could not initialize fragment shader translator."; LOG(ERROR) << "Could not initialize fragment shader translator.";
Destroy(true); Destroy(true);
......
...@@ -84,7 +84,7 @@ class MockShaderTranslator : public ShaderTranslatorInterface { ...@@ -84,7 +84,7 @@ class MockShaderTranslator : public ShaderTranslatorInterface {
ShShaderSpec shader_spec, ShShaderSpec shader_spec,
const ShBuiltInResources* resources, const ShBuiltInResources* resources,
GlslImplementationType glsl_implementation_type, GlslImplementationType glsl_implementation_type,
GlslBuiltInFunctionBehavior glsl_built_in_function_behavior)); ShCompileOptions driver_bug_workarounds));
MOCK_METHOD1(Translate, bool(const char* shader)); MOCK_METHOD1(Translate, bool(const char* shader));
MOCK_CONST_METHOD0(translated_shader, const char*()); MOCK_CONST_METHOD0(translated_shader, const char*());
MOCK_CONST_METHOD0(info_log, const char*()); MOCK_CONST_METHOD0(info_log, const char*());
......
...@@ -118,7 +118,7 @@ ShaderTranslator::DestructionObserver::~DestructionObserver() { ...@@ -118,7 +118,7 @@ ShaderTranslator::DestructionObserver::~DestructionObserver() {
ShaderTranslator::ShaderTranslator() ShaderTranslator::ShaderTranslator()
: compiler_(NULL), : compiler_(NULL),
implementation_is_glsl_es_(false), implementation_is_glsl_es_(false),
needs_built_in_function_emulation_(false) { driver_bug_workarounds_(static_cast<ShCompileOptions>(0)) {
} }
bool ShaderTranslator::Init( bool ShaderTranslator::Init(
...@@ -126,8 +126,7 @@ bool ShaderTranslator::Init( ...@@ -126,8 +126,7 @@ bool ShaderTranslator::Init(
ShShaderSpec shader_spec, ShShaderSpec shader_spec,
const ShBuiltInResources* resources, const ShBuiltInResources* resources,
ShaderTranslatorInterface::GlslImplementationType glsl_implementation_type, ShaderTranslatorInterface::GlslImplementationType glsl_implementation_type,
ShaderTranslatorInterface::GlslBuiltInFunctionBehavior ShCompileOptions driver_bug_workarounds) {
glsl_built_in_function_behavior) {
// Make sure Init is called only once. // Make sure Init is called only once.
DCHECK(compiler_ == NULL); DCHECK(compiler_ == NULL);
DCHECK(shader_type == SH_FRAGMENT_SHADER || shader_type == SH_VERTEX_SHADER); DCHECK(shader_type == SH_FRAGMENT_SHADER || shader_type == SH_VERTEX_SHADER);
...@@ -147,8 +146,7 @@ bool ShaderTranslator::Init( ...@@ -147,8 +146,7 @@ bool ShaderTranslator::Init(
} }
compiler_options_ = *resources; compiler_options_ = *resources;
implementation_is_glsl_es_ = (glsl_implementation_type == kGlslES); implementation_is_glsl_es_ = (glsl_implementation_type == kGlslES);
needs_built_in_function_emulation_ = driver_bug_workarounds_ = driver_bug_workarounds;
(glsl_built_in_function_behavior == kGlslBuiltInFunctionEmulated);
return compiler_ != NULL; return compiler_ != NULL;
} }
...@@ -160,8 +158,7 @@ int ShaderTranslator::GetCompileOptions() const { ...@@ -160,8 +158,7 @@ int ShaderTranslator::GetCompileOptions() const {
compile_options |= SH_CLAMP_INDIRECT_ARRAY_BOUNDS; compile_options |= SH_CLAMP_INDIRECT_ARRAY_BOUNDS;
if (needs_built_in_function_emulation_) compile_options |= driver_bug_workarounds_;
compile_options |= SH_EMULATE_BUILT_IN_FUNCTIONS;
return compile_options; return compile_options;
} }
......
...@@ -27,11 +27,6 @@ class ShaderTranslatorInterface { ...@@ -27,11 +27,6 @@ class ShaderTranslatorInterface {
kGlslES kGlslES
}; };
enum GlslBuiltInFunctionBehavior {
kGlslBuiltInFunctionOriginal,
kGlslBuiltInFunctionEmulated
};
struct VariableInfo { struct VariableInfo {
VariableInfo() VariableInfo()
: type(0), : type(0),
...@@ -75,7 +70,7 @@ class ShaderTranslatorInterface { ...@@ -75,7 +70,7 @@ class ShaderTranslatorInterface {
ShShaderSpec shader_spec, ShShaderSpec shader_spec,
const ShBuiltInResources* resources, const ShBuiltInResources* resources,
GlslImplementationType glsl_implementation_type, GlslImplementationType glsl_implementation_type,
GlslBuiltInFunctionBehavior glsl_built_in_function_behavior) = 0; ShCompileOptions driver_bug_workarounds) = 0;
// Translates the given shader source. // Translates the given shader source.
// Returns true if translation is successful, false otherwise. // Returns true if translation is successful, false otherwise.
...@@ -125,7 +120,7 @@ class GPU_EXPORT ShaderTranslator ...@@ -125,7 +120,7 @@ class GPU_EXPORT ShaderTranslator
ShShaderSpec shader_spec, ShShaderSpec shader_spec,
const ShBuiltInResources* resources, const ShBuiltInResources* resources,
GlslImplementationType glsl_implementation_type, GlslImplementationType glsl_implementation_type,
GlslBuiltInFunctionBehavior glsl_built_in_function_behavior) OVERRIDE; ShCompileOptions driver_bug_workarounds) OVERRIDE;
// Overridden from ShaderTranslatorInterface. // Overridden from ShaderTranslatorInterface.
virtual bool Translate(const char* shader) OVERRIDE; virtual bool Translate(const char* shader) OVERRIDE;
...@@ -162,7 +157,7 @@ class GPU_EXPORT ShaderTranslator ...@@ -162,7 +157,7 @@ class GPU_EXPORT ShaderTranslator
VariableMap varying_map_; VariableMap varying_map_;
NameMap name_map_; NameMap name_map_;
bool implementation_is_glsl_es_; bool implementation_is_glsl_es_;
bool needs_built_in_function_emulation_; ShCompileOptions driver_bug_workarounds_;
ObserverList<DestructionObserver> destruction_observers_; ObserverList<DestructionObserver> destruction_observers_;
DISALLOW_COPY_AND_ASSIGN(ShaderTranslator); DISALLOW_COPY_AND_ASSIGN(ShaderTranslator);
......
...@@ -34,13 +34,12 @@ scoped_refptr<ShaderTranslator> ShaderTranslatorCache::GetTranslator( ...@@ -34,13 +34,12 @@ scoped_refptr<ShaderTranslator> ShaderTranslatorCache::GetTranslator(
const ShBuiltInResources* resources, const ShBuiltInResources* resources,
ShaderTranslatorInterface::GlslImplementationType ShaderTranslatorInterface::GlslImplementationType
glsl_implementation_type, glsl_implementation_type,
ShaderTranslatorInterface::GlslBuiltInFunctionBehavior ShCompileOptions driver_bug_workarounds) {
glsl_built_in_function_behavior) {
ShaderTranslatorInitParams params(shader_type, ShaderTranslatorInitParams params(shader_type,
shader_spec, shader_spec,
*resources, *resources,
glsl_implementation_type, glsl_implementation_type,
glsl_built_in_function_behavior); driver_bug_workarounds);
Cache::iterator it = cache_.find(params); Cache::iterator it = cache_.find(params);
if (it != cache_.end()) if (it != cache_.end())
...@@ -49,7 +48,7 @@ scoped_refptr<ShaderTranslator> ShaderTranslatorCache::GetTranslator( ...@@ -49,7 +48,7 @@ scoped_refptr<ShaderTranslator> ShaderTranslatorCache::GetTranslator(
ShaderTranslator* translator = new ShaderTranslator(); ShaderTranslator* translator = new ShaderTranslator();
if (translator->Init(shader_type, shader_spec, resources, if (translator->Init(shader_type, shader_spec, resources,
glsl_implementation_type, glsl_implementation_type,
glsl_built_in_function_behavior)) { driver_bug_workarounds)) {
cache_[params] = translator; cache_[params] = translator;
translator->AddDestructionObserver(this); translator->AddDestructionObserver(this);
return translator; return translator;
......
...@@ -36,8 +36,7 @@ class ShaderTranslatorCache : public ShaderTranslator::DestructionObserver { ...@@ -36,8 +36,7 @@ class ShaderTranslatorCache : public ShaderTranslator::DestructionObserver {
const ShBuiltInResources* resources, const ShBuiltInResources* resources,
ShaderTranslatorInterface::GlslImplementationType ShaderTranslatorInterface::GlslImplementationType
glsl_implementation_type, glsl_implementation_type,
ShaderTranslatorInterface::GlslBuiltInFunctionBehavior ShCompileOptions driver_bug_workarounds);
glsl_built_in_function_behavior);
private: private:
ShaderTranslatorCache(); ShaderTranslatorCache();
...@@ -52,8 +51,7 @@ class ShaderTranslatorCache : public ShaderTranslator::DestructionObserver { ...@@ -52,8 +51,7 @@ class ShaderTranslatorCache : public ShaderTranslator::DestructionObserver {
ShBuiltInResources resources; ShBuiltInResources resources;
ShaderTranslatorInterface::GlslImplementationType ShaderTranslatorInterface::GlslImplementationType
glsl_implementation_type; glsl_implementation_type;
ShaderTranslatorInterface::GlslBuiltInFunctionBehavior ShCompileOptions driver_bug_workarounds;
glsl_built_in_function_behavior;
ShaderTranslatorInitParams( ShaderTranslatorInitParams(
ShShaderType shader_type, ShShaderType shader_type,
...@@ -61,13 +59,12 @@ class ShaderTranslatorCache : public ShaderTranslator::DestructionObserver { ...@@ -61,13 +59,12 @@ class ShaderTranslatorCache : public ShaderTranslator::DestructionObserver {
const ShBuiltInResources& resources, const ShBuiltInResources& resources,
ShaderTranslatorInterface::GlslImplementationType ShaderTranslatorInterface::GlslImplementationType
glsl_implementation_type, glsl_implementation_type,
ShaderTranslatorInterface::GlslBuiltInFunctionBehavior ShCompileOptions driver_bug_workarounds)
glsl_built_in_function_behavior)
: shader_type(shader_type), : shader_type(shader_type),
shader_spec(shader_spec), shader_spec(shader_spec),
resources(resources), resources(resources),
glsl_implementation_type(glsl_implementation_type), glsl_implementation_type(glsl_implementation_type),
glsl_built_in_function_behavior(glsl_built_in_function_behavior) { driver_bug_workarounds(driver_bug_workarounds) {
} }
ShaderTranslatorInitParams(const ShaderTranslatorInitParams& params) { ShaderTranslatorInitParams(const ShaderTranslatorInitParams& params) {
......
...@@ -28,11 +28,11 @@ class ShaderTranslatorTest : public testing::Test { ...@@ -28,11 +28,11 @@ class ShaderTranslatorTest : public testing::Test {
ASSERT_TRUE(vertex_translator_->Init( ASSERT_TRUE(vertex_translator_->Init(
SH_VERTEX_SHADER, SH_GLES2_SPEC, &resources, SH_VERTEX_SHADER, SH_GLES2_SPEC, &resources,
ShaderTranslatorInterface::kGlsl, ShaderTranslatorInterface::kGlsl,
ShaderTranslatorInterface::kGlslBuiltInFunctionEmulated)); SH_EMULATE_BUILT_IN_FUNCTIONS));
ASSERT_TRUE(fragment_translator_->Init( ASSERT_TRUE(fragment_translator_->Init(
SH_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources, SH_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources,
ShaderTranslatorInterface::kGlsl, ShaderTranslatorInterface::kGlsl,
ShaderTranslatorInterface::kGlslBuiltInFunctionOriginal)); static_cast<ShCompileOptions>(0)));
// Post-init the results must be empty. // Post-init the results must be empty.
// Vertex translator results. // Vertex translator results.
EXPECT_TRUE(vertex_translator_->translated_shader() == NULL); EXPECT_TRUE(vertex_translator_->translated_shader() == NULL);
...@@ -232,16 +232,16 @@ TEST_F(ShaderTranslatorTest, OptionsString) { ...@@ -232,16 +232,16 @@ TEST_F(ShaderTranslatorTest, OptionsString) {
ASSERT_TRUE(translator_1->Init( ASSERT_TRUE(translator_1->Init(
SH_VERTEX_SHADER, SH_GLES2_SPEC, &resources, SH_VERTEX_SHADER, SH_GLES2_SPEC, &resources,
ShaderTranslatorInterface::kGlsl, ShaderTranslatorInterface::kGlsl,
ShaderTranslatorInterface::kGlslBuiltInFunctionEmulated)); SH_EMULATE_BUILT_IN_FUNCTIONS));
ASSERT_TRUE(translator_2->Init( ASSERT_TRUE(translator_2->Init(
SH_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources, SH_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources,
ShaderTranslatorInterface::kGlsl, ShaderTranslatorInterface::kGlsl,
ShaderTranslatorInterface::kGlslBuiltInFunctionOriginal)); static_cast<ShCompileOptions>(0)));
resources.EXT_draw_buffers = 1; resources.EXT_draw_buffers = 1;
ASSERT_TRUE(translator_3->Init( ASSERT_TRUE(translator_3->Init(
SH_VERTEX_SHADER, SH_GLES2_SPEC, &resources, SH_VERTEX_SHADER, SH_GLES2_SPEC, &resources,
ShaderTranslatorInterface::kGlsl, ShaderTranslatorInterface::kGlsl,
ShaderTranslatorInterface::kGlslBuiltInFunctionEmulated)); SH_EMULATE_BUILT_IN_FUNCTIONS));
std::string options_1( std::string options_1(
translator_1->GetStringForOptionsThatWouldEffectCompilation()); translator_1->GetStringForOptionsThatWouldEffectCompilation());
......
...@@ -85,7 +85,7 @@ const char kGpuDriverBugListJson[] = LONG_STRING_CONST( ...@@ -85,7 +85,7 @@ const char kGpuDriverBugListJson[] = LONG_STRING_CONST(
{ {
"name": "gpu driver bug list", "name": "gpu driver bug list",
// Please update the version number whenever you change this file. // Please update the version number whenever you change this file.
"version": "2.9", "version": "2.10",
"entries": [ "entries": [
{ {
"id": 1, "id": 1,
...@@ -563,6 +563,18 @@ const char kGpuDriverBugListJson[] = LONG_STRING_CONST( ...@@ -563,6 +563,18 @@ const char kGpuDriverBugListJson[] = LONG_STRING_CONST(
"features": [ "features": [
"use_virtualized_gl_contexts" "use_virtualized_gl_contexts"
] ]
},
{
"id": 37,
"cr_bugs": [286468],
"description": "Program link fails in NVIDIA Linux if gl_Position is not set",
"os": {
"type": "linux"
},
"vendor_id": "0x10de",
"features": [
"init_gl_position_in_vertex_shader"
]
} }
] ]
} }
......
...@@ -18,18 +18,28 @@ ...@@ -18,18 +18,28 @@
delete_instead_of_resize_fbo) \ delete_instead_of_resize_fbo) \
GPU_OP(DISABLE_ANGLE_FRAMEBUFFER_MULTISAMPLE, \ GPU_OP(DISABLE_ANGLE_FRAMEBUFFER_MULTISAMPLE, \
disable_angle_framebuffer_multisample) \ disable_angle_framebuffer_multisample) \
GPU_OP(DISABLE_ANGLE_INSTANCED_ARRAYS, \
disable_angle_instanced_arrays) \
GPU_OP(DISABLE_ASYNC_READPIXELS, \
disable_async_readpixels) \
GPU_OP(DISABLE_D3D11, \
disable_d3d11) \
GPU_OP(DISABLE_DEPTH_TEXTURE, \ GPU_OP(DISABLE_DEPTH_TEXTURE, \
disable_depth_texture) \ disable_depth_texture) \
GPU_OP(DISABLE_EXT_DRAW_BUFFERS, \ GPU_OP(DISABLE_EXT_DRAW_BUFFERS, \
disable_ext_draw_buffers) \ disable_ext_draw_buffers) \
GPU_OP(DISABLE_EXT_OCCLUSION_QUERY, \ GPU_OP(DISABLE_EXT_OCCLUSION_QUERY, \
disable_ext_occlusion_query) \ disable_ext_occlusion_query) \
GPU_OP(DISABLE_MULTIMONITOR_MULTISAMPLING, \
disable_multimonitor_multisampling) \
GPU_OP(DISABLE_OES_STANDARD_DERIVATIVES, \ GPU_OP(DISABLE_OES_STANDARD_DERIVATIVES, \
disable_oes_standard_derivatives) \ disable_oes_standard_derivatives) \
GPU_OP(ENABLE_CHROMIUM_FAST_NPOT_MO8_TEXTURES, \ GPU_OP(ENABLE_CHROMIUM_FAST_NPOT_MO8_TEXTURES, \
enable_chromium_fast_npot_mo8_textures) \ enable_chromium_fast_npot_mo8_textures) \
GPU_OP(EXIT_ON_CONTEXT_LOST, \ GPU_OP(EXIT_ON_CONTEXT_LOST, \
exit_on_context_lost) \ exit_on_context_lost) \
GPU_OP(INIT_GL_POSITION_IN_VERTEX_SHADER, \
init_gl_position_in_vertex_shader) \
GPU_OP(MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_1024, \ GPU_OP(MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_1024, \
max_cube_map_texture_size_limit_1024) \ max_cube_map_texture_size_limit_1024) \
GPU_OP(MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_4096, \ GPU_OP(MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_4096, \
...@@ -48,6 +58,8 @@ ...@@ -48,6 +58,8 @@
reverse_point_sprite_coord_origin) \ reverse_point_sprite_coord_origin) \
GPU_OP(SET_TEXTURE_FILTER_BEFORE_GENERATING_MIPMAP, \ GPU_OP(SET_TEXTURE_FILTER_BEFORE_GENERATING_MIPMAP, \
set_texture_filter_before_generating_mipmap) \ set_texture_filter_before_generating_mipmap) \
GPU_OP(SWIZZLE_RGBA_FOR_ASYNC_READPIXELS, \
swizzle_rgba_for_async_readpixels) \
GPU_OP(UNBIND_FBO_ON_CONTEXT_SWITCH, \ GPU_OP(UNBIND_FBO_ON_CONTEXT_SWITCH, \
unbind_fbo_on_context_switch) \ unbind_fbo_on_context_switch) \
GPU_OP(USE_CLIENT_SIDE_ARRAYS_FOR_STREAM_BUFFERS, \ GPU_OP(USE_CLIENT_SIDE_ARRAYS_FOR_STREAM_BUFFERS, \
...@@ -56,16 +68,6 @@ ...@@ -56,16 +68,6 @@
use_current_program_after_successful_link) \ use_current_program_after_successful_link) \
GPU_OP(USE_NON_ZERO_SIZE_FOR_CLIENT_SIDE_STREAM_BUFFERS, \ GPU_OP(USE_NON_ZERO_SIZE_FOR_CLIENT_SIDE_STREAM_BUFFERS, \
use_non_zero_size_for_client_side_stream_buffers) \ use_non_zero_size_for_client_side_stream_buffers) \
GPU_OP(DISABLE_ASYNC_READPIXELS, \
disable_async_readpixels) \
GPU_OP(DISABLE_D3D11, \
disable_d3d11) \
GPU_OP(SWIZZLE_RGBA_FOR_ASYNC_READPIXELS, \
swizzle_rgba_for_async_readpixels) \
GPU_OP(DISABLE_ANGLE_INSTANCED_ARRAYS, \
disable_angle_instanced_arrays) \
GPU_OP(DISABLE_MULTIMONITOR_MULTISAMPLING, \
disable_multimonitor_multisampling) \
GPU_OP(USE_VIRTUALIZED_GL_CONTEXTS, \ GPU_OP(USE_VIRTUALIZED_GL_CONTEXTS, \
use_virtualized_gl_contexts) \ use_virtualized_gl_contexts) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment