diff options
author | brianderson@chromium.org <brianderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-12 03:58:21 +0000 |
---|---|---|
committer | brianderson@chromium.org <brianderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-12 03:58:21 +0000 |
commit | 8dc1bf92547ba9034431bc1d3829bf7eb5097b17 (patch) | |
tree | e2d2731be1de6ed289867b756e8541e7bc3aeddf /gpu | |
parent | bbe44f445f89bc46d1da4c2c2951cadc9b1daa4d (diff) | |
download | chromium_src-8dc1bf92547ba9034431bc1d3829bf7eb5097b17.zip chromium_src-8dc1bf92547ba9034431bc1d3829bf7eb5097b17.tar.gz chromium_src-8dc1bf92547ba9034431bc1d3829bf7eb5097b17.tar.bz2 |
gpu: Selectively define GL_FRAGMENT_PRECISION_HIGH
BUG=178327
Review URL: https://chromiumcodereview.appspot.com/12663002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@187484 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 73 |
1 files changed, 42 insertions, 31 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 0763ca8..388525a 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -82,6 +82,40 @@ khronos_uint64_t CityHashForAngle(const char* name, unsigned int len) { } #endif +static void GetShaderPrecisionFormatImpl(GLenum shader_type, + GLenum precision_type, + GLint *range, GLint *precision) { + switch (precision_type) { + case GL_LOW_INT: + case GL_MEDIUM_INT: + case GL_HIGH_INT: + // These values are for a 32-bit twos-complement integer format. + range[0] = 31; + range[1] = 30; + *precision = 0; + break; + case GL_LOW_FLOAT: + case GL_MEDIUM_FLOAT: + case GL_HIGH_FLOAT: + // These values are for an IEEE single-precision floating-point format. + range[0] = 127; + range[1] = 127; + *precision = 23; + break; + default: + NOTREACHED(); + break; + } + + if (gfx::g_driver_gl.fn.glGetShaderPrecisionFormatFn) { + // This function is sometimes defined even though it's really just + // a stub, so we need to set range and precision as if it weren't + // defined before calling it. + glGetShaderPrecisionFormat(shader_type, precision_type, + range, precision); + } +} + } // namespace class GLES2DecoderImpl; @@ -2562,7 +2596,13 @@ bool GLES2DecoderImpl::InitializeShaderTranslator() { resources.MaxDrawBuffers = 1; #if (ANGLE_SH_VERSION >= 110) - resources.FragmentPrecisionHigh = 1; + GLint range[2]; + GLint precision = 0; + GetShaderPrecisionFormatImpl(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, + range, &precision); + resources.FragmentPrecisionHigh = ((range[0] >= 62) && + (range[1] >= 62) && + (precision >= 16)); #endif if (force_webgl_glsl_validation_) { @@ -8634,36 +8674,7 @@ error::Error GLES2DecoderImpl::HandleGetShaderPrecisionFormat( GLint range[2] = {0, 0}; GLint precision = 0; - - switch (precision_type) { - case GL_LOW_INT: - case GL_MEDIUM_INT: - case GL_HIGH_INT: - // These values are for a 32-bit twos-complement integer format. - range[0] = 31; - range[1] = 30; - precision = 0; - break; - case GL_LOW_FLOAT: - case GL_MEDIUM_FLOAT: - case GL_HIGH_FLOAT: - // These values are for an IEEE single-precision floating-point format. - range[0] = 127; - range[1] = 127; - precision = 23; - break; - default: - NOTREACHED(); - break; - } - - if (gfx::g_driver_gl.fn.glGetShaderPrecisionFormatFn) { - // This function is sometimes defined even though it's really just - // a stub, so we need to set range and precision as if it weren't - // defined before calling it. - glGetShaderPrecisionFormat(shader_type, precision_type, - range, &precision); - } + GetShaderPrecisionFormatImpl(shader_type, precision_type, range, &precision); result->min_range = range[0]; result->max_range = range[1]; |