summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorbrianderson@chromium.org <brianderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-12 03:58:21 +0000
committerbrianderson@chromium.org <brianderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-12 03:58:21 +0000
commit8dc1bf92547ba9034431bc1d3829bf7eb5097b17 (patch)
treee2d2731be1de6ed289867b756e8541e7bc3aeddf /gpu
parentbbe44f445f89bc46d1da4c2c2951cadc9b1daa4d (diff)
downloadchromium_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.cc73
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];