Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1065)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 2319373004: Query the GL limits for the passthrough command buffer. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <limits.h> 7 #include <limits.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 #include <stdio.h> 10 #include <stdio.h>
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 const char kOESDerivativeExtension[] = "GL_OES_standard_derivatives"; 98 const char kOESDerivativeExtension[] = "GL_OES_standard_derivatives";
99 const char kEXTFragDepthExtension[] = "GL_EXT_frag_depth"; 99 const char kEXTFragDepthExtension[] = "GL_EXT_frag_depth";
100 const char kEXTDrawBuffersExtension[] = "GL_EXT_draw_buffers"; 100 const char kEXTDrawBuffersExtension[] = "GL_EXT_draw_buffers";
101 const char kEXTShaderTextureLodExtension[] = "GL_EXT_shader_texture_lod"; 101 const char kEXTShaderTextureLodExtension[] = "GL_EXT_shader_texture_lod";
102 102
103 const GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, 103 const GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f,
104 0.0f, 1.0f, 0.0f, 0.0f, 104 0.0f, 1.0f, 0.0f, 0.0f,
105 0.0f, 0.0f, 1.0f, 0.0f, 105 0.0f, 0.0f, 1.0f, 0.0f,
106 0.0f, 0.0f, 0.0f, 1.0f}; 106 0.0f, 0.0f, 0.0f, 1.0f};
107 107
108 bool PrecisionMeetsSpecForHighpFloat(GLint rangeMin,
109 GLint rangeMax,
110 GLint precision) {
111 return (rangeMin >= 62) && (rangeMax >= 62) && (precision >= 16);
112 }
113
114 void GetShaderPrecisionFormatImpl(const gl::GLVersionInfo& gl_version_info,
115 GLenum shader_type,
116 GLenum precision_type,
117 GLint* range,
118 GLint* precision) {
119 switch (precision_type) {
120 case GL_LOW_INT:
121 case GL_MEDIUM_INT:
122 case GL_HIGH_INT:
123 // These values are for a 32-bit twos-complement integer format.
124 range[0] = 31;
125 range[1] = 30;
126 *precision = 0;
127 break;
128 case GL_LOW_FLOAT:
129 case GL_MEDIUM_FLOAT:
130 case GL_HIGH_FLOAT:
131 // These values are for an IEEE single-precision floating-point format.
132 range[0] = 127;
133 range[1] = 127;
134 *precision = 23;
135 break;
136 default:
137 NOTREACHED();
138 break;
139 }
140
141 if (gl_version_info.is_es) {
142 // This function is sometimes defined even though it's really just
143 // a stub, so we need to set range and precision as if it weren't
144 // defined before calling it.
145 // On Mac OS with some GPUs, calling this generates a
146 // GL_INVALID_OPERATION error. Avoid calling it on non-GLES2
147 // platforms.
148 glGetShaderPrecisionFormat(shader_type, precision_type,
149 range, precision);
150
151 // TODO(brianderson): Make the following official workarounds.
152
153 // Some drivers have bugs where they report the ranges as a negative number.
154 // Taking the absolute value here shouldn't hurt because negative numbers
155 // aren't expected anyway.
156 range[0] = abs(range[0]);
157 range[1] = abs(range[1]);
158
159 // If the driver reports a precision for highp float that isn't actually
160 // highp, don't pretend like it's supported because shader compilation will
161 // fail anyway.
162 if (precision_type == GL_HIGH_FLOAT &&
163 !PrecisionMeetsSpecForHighpFloat(range[0], range[1], *precision)) {
164 range[0] = 0;
165 range[1] = 0;
166 *precision = 0;
167 }
168 }
169 }
170
171 gfx::OverlayTransform GetGFXOverlayTransform(GLenum plane_transform) { 108 gfx::OverlayTransform GetGFXOverlayTransform(GLenum plane_transform) {
172 switch (plane_transform) { 109 switch (plane_transform) {
173 case GL_OVERLAY_TRANSFORM_NONE_CHROMIUM: 110 case GL_OVERLAY_TRANSFORM_NONE_CHROMIUM:
174 return gfx::OVERLAY_TRANSFORM_NONE; 111 return gfx::OVERLAY_TRANSFORM_NONE;
175 case GL_OVERLAY_TRANSFORM_FLIP_HORIZONTAL_CHROMIUM: 112 case GL_OVERLAY_TRANSFORM_FLIP_HORIZONTAL_CHROMIUM:
176 return gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL; 113 return gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL;
177 case GL_OVERLAY_TRANSFORM_FLIP_VERTICAL_CHROMIUM: 114 case GL_OVERLAY_TRANSFORM_FLIP_VERTICAL_CHROMIUM:
178 return gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL; 115 return gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL;
179 case GL_OVERLAY_TRANSFORM_ROTATE_90_CHROMIUM: 116 case GL_OVERLAY_TRANSFORM_ROTATE_90_CHROMIUM:
180 return gfx::OVERLAY_TRANSFORM_ROTATE_90; 117 return gfx::OVERLAY_TRANSFORM_ROTATE_90;
(...skipping 3325 matching lines...) Expand 10 before | Expand all | Expand 10 after
3506 3443
3507 Capabilities GLES2DecoderImpl::GetCapabilities() { 3444 Capabilities GLES2DecoderImpl::GetCapabilities() {
3508 DCHECK(initialized()); 3445 DCHECK(initialized());
3509 Capabilities caps; 3446 Capabilities caps;
3510 const gl::GLVersionInfo& version_info = gl_version_info(); 3447 const gl::GLVersionInfo& version_info = gl_version_info();
3511 caps.VisitPrecisions([&version_info]( 3448 caps.VisitPrecisions([&version_info](
3512 GLenum shader, GLenum type, 3449 GLenum shader, GLenum type,
3513 Capabilities::ShaderPrecision* shader_precision) { 3450 Capabilities::ShaderPrecision* shader_precision) {
3514 GLint range[2] = {0, 0}; 3451 GLint range[2] = {0, 0};
3515 GLint precision = 0; 3452 GLint precision = 0;
3516 GetShaderPrecisionFormatImpl(version_info, shader, type, range, 3453 QueryShaderPrecisionFormat(version_info, shader, type, range, &precision);
3517 &precision);
3518 shader_precision->min_range = range[0]; 3454 shader_precision->min_range = range[0];
3519 shader_precision->max_range = range[1]; 3455 shader_precision->max_range = range[1];
3520 shader_precision->precision = precision; 3456 shader_precision->precision = precision;
3521 }); 3457 });
3522 DoGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, 3458 DoGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,
3523 &caps.max_combined_texture_image_units); 3459 &caps.max_combined_texture_image_units);
3524 DoGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &caps.max_cube_map_texture_size); 3460 DoGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &caps.max_cube_map_texture_size);
3525 DoGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, 3461 DoGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS,
3526 &caps.max_fragment_uniform_vectors); 3462 &caps.max_fragment_uniform_vectors);
3527 DoGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &caps.max_renderbuffer_size); 3463 DoGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &caps.max_renderbuffer_size);
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
3699 resources.MaxVertexOutputVectors = 3635 resources.MaxVertexOutputVectors =
3700 group_->max_vertex_output_components() / 4; 3636 group_->max_vertex_output_components() / 4;
3701 resources.MaxFragmentInputVectors = 3637 resources.MaxFragmentInputVectors =
3702 group_->max_fragment_input_components() / 4; 3638 group_->max_fragment_input_components() / 4;
3703 resources.MaxProgramTexelOffset = group_->max_program_texel_offset(); 3639 resources.MaxProgramTexelOffset = group_->max_program_texel_offset();
3704 resources.MinProgramTexelOffset = group_->min_program_texel_offset(); 3640 resources.MinProgramTexelOffset = group_->min_program_texel_offset();
3705 } 3641 }
3706 3642
3707 GLint range[2] = { 0, 0 }; 3643 GLint range[2] = { 0, 0 };
3708 GLint precision = 0; 3644 GLint precision = 0;
3709 GetShaderPrecisionFormatImpl(gl_version_info(), GL_FRAGMENT_SHADER, 3645 QueryShaderPrecisionFormat(gl_version_info(), GL_FRAGMENT_SHADER,
3710 GL_HIGH_FLOAT, range, &precision); 3646 GL_HIGH_FLOAT, range, &precision);
3711 resources.FragmentPrecisionHigh = 3647 resources.FragmentPrecisionHigh =
3712 PrecisionMeetsSpecForHighpFloat(range[0], range[1], precision); 3648 PrecisionMeetsSpecForHighpFloat(range[0], range[1], precision);
3713 3649
3714 ShShaderSpec shader_spec; 3650 ShShaderSpec shader_spec;
3715 switch (feature_info_->context_type()) { 3651 switch (feature_info_->context_type()) {
3716 case CONTEXT_TYPE_WEBGL1: 3652 case CONTEXT_TYPE_WEBGL1:
3717 shader_spec = SH_WEBGL_SPEC; 3653 shader_spec = SH_WEBGL_SPEC;
3718 resources.OES_standard_derivatives = derivatives_explicitly_enabled_; 3654 resources.OES_standard_derivatives = derivatives_explicitly_enabled_;
3719 resources.EXT_frag_depth = frag_depth_explicitly_enabled_; 3655 resources.EXT_frag_depth = frag_depth_explicitly_enabled_;
3720 resources.EXT_draw_buffers = draw_buffers_explicitly_enabled_; 3656 resources.EXT_draw_buffers = draw_buffers_explicitly_enabled_;
(...skipping 10110 matching lines...) Expand 10 before | Expand all | Expand 10 after
13831 if (!validators_->shader_precision.IsValid(precision_type)) { 13767 if (!validators_->shader_precision.IsValid(precision_type)) {
13832 LOCAL_SET_GL_ERROR_INVALID_ENUM( 13768 LOCAL_SET_GL_ERROR_INVALID_ENUM(
13833 "glGetShaderPrecisionFormat", precision_type, "precision_type"); 13769 "glGetShaderPrecisionFormat", precision_type, "precision_type");
13834 return error::kNoError; 13770 return error::kNoError;
13835 } 13771 }
13836 13772
13837 result->success = 1; // true 13773 result->success = 1; // true
13838 13774
13839 GLint range[2] = { 0, 0 }; 13775 GLint range[2] = { 0, 0 };
13840 GLint precision = 0; 13776 GLint precision = 0;
13841 GetShaderPrecisionFormatImpl(gl_version_info(), shader_type, precision_type, 13777 QueryShaderPrecisionFormat(gl_version_info(), shader_type, precision_type,
13842 range, &precision); 13778 range, &precision);
13843 13779
13844 result->min_range = range[0]; 13780 result->min_range = range[0];
13845 result->max_range = range[1]; 13781 result->max_range = range[1];
13846 result->precision = precision; 13782 result->precision = precision;
13847 13783
13848 return error::kNoError; 13784 return error::kNoError;
13849 } 13785 }
13850 13786
13851 error::Error GLES2DecoderImpl::HandleGetAttachedShaders( 13787 error::Error GLES2DecoderImpl::HandleGetAttachedShaders(
13852 uint32_t immediate_data_size, 13788 uint32_t immediate_data_size,
(...skipping 4081 matching lines...) Expand 10 before | Expand all | Expand 10 after
17934 } 17870 }
17935 17871
17936 // Include the auto-generated part of this file. We split this because it means 17872 // Include the auto-generated part of this file. We split this because it means
17937 // we can easily edit the non-auto generated parts right here in this file 17873 // we can easily edit the non-auto generated parts right here in this file
17938 // instead of having to edit some template or the code generator. 17874 // instead of having to edit some template or the code generator.
17939 #include "base/macros.h" 17875 #include "base/macros.h"
17940 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 17876 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
17941 17877
17942 } // namespace gles2 17878 } // namespace gles2
17943 } // namespace gpu 17879 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gl_utils.cc ('k') | gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698