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

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

Issue 2142353002: Validate fbo color image format and fragment shader output variable type. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Validate fbo color image format and fragment shader output variable type. Created 4 years, 5 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 1320 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 1331
1332 // Check that the currently bound read framebuffer's color image 1332 // Check that the currently bound read framebuffer's color image
1333 // isn't the target texture of the glCopyTex{Sub}Image2D. 1333 // isn't the target texture of the glCopyTex{Sub}Image2D.
1334 bool FormsTextureCopyingFeedbackLoop(TextureRef* texture, GLint level); 1334 bool FormsTextureCopyingFeedbackLoop(TextureRef* texture, GLint level);
1335 1335
1336 // Check if a framebuffer meets our requirements. 1336 // Check if a framebuffer meets our requirements.
1337 // Generates |gl_error| if the framebuffer is incomplete. 1337 // Generates |gl_error| if the framebuffer is incomplete.
1338 bool CheckFramebufferValid( 1338 bool CheckFramebufferValid(
1339 Framebuffer* framebuffer, 1339 Framebuffer* framebuffer,
1340 GLenum target, 1340 GLenum target,
1341 bool clear_uncleared_images,
1342 GLenum gl_error, 1341 GLenum gl_error,
1343 const char* func_name); 1342 const char* func_name);
1344 1343
1345 bool CheckBoundDrawFramebufferValid( 1344 bool CheckBoundDrawFramebufferValid(const char* func_name);
1346 bool clear_uncleared_images, const char* func_name);
1347 // Generates |gl_error| if the bound read fbo is incomplete. 1345 // Generates |gl_error| if the bound read fbo is incomplete.
1348 bool CheckBoundReadFramebufferValid(const char* func_name, GLenum gl_error); 1346 bool CheckBoundReadFramebufferValid(const char* func_name, GLenum gl_error);
1349 // This is only used by DoBlitFramebufferCHROMIUM which operates read/draw 1347 // This is only used by DoBlitFramebufferCHROMIUM which operates read/draw
1350 // framebuffer at the same time. 1348 // framebuffer at the same time.
1351 bool CheckBoundFramebufferValid(const char* func_name); 1349 bool CheckBoundFramebufferValid(const char* func_name);
1352 1350
1353 // Checks if the current program exists and is valid. If not generates the 1351 // Checks if the current program exists and is valid. If not generates the
1354 // appropriate GL error. Returns true if the current program is in a usable 1352 // appropriate GL error. Returns true if the current program is in a usable
1355 // state. 1353 // state.
1356 bool CheckCurrentProgram(const char* function_name); 1354 bool CheckCurrentProgram(const char* function_name);
1357 1355
1358 // Checks if the current program exists and is valid and that location is not 1356 // Checks if the current program exists and is valid and that location is not
1359 // -1. If the current program is not valid generates the appropriate GL 1357 // -1. If the current program is not valid generates the appropriate GL
1360 // error. Returns true if the current program is in a usable state and 1358 // error. Returns true if the current program is in a usable state and
1361 // location is not -1. 1359 // location is not -1.
1362 bool CheckCurrentProgramForUniform(GLint location, const char* function_name); 1360 bool CheckCurrentProgramForUniform(GLint location, const char* function_name);
1363 1361
1364 // Checks if the current program samples a texture that is also the color 1362 // Checks if the current program samples a texture that is also the color
1365 // image of the current bound framebuffer, i.e., the source and destination 1363 // image of the current bound framebuffer, i.e., the source and destination
1366 // of the draw operation are the same. 1364 // of the draw operation are the same.
1367 bool CheckDrawingFeedbackLoops(); 1365 bool CheckDrawingFeedbackLoops();
1368 1366
1367 bool SupportsDrawBuffers() const;
1368
1369 // Checks if a draw buffer's format and its corresponding fragment shader
1370 // output's type are compatible, i.e., a signed integer typed variable is
1371 // incompatible with a float or unsigned integer buffer.
1372 // If incompaticle, generates an INVALID_OPERATION to avoid undefined buffer
1373 // contents and return false.
1374 // Otherwise, filter out the draw buffers that are not written to but are not
1375 // NONE through DrawBuffers, to be on the safe side. Return true.
1376 bool ValidateAndAdjustDrawBuffers(const char* function_name);
1377
1378 // This is similar to ValidateAndAdjustDrawBuffers(), except that it does not
1379 // do the validation of drawe buffer format and fragment output type match.
1380 // It only adjusts a draw buffer to NONE if it doesn't have an image or the
1381 // image is integer format.
1382 // This is only for Clear() to avoid undefined buffer contents.
1383 void AdjustDrawBuffers();
1384
1369 // Checks if |api_type| is valid for the given uniform 1385 // Checks if |api_type| is valid for the given uniform
1370 // If the api type is not valid generates the appropriate GL 1386 // If the api type is not valid generates the appropriate GL
1371 // error. Returns true if |api_type| is valid for the uniform 1387 // error. Returns true if |api_type| is valid for the uniform
1372 bool CheckUniformForApiType(const Program::UniformInfo* info, 1388 bool CheckUniformForApiType(const Program::UniformInfo* info,
1373 const char* function_name, 1389 const char* function_name,
1374 Program::UniformApiType api_type); 1390 Program::UniformApiType api_type);
1375 1391
1376 // Gets the type of a uniform for a location in the current program. Sets GL 1392 // Gets the type of a uniform for a location in the current program. Sets GL
1377 // errors if the current program is not valid. Returns true if the current 1393 // errors if the current program is not valid. Returns true if the current
1378 // program is valid and the location exists. Adjusts count so it 1394 // program is valid and the location exists. Adjusts count so it
(...skipping 2712 matching lines...) Expand 10 before | Expand all | Expand 10 after
4091 GL_DRAW_FRAMEBUFFER_EXT, 4107 GL_DRAW_FRAMEBUFFER_EXT,
4092 framebuffer_state_.bound_draw_framebuffer.get(), 4108 framebuffer_state_.bound_draw_framebuffer.get(),
4093 GetBackbufferServiceId()); 4109 GetBackbufferServiceId());
4094 } 4110 }
4095 OnFboChanged(); 4111 OnFboChanged();
4096 } 4112 }
4097 4113
4098 bool GLES2DecoderImpl::CheckFramebufferValid( 4114 bool GLES2DecoderImpl::CheckFramebufferValid(
4099 Framebuffer* framebuffer, 4115 Framebuffer* framebuffer,
4100 GLenum target, 4116 GLenum target,
4101 bool clear_uncleared_images,
4102 GLenum gl_error, 4117 GLenum gl_error,
4103 const char* func_name) { 4118 const char* func_name) {
4104 if (!framebuffer) { 4119 if (!framebuffer) {
4105 if (surfaceless_) 4120 if (surfaceless_)
4106 return false; 4121 return false;
4107 if (backbuffer_needs_clear_bits_ && clear_uncleared_images) { 4122 if (backbuffer_needs_clear_bits_) {
4108 glClearColor(0, 0, 0, BackBufferAlphaClearColor()); 4123 glClearColor(0, 0, 0, BackBufferAlphaClearColor());
4109 state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 4124 state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
4110 glClearStencil(0); 4125 glClearStencil(0);
4111 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask); 4126 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask);
4112 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask); 4127 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask);
4113 glClearDepth(1.0f); 4128 glClearDepth(1.0f);
4114 state_.SetDeviceDepthMask(GL_TRUE); 4129 state_.SetDeviceDepthMask(GL_TRUE);
4115 state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); 4130 state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false);
4116 bool reset_draw_buffer = false; 4131 bool reset_draw_buffer = false;
4117 if ((backbuffer_needs_clear_bits_ & GL_COLOR_BUFFER_BIT) != 0 && 4132 if ((backbuffer_needs_clear_bits_ & GL_COLOR_BUFFER_BIT) != 0 &&
(...skipping 25 matching lines...) Expand all
4143 if (framebuffer->GetStatus(texture_manager(), target) != 4158 if (framebuffer->GetStatus(texture_manager(), target) !=
4144 GL_FRAMEBUFFER_COMPLETE) { 4159 GL_FRAMEBUFFER_COMPLETE) {
4145 LOCAL_SET_GL_ERROR( 4160 LOCAL_SET_GL_ERROR(
4146 gl_error, func_name, "framebuffer incomplete (check)"); 4161 gl_error, func_name, "framebuffer incomplete (check)");
4147 return false; 4162 return false;
4148 } 4163 }
4149 framebuffer_manager()->MarkAsComplete(framebuffer); 4164 framebuffer_manager()->MarkAsComplete(framebuffer);
4150 } 4165 }
4151 4166
4152 // Are all the attachments cleared? 4167 // Are all the attachments cleared?
4153 if (clear_uncleared_images && 4168 if (renderbuffer_manager()->HaveUnclearedRenderbuffers() ||
4154 (renderbuffer_manager()->HaveUnclearedRenderbuffers() || 4169 texture_manager()->HaveUnclearedMips()) {
4155 texture_manager()->HaveUnclearedMips())) {
4156 if (!framebuffer->IsCleared()) { 4170 if (!framebuffer->IsCleared()) {
4157 ClearUnclearedAttachments(target, framebuffer); 4171 ClearUnclearedAttachments(target, framebuffer);
4158 } 4172 }
4159 } 4173 }
4160 return true; 4174 return true;
4161 } 4175 }
4162 4176
4163 bool GLES2DecoderImpl::CheckBoundDrawFramebufferValid( 4177 bool GLES2DecoderImpl::CheckBoundDrawFramebufferValid(const char* func_name) {
4164 bool clear_uncleared_images, const char* func_name) {
4165 GLenum target = features().chromium_framebuffer_multisample ? 4178 GLenum target = features().chromium_framebuffer_multisample ?
4166 GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER; 4179 GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER;
4167 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); 4180 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target);
4168 bool valid = CheckFramebufferValid( 4181 bool valid = CheckFramebufferValid(
4169 framebuffer, target, clear_uncleared_images, 4182 framebuffer, target, GL_INVALID_FRAMEBUFFER_OPERATION, func_name);
4170 GL_INVALID_FRAMEBUFFER_OPERATION, func_name);
4171 if (valid && !features().chromium_framebuffer_multisample) 4183 if (valid && !features().chromium_framebuffer_multisample)
4172 OnUseFramebuffer(); 4184 OnUseFramebuffer();
4173 if (valid && feature_info_->feature_flags().desktop_srgb_support) { 4185 if (valid && feature_info_->feature_flags().desktop_srgb_support) {
4174 // If framebuffer contains sRGB images, then enable FRAMEBUFFER_SRGB. 4186 // If framebuffer contains sRGB images, then enable FRAMEBUFFER_SRGB.
4175 // Otherwise, disable FRAMEBUFFER_SRGB. Assume default fbo does not have 4187 // Otherwise, disable FRAMEBUFFER_SRGB. Assume default fbo does not have
4176 // sRGB image. 4188 // sRGB image.
4177 // In theory, we can just leave FRAMEBUFFER_SRGB on. However, many drivers 4189 // In theory, we can just leave FRAMEBUFFER_SRGB on. However, many drivers
4178 // behave incorrectly when all images are linear encoding, they still apply 4190 // behave incorrectly when all images are linear encoding, they still apply
4179 // the sRGB conversion, but when at least one image is sRGB, then they 4191 // the sRGB conversion, but when at least one image is sRGB, then they
4180 // behave correctly. 4192 // behave correctly.
4181 bool enable_framebuffer_srgb = 4193 bool enable_framebuffer_srgb =
4182 framebuffer && framebuffer->HasSRGBAttachments(); 4194 framebuffer && framebuffer->HasSRGBAttachments();
4183 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); 4195 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb);
4184 } 4196 }
4185 return valid; 4197 return valid;
4186 } 4198 }
4187 4199
4188 bool GLES2DecoderImpl::CheckBoundReadFramebufferValid( 4200 bool GLES2DecoderImpl::CheckBoundReadFramebufferValid(
4189 const char* func_name, GLenum gl_error) { 4201 const char* func_name, GLenum gl_error) {
4190 GLenum target = features().chromium_framebuffer_multisample ? 4202 GLenum target = features().chromium_framebuffer_multisample ?
4191 GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER; 4203 GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER;
4192 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); 4204 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target);
4193 bool valid = CheckFramebufferValid( 4205 bool valid = CheckFramebufferValid(
4194 framebuffer, target, true, gl_error, func_name); 4206 framebuffer, target, gl_error, func_name);
4195 return valid; 4207 return valid;
4196 } 4208 }
4197 4209
4198 bool GLES2DecoderImpl::CheckBoundFramebufferValid(const char* func_name) { 4210 bool GLES2DecoderImpl::CheckBoundFramebufferValid(const char* func_name) {
4199 GLenum target = features().chromium_framebuffer_multisample ? 4211 GLenum target = features().chromium_framebuffer_multisample ?
4200 GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER; 4212 GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER;
4201 Framebuffer* draw_framebuffer = GetFramebufferInfoForTarget(target); 4213 Framebuffer* draw_framebuffer = GetFramebufferInfoForTarget(target);
4202 bool valid = CheckFramebufferValid( 4214 bool valid = CheckFramebufferValid(
4203 draw_framebuffer, target, true, 4215 draw_framebuffer, target, GL_INVALID_FRAMEBUFFER_OPERATION, func_name);
4204 GL_INVALID_FRAMEBUFFER_OPERATION, func_name);
4205 4216
4206 target = features().chromium_framebuffer_multisample ? 4217 target = features().chromium_framebuffer_multisample ?
4207 GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER; 4218 GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER;
4208 Framebuffer* read_framebuffer = GetFramebufferInfoForTarget(target); 4219 Framebuffer* read_framebuffer = GetFramebufferInfoForTarget(target);
4209 valid = valid && CheckFramebufferValid( 4220 valid = valid && CheckFramebufferValid(
4210 read_framebuffer, target, true, 4221 read_framebuffer, target, GL_INVALID_FRAMEBUFFER_OPERATION, func_name);
4211 GL_INVALID_FRAMEBUFFER_OPERATION, func_name);
4212 4222
4213 if (valid && feature_info_->feature_flags().desktop_srgb_support) { 4223 if (valid && feature_info_->feature_flags().desktop_srgb_support) {
4214 bool enable_framebuffer_srgb = 4224 bool enable_framebuffer_srgb =
4215 (draw_framebuffer && draw_framebuffer->HasSRGBAttachments()) || 4225 (draw_framebuffer && draw_framebuffer->HasSRGBAttachments()) ||
4216 (read_framebuffer && read_framebuffer->HasSRGBAttachments()); 4226 (read_framebuffer && read_framebuffer->HasSRGBAttachments());
4217 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); 4227 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb);
4218 } 4228 }
4219 4229
4220 return valid; 4230 return valid;
4221 } 4231 }
(...skipping 2582 matching lines...) Expand 10 before | Expand all | Expand 10 after
6804 } else { 6814 } else {
6805 LOCAL_SET_GL_ERROR( 6815 LOCAL_SET_GL_ERROR(
6806 GL_INVALID_VALUE, "glDeleteProgram", "unknown program"); 6816 GL_INVALID_VALUE, "glDeleteProgram", "unknown program");
6807 } 6817 }
6808 } 6818 }
6809 return error::kNoError; 6819 return error::kNoError;
6810 } 6820 }
6811 6821
6812 error::Error GLES2DecoderImpl::DoClear(GLbitfield mask) { 6822 error::Error GLES2DecoderImpl::DoClear(GLbitfield mask) {
6813 DCHECK(!ShouldDeferDraws()); 6823 DCHECK(!ShouldDeferDraws());
6814 if (CheckBoundDrawFramebufferValid(true, "glClear")) { 6824 if (CheckBoundDrawFramebufferValid("glClear")) {
6815 ApplyDirtyState(); 6825 ApplyDirtyState();
6816 // TODO(zmo): Filter out INTEGER/SIGNED INTEGER images to avoid
6817 // undefined results.
6818 if (workarounds().gl_clear_broken) { 6826 if (workarounds().gl_clear_broken) {
6819 ScopedGLErrorSuppressor suppressor("GLES2DecoderImpl::ClearWorkaround", 6827 ScopedGLErrorSuppressor suppressor("GLES2DecoderImpl::ClearWorkaround",
6820 GetErrorState()); 6828 GetErrorState());
6821 if (!BoundFramebufferHasDepthAttachment()) 6829 if (!BoundFramebufferHasDepthAttachment())
6822 mask &= ~GL_DEPTH_BUFFER_BIT; 6830 mask &= ~GL_DEPTH_BUFFER_BIT;
6823 if (!BoundFramebufferHasStencilAttachment()) 6831 if (!BoundFramebufferHasStencilAttachment())
6824 mask &= ~GL_STENCIL_BUFFER_BIT; 6832 mask &= ~GL_STENCIL_BUFFER_BIT;
6825 clear_framebuffer_blit_->ClearFramebuffer( 6833 clear_framebuffer_blit_->ClearFramebuffer(
6826 this, GetBoundReadFrameBufferSize(), mask, state_.color_clear_red, 6834 this, GetBoundReadFrameBufferSize(), mask, state_.color_clear_red,
6827 state_.color_clear_green, state_.color_clear_blue, 6835 state_.color_clear_green, state_.color_clear_blue,
6828 state_.color_clear_alpha, state_.depth_clear, state_.stencil_clear); 6836 state_.color_clear_alpha, state_.depth_clear, state_.stencil_clear);
6829 return error::kNoError; 6837 return error::kNoError;
6830 } 6838 }
6839 AdjustDrawBuffers();
6831 glClear(mask); 6840 glClear(mask);
6832 } 6841 }
6833 return error::kNoError; 6842 return error::kNoError;
6834 } 6843 }
6835 6844
6836 void GLES2DecoderImpl::DoClearBufferiv( 6845 void GLES2DecoderImpl::DoClearBufferiv(
6837 GLenum buffer, GLint drawbuffer, const GLint* value) { 6846 GLenum buffer, GLint drawbuffer, const GLint* value) {
6838 // TODO(zmo): Set clear_uncleared_images=true once crbug.com/584059 is fixed. 6847 if (!CheckBoundDrawFramebufferValid("glClearBufferiv"))
6839 if (!CheckBoundDrawFramebufferValid(false, "glClearBufferiv"))
6840 return; 6848 return;
6841 ApplyDirtyState(); 6849 ApplyDirtyState();
6842 6850
6843 if (buffer == GL_COLOR) { 6851 if (buffer == GL_COLOR) {
6844 if (drawbuffer < 0 || 6852 if (drawbuffer < 0 ||
6845 drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) { 6853 drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) {
6846 LOCAL_SET_GL_ERROR( 6854 LOCAL_SET_GL_ERROR(
6847 GL_INVALID_VALUE, "glClearBufferiv", "invalid drawBuffer"); 6855 GL_INVALID_VALUE, "glClearBufferiv", "invalid drawBuffer");
6848 return; 6856 return;
6849 } 6857 }
(...skipping 13 matching lines...) Expand all
6863 if (!BoundFramebufferHasStencilAttachment()) { 6871 if (!BoundFramebufferHasStencilAttachment()) {
6864 return; 6872 return;
6865 } 6873 }
6866 } 6874 }
6867 MarkDrawBufferAsCleared(buffer, drawbuffer); 6875 MarkDrawBufferAsCleared(buffer, drawbuffer);
6868 glClearBufferiv(buffer, drawbuffer, value); 6876 glClearBufferiv(buffer, drawbuffer, value);
6869 } 6877 }
6870 6878
6871 void GLES2DecoderImpl::DoClearBufferuiv( 6879 void GLES2DecoderImpl::DoClearBufferuiv(
6872 GLenum buffer, GLint drawbuffer, const GLuint* value) { 6880 GLenum buffer, GLint drawbuffer, const GLuint* value) {
6873 // TODO(zmo): Set clear_uncleared_images=true once crbug.com/584059 is fixed. 6881 if (!CheckBoundDrawFramebufferValid("glClearBufferuiv"))
6874 if (!CheckBoundDrawFramebufferValid(false, "glClearBufferuiv"))
6875 return; 6882 return;
6876 ApplyDirtyState(); 6883 ApplyDirtyState();
6877 6884
6878 if (drawbuffer < 0 || 6885 if (drawbuffer < 0 ||
6879 drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) { 6886 drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) {
6880 LOCAL_SET_GL_ERROR( 6887 LOCAL_SET_GL_ERROR(
6881 GL_INVALID_VALUE, "glClearBufferuiv", "invalid drawBuffer"); 6888 GL_INVALID_VALUE, "glClearBufferuiv", "invalid drawBuffer");
6882 return; 6889 return;
6883 } 6890 }
6884 GLenum internal_format = 6891 GLenum internal_format =
6885 GetBoundColorDrawBufferInternalFormat(drawbuffer); 6892 GetBoundColorDrawBufferInternalFormat(drawbuffer);
6886 if (!GLES2Util::IsUnsignedIntegerFormat(internal_format)) { 6893 if (!GLES2Util::IsUnsignedIntegerFormat(internal_format)) {
6887 // To avoid undefined results, return without calling the gl function. 6894 // To avoid undefined results, return without calling the gl function.
6888 return; 6895 return;
6889 } 6896 }
6890 MarkDrawBufferAsCleared(buffer, drawbuffer); 6897 MarkDrawBufferAsCleared(buffer, drawbuffer);
6891 glClearBufferuiv(buffer, drawbuffer, value); 6898 glClearBufferuiv(buffer, drawbuffer, value);
6892 } 6899 }
6893 6900
6894 void GLES2DecoderImpl::DoClearBufferfv( 6901 void GLES2DecoderImpl::DoClearBufferfv(
6895 GLenum buffer, GLint drawbuffer, const GLfloat* value) { 6902 GLenum buffer, GLint drawbuffer, const GLfloat* value) {
6896 // TODO(zmo): Set clear_uncleared_images=true once crbug.com/584059 is fixed. 6903 if (!CheckBoundDrawFramebufferValid("glClearBufferfv"))
6897 if (!CheckBoundDrawFramebufferValid(false, "glClearBufferfv"))
6898 return; 6904 return;
6899 ApplyDirtyState(); 6905 ApplyDirtyState();
6900 6906
6901 if (buffer == GL_COLOR) { 6907 if (buffer == GL_COLOR) {
6902 if (drawbuffer < 0 || 6908 if (drawbuffer < 0 ||
6903 drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) { 6909 drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) {
6904 LOCAL_SET_GL_ERROR( 6910 LOCAL_SET_GL_ERROR(
6905 GL_INVALID_VALUE, "glClearBufferfv", "invalid drawBuffer"); 6911 GL_INVALID_VALUE, "glClearBufferfv", "invalid drawBuffer");
6906 return; 6912 return;
6907 } 6913 }
(...skipping 13 matching lines...) Expand all
6921 if (!BoundFramebufferHasDepthAttachment()) { 6927 if (!BoundFramebufferHasDepthAttachment()) {
6922 return; 6928 return;
6923 } 6929 }
6924 } 6930 }
6925 MarkDrawBufferAsCleared(buffer, drawbuffer); 6931 MarkDrawBufferAsCleared(buffer, drawbuffer);
6926 glClearBufferfv(buffer, drawbuffer, value); 6932 glClearBufferfv(buffer, drawbuffer, value);
6927 } 6933 }
6928 6934
6929 void GLES2DecoderImpl::DoClearBufferfi( 6935 void GLES2DecoderImpl::DoClearBufferfi(
6930 GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) { 6936 GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) {
6931 // TODO(zmo): Set clear_uncleared_images=true once crbug.com/584059 is fixed. 6937 if (!CheckBoundDrawFramebufferValid("glClearBufferfi"))
6932 if (!CheckBoundDrawFramebufferValid(false, "glClearBufferfi"))
6933 return; 6938 return;
6934 ApplyDirtyState(); 6939 ApplyDirtyState();
6935 6940
6936 if (drawbuffer != 0) { 6941 if (drawbuffer != 0) {
6937 LOCAL_SET_GL_ERROR( 6942 LOCAL_SET_GL_ERROR(
6938 GL_INVALID_VALUE, "glClearBufferfi", "invalid drawBuffer"); 6943 GL_INVALID_VALUE, "glClearBufferfi", "invalid drawBuffer");
6939 return; 6944 return;
6940 } 6945 }
6941 if (!BoundFramebufferHasDepthAttachment() && 6946 if (!BoundFramebufferHasDepthAttachment() &&
6942 !BoundFramebufferHasStencilAttachment()) { 6947 !BoundFramebufferHasStencilAttachment()) {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
7055 7060
7056 GLbitfield clear_bits = 0; 7061 GLbitfield clear_bits = 0;
7057 bool reset_draw_buffers = false; 7062 bool reset_draw_buffers = false;
7058 if (framebuffer->HasUnclearedColorAttachments()) { 7063 if (framebuffer->HasUnclearedColorAttachments()) {
7059 // We should always use alpha == 0 here, because 1) some draw buffers may 7064 // We should always use alpha == 0 here, because 1) some draw buffers may
7060 // have alpha and some may not; 2) we won't have the same situation as the 7065 // have alpha and some may not; 2) we won't have the same situation as the
7061 // back buffer where alpha channel exists but is not requested. 7066 // back buffer where alpha channel exists but is not requested.
7062 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 7067 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
7063 state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 7068 state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
7064 clear_bits |= GL_COLOR_BUFFER_BIT; 7069 clear_bits |= GL_COLOR_BUFFER_BIT;
7065 if (feature_info_->feature_flags().ext_draw_buffers || 7070
7066 feature_info_->IsES3Enabled()) { 7071 if (SupportsDrawBuffers()) {
7067 reset_draw_buffers = framebuffer->PrepareDrawBuffersForClear(); 7072 reset_draw_buffers =
7073 framebuffer->PrepareDrawBuffersForClearingUninitializedAttachments();
7068 } 7074 }
7069 } 7075 }
7070 7076
7071 if (framebuffer->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT) || 7077 if (framebuffer->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT) ||
7072 framebuffer->HasUnclearedAttachment(GL_DEPTH_STENCIL_ATTACHMENT)) { 7078 framebuffer->HasUnclearedAttachment(GL_DEPTH_STENCIL_ATTACHMENT)) {
7073 glClearStencil(0); 7079 glClearStencil(0);
7074 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask); 7080 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask);
7075 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask); 7081 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask);
7076 clear_bits |= GL_STENCIL_BUFFER_BIT; 7082 clear_bits |= GL_STENCIL_BUFFER_BIT;
7077 } 7083 }
(...skipping 11 matching lines...) Expand all
7089 // TODO(zmo): There is no guarantee that an FBO that is complete on the 7095 // TODO(zmo): There is no guarantee that an FBO that is complete on the
7090 // READ attachment will be complete as a DRAW attachment. 7096 // READ attachment will be complete as a DRAW attachment.
7091 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, framebuffer->service_id()); 7097 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, framebuffer->service_id());
7092 } 7098 }
7093 state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); 7099 state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false);
7094 glClear(clear_bits); 7100 glClear(clear_bits);
7095 } 7101 }
7096 7102
7097 if (cleared_int_renderbuffers || clear_bits) { 7103 if (cleared_int_renderbuffers || clear_bits) {
7098 if (reset_draw_buffers) 7104 if (reset_draw_buffers)
7099 framebuffer->RestoreDrawBuffersAfterClear(); 7105 framebuffer->RestoreDrawBuffers();
7100 RestoreClearState(); 7106 RestoreClearState();
7101 if (target == GL_READ_FRAMEBUFFER && draw_framebuffer != framebuffer) { 7107 if (target == GL_READ_FRAMEBUFFER && draw_framebuffer != framebuffer) {
7102 GLuint service_id = draw_framebuffer ? draw_framebuffer->service_id() : 7108 GLuint service_id = draw_framebuffer ? draw_framebuffer->service_id() :
7103 GetBackbufferServiceId(); 7109 GetBackbufferServiceId();
7104 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, service_id); 7110 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, service_id);
7105 } 7111 }
7106 } 7112 }
7107 7113
7108 framebuffer_manager()->MarkAttachmentsAsCleared( 7114 framebuffer_manager()->MarkAttachmentsAsCleared(
7109 framebuffer, renderbuffer_manager(), texture_manager()); 7115 framebuffer, renderbuffer_manager(), texture_manager());
(...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after
8019 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; 8025 TextureUnit& texture_unit = state_.texture_units[texture_unit_index];
8020 TextureRef* texture_ref = 8026 TextureRef* texture_ref =
8021 texture_unit.GetInfoForSamplerType(uniform_info->type).get(); 8027 texture_unit.GetInfoForSamplerType(uniform_info->type).get();
8022 if (attachment->IsTexture(texture_ref)) 8028 if (attachment->IsTexture(texture_ref))
8023 return true; 8029 return true;
8024 } 8030 }
8025 } 8031 }
8026 return false; 8032 return false;
8027 } 8033 }
8028 8034
8035 bool GLES2DecoderImpl::SupportsDrawBuffers() const {
8036 switch (feature_info_->context_type()) {
8037 case CONTEXT_TYPE_OPENGLES2:
8038 case CONTEXT_TYPE_WEBGL1:
8039 return feature_info_->feature_flags().ext_draw_buffers;
8040 default:
8041 return true;
8042 }
8043 }
8044
8045 bool GLES2DecoderImpl::ValidateAndAdjustDrawBuffers(const char* func_name) {
8046 if (!SupportsDrawBuffers()) {
8047 return true;
8048 }
8049 Framebuffer* framebuffer = framebuffer_state_.bound_draw_framebuffer.get();
8050 if (!state_.current_program.get() || !framebuffer) {
8051 return true;
8052 }
8053 const ShaderVariableBaseType* fragment_output_base_types =
8054 state_.current_program->GetFragmentOutputBaseTypes();
8055 if (!framebuffer->ValidateAndAdjustDrawBuffers(fragment_output_base_types)) {
8056 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name,
8057 "buffer format and fragment output variable type incompatible");
8058 return false;
8059 }
8060 return true;
8061 }
8062
8063 void GLES2DecoderImpl::AdjustDrawBuffers() {
8064 if (!SupportsDrawBuffers())
8065 return;
8066 Framebuffer* framebuffer = framebuffer_state_.bound_draw_framebuffer.get();
8067 if (!framebuffer)
8068 return;
8069 framebuffer->ValidateAndAdjustDrawBuffers(nullptr);
8070 }
8071
8029 bool GLES2DecoderImpl::CheckUniformForApiType( 8072 bool GLES2DecoderImpl::CheckUniformForApiType(
8030 const Program::UniformInfo* info, 8073 const Program::UniformInfo* info,
8031 const char* function_name, 8074 const char* function_name,
8032 Program::UniformApiType api_type) { 8075 Program::UniformApiType api_type) {
8033 DCHECK(info); 8076 DCHECK(info);
8034 if ((api_type & info->accepts_api_type) == 0) { 8077 if ((api_type & info->accepts_api_type) == 0) {
8035 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, 8078 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
8036 "wrong uniform function for type"); 8079 "wrong uniform function for type");
8037 return false; 8080 return false;
8038 } 8081 }
(...skipping 966 matching lines...) Expand 10 before | Expand all | Expand 10 after
9005 return error::kNoError; 9048 return error::kNoError;
9006 } 9049 }
9007 if (count < 0) { 9050 if (count < 0) {
9008 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "count < 0"); 9051 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "count < 0");
9009 return error::kNoError; 9052 return error::kNoError;
9010 } 9053 }
9011 if (primcount < 0) { 9054 if (primcount < 0) {
9012 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "primcount < 0"); 9055 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "primcount < 0");
9013 return error::kNoError; 9056 return error::kNoError;
9014 } 9057 }
9015 if (!CheckBoundDrawFramebufferValid(true, function_name)) { 9058 if (!CheckBoundDrawFramebufferValid(function_name)) {
9016 return error::kNoError; 9059 return error::kNoError;
9017 } 9060 }
9018 // We have to check this here because the prototype for glDrawArrays 9061 // We have to check this here because the prototype for glDrawArrays
9019 // is GLint not GLsizei. 9062 // is GLint not GLsizei.
9020 if (first < 0) { 9063 if (first < 0) {
9021 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "first < 0"); 9064 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "first < 0");
9022 return error::kNoError; 9065 return error::kNoError;
9023 } 9066 }
9024 9067
9025 if (state_.bound_transform_feedback.get() && 9068 if (state_.bound_transform_feedback.get() &&
(...skipping 20 matching lines...) Expand all
9046 if (!SimulateAttrib0( 9089 if (!SimulateAttrib0(
9047 function_name, max_vertex_accessed, &simulated_attrib_0)) { 9090 function_name, max_vertex_accessed, &simulated_attrib_0)) {
9048 return error::kNoError; 9091 return error::kNoError;
9049 } 9092 }
9050 bool simulated_fixed_attribs = false; 9093 bool simulated_fixed_attribs = false;
9051 if (SimulateFixedAttribs( 9094 if (SimulateFixedAttribs(
9052 function_name, max_vertex_accessed, &simulated_fixed_attribs, 9095 function_name, max_vertex_accessed, &simulated_fixed_attribs,
9053 primcount)) { 9096 primcount)) {
9054 bool textures_set = !PrepareTexturesForRender(); 9097 bool textures_set = !PrepareTexturesForRender();
9055 ApplyDirtyState(); 9098 ApplyDirtyState();
9099 if (!ValidateAndAdjustDrawBuffers(function_name)) {
9100 return error::kNoError;
9101 }
9056 if (!instanced) { 9102 if (!instanced) {
9057 glDrawArrays(mode, first, count); 9103 glDrawArrays(mode, first, count);
9058 } else { 9104 } else {
9059 glDrawArraysInstancedANGLE(mode, first, count, primcount); 9105 glDrawArraysInstancedANGLE(mode, first, count, primcount);
9060 } 9106 }
9061 if (textures_set) { 9107 if (textures_set) {
9062 RestoreStateForTextures(); 9108 RestoreStateForTextures();
9063 } 9109 }
9064 if (simulated_fixed_attribs) { 9110 if (simulated_fixed_attribs) {
9065 RestoreStateForSimulatedFixedAttribs(); 9111 RestoreStateForSimulatedFixedAttribs();
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
9133 } 9179 }
9134 if (!validators_->index_type.IsValid(type)) { 9180 if (!validators_->index_type.IsValid(type)) {
9135 LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, type, "type"); 9181 LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, type, "type");
9136 return error::kNoError; 9182 return error::kNoError;
9137 } 9183 }
9138 if (primcount < 0) { 9184 if (primcount < 0) {
9139 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "primcount < 0"); 9185 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "primcount < 0");
9140 return error::kNoError; 9186 return error::kNoError;
9141 } 9187 }
9142 9188
9143 if (!CheckBoundDrawFramebufferValid(true, function_name)) { 9189 if (!CheckBoundDrawFramebufferValid(function_name)) {
9144 return error::kNoError; 9190 return error::kNoError;
9145 } 9191 }
9146 9192
9147 if (state_.bound_transform_feedback.get() && 9193 if (state_.bound_transform_feedback.get() &&
9148 state_.bound_transform_feedback->active() && 9194 state_.bound_transform_feedback->active() &&
9149 !state_.bound_transform_feedback->paused()) { 9195 !state_.bound_transform_feedback->paused()) {
9150 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, 9196 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
9151 "transformfeedback is active and not paused"); 9197 "transformfeedback is active and not paused");
9152 return error::kNoError; 9198 return error::kNoError;
9153 } 9199 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
9187 ApplyDirtyState(); 9233 ApplyDirtyState();
9188 // TODO(gman): Refactor to hide these details in BufferManager or 9234 // TODO(gman): Refactor to hide these details in BufferManager or
9189 // VertexAttribManager. 9235 // VertexAttribManager.
9190 const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset); 9236 const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset);
9191 bool used_client_side_array = false; 9237 bool used_client_side_array = false;
9192 if (element_array_buffer->IsClientSideArray()) { 9238 if (element_array_buffer->IsClientSideArray()) {
9193 used_client_side_array = true; 9239 used_client_side_array = true;
9194 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 9240 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
9195 indices = element_array_buffer->GetRange(offset, 0); 9241 indices = element_array_buffer->GetRange(offset, 0);
9196 } 9242 }
9197 9243 if (!ValidateAndAdjustDrawBuffers(function_name)) {
9244 return error::kNoError;
9245 }
9198 if (state_.enable_flags.primitive_restart_fixed_index && 9246 if (state_.enable_flags.primitive_restart_fixed_index &&
9199 feature_info_->feature_flags(). 9247 feature_info_->feature_flags().
9200 emulate_primitive_restart_fixed_index) { 9248 emulate_primitive_restart_fixed_index) {
9201 glEnable(GL_PRIMITIVE_RESTART); 9249 glEnable(GL_PRIMITIVE_RESTART);
9202 buffer_manager()->SetPrimitiveRestartFixedIndexIfNecessary(type); 9250 buffer_manager()->SetPrimitiveRestartFixedIndexIfNecessary(type);
9203 } 9251 }
9204
9205 if (!instanced) { 9252 if (!instanced) {
9206 glDrawElements(mode, count, type, indices); 9253 glDrawElements(mode, count, type, indices);
9207 } else { 9254 } else {
9208 glDrawElementsInstancedANGLE(mode, count, type, indices, primcount); 9255 glDrawElementsInstancedANGLE(mode, count, type, indices, primcount);
9209 } 9256 }
9210 if (state_.enable_flags.primitive_restart_fixed_index && 9257 if (state_.enable_flags.primitive_restart_fixed_index &&
9211 feature_info_->feature_flags(). 9258 feature_info_->feature_flags().
9212 emulate_primitive_restart_fixed_index) { 9259 emulate_primitive_restart_fixed_index) {
9213 glDisable(GL_PRIMITIVE_RESTART); 9260 glDisable(GL_PRIMITIVE_RESTART);
9214 } 9261 }
9215
9216 if (used_client_side_array) { 9262 if (used_client_side_array) {
9217 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 9263 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
9218 element_array_buffer->service_id()); 9264 element_array_buffer->service_id());
9219 } 9265 }
9220
9221 if (textures_set) { 9266 if (textures_set) {
9222 RestoreStateForTextures(); 9267 RestoreStateForTextures();
9223 } 9268 }
9224 if (simulated_fixed_attribs) { 9269 if (simulated_fixed_attribs) {
9225 RestoreStateForSimulatedFixedAttribs(); 9270 RestoreStateForSimulatedFixedAttribs();
9226 } 9271 }
9227 } 9272 }
9228 if (simulated_attrib_0) { 9273 if (simulated_attrib_0) {
9229 // We don't have to restore attrib 0 generic data at the end of this 9274 // We don't have to restore attrib 0 generic data at the end of this
9230 // function even if it is simulated. This is because we will simulate 9275 // function even if it is simulated. This is because we will simulate
(...skipping 7234 matching lines...) Expand 10 before | Expand all | Expand 10 after
16465 GLuint mask = 0; 16510 GLuint mask = 0;
16466 if (!v.GetFillModeAndMask(c, &fill_mode, &mask)) 16511 if (!v.GetFillModeAndMask(c, &fill_mode, &mask))
16467 return v.error(); 16512 return v.error();
16468 GLuint service_id = 0; 16513 GLuint service_id = 0;
16469 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) { 16514 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) {
16470 // "If /path/ does not name an existing path object, the command does 16515 // "If /path/ does not name an existing path object, the command does
16471 // nothing (and no error is generated)." 16516 // nothing (and no error is generated)."
16472 // This holds for other rendering functions, too. 16517 // This holds for other rendering functions, too.
16473 return error::kNoError; 16518 return error::kNoError;
16474 } 16519 }
16475 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16520 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16476 return error::kNoError; 16521 return error::kNoError;
16477 ApplyDirtyState(); 16522 ApplyDirtyState();
16478 glStencilFillPathNV(service_id, fill_mode, mask); 16523 glStencilFillPathNV(service_id, fill_mode, mask);
16479 return error::kNoError; 16524 return error::kNoError;
16480 } 16525 }
16481 16526
16482 error::Error GLES2DecoderImpl::HandleStencilStrokePathCHROMIUM( 16527 error::Error GLES2DecoderImpl::HandleStencilStrokePathCHROMIUM(
16483 uint32_t immediate_data_size, 16528 uint32_t immediate_data_size,
16484 const void* cmd_data) { 16529 const void* cmd_data) {
16485 static const char kFunctionName[] = "glStencilStrokePathCHROMIUM"; 16530 static const char kFunctionName[] = "glStencilStrokePathCHROMIUM";
16486 const gles2::cmds::StencilStrokePathCHROMIUM& c = 16531 const gles2::cmds::StencilStrokePathCHROMIUM& c =
16487 *static_cast<const gles2::cmds::StencilStrokePathCHROMIUM*>(cmd_data); 16532 *static_cast<const gles2::cmds::StencilStrokePathCHROMIUM*>(cmd_data);
16488 if (!features().chromium_path_rendering) 16533 if (!features().chromium_path_rendering)
16489 return error::kUnknownCommand; 16534 return error::kUnknownCommand;
16490 16535
16491 GLuint service_id = 0; 16536 GLuint service_id = 0;
16492 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) { 16537 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) {
16493 return error::kNoError; 16538 return error::kNoError;
16494 } 16539 }
16495 GLint reference = static_cast<GLint>(c.reference); 16540 GLint reference = static_cast<GLint>(c.reference);
16496 GLuint mask = static_cast<GLuint>(c.mask); 16541 GLuint mask = static_cast<GLuint>(c.mask);
16497 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16542 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16498 return error::kNoError; 16543 return error::kNoError;
16499 ApplyDirtyState(); 16544 ApplyDirtyState();
16500 glStencilStrokePathNV(service_id, reference, mask); 16545 glStencilStrokePathNV(service_id, reference, mask);
16501 return error::kNoError; 16546 return error::kNoError;
16502 } 16547 }
16503 16548
16504 error::Error GLES2DecoderImpl::HandleCoverFillPathCHROMIUM( 16549 error::Error GLES2DecoderImpl::HandleCoverFillPathCHROMIUM(
16505 uint32_t immediate_data_size, 16550 uint32_t immediate_data_size,
16506 const void* cmd_data) { 16551 const void* cmd_data) {
16507 static const char kFunctionName[] = "glCoverFillPathCHROMIUM"; 16552 static const char kFunctionName[] = "glCoverFillPathCHROMIUM";
16508 const gles2::cmds::CoverFillPathCHROMIUM& c = 16553 const gles2::cmds::CoverFillPathCHROMIUM& c =
16509 *static_cast<const gles2::cmds::CoverFillPathCHROMIUM*>(cmd_data); 16554 *static_cast<const gles2::cmds::CoverFillPathCHROMIUM*>(cmd_data);
16510 if (!features().chromium_path_rendering) 16555 if (!features().chromium_path_rendering)
16511 return error::kUnknownCommand; 16556 return error::kUnknownCommand;
16512 16557
16513 PathCommandValidatorContext v(this, kFunctionName); 16558 PathCommandValidatorContext v(this, kFunctionName);
16514 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; 16559 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM;
16515 if (!v.GetCoverMode(c, &cover_mode)) 16560 if (!v.GetCoverMode(c, &cover_mode))
16516 return v.error(); 16561 return v.error();
16517 16562
16518 GLuint service_id = 0; 16563 GLuint service_id = 0;
16519 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) 16564 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id))
16520 return error::kNoError; 16565 return error::kNoError;
16521 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16566 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16522 return error::kNoError; 16567 return error::kNoError;
16523 ApplyDirtyState(); 16568 ApplyDirtyState();
16524 glCoverFillPathNV(service_id, cover_mode); 16569 glCoverFillPathNV(service_id, cover_mode);
16525 return error::kNoError; 16570 return error::kNoError;
16526 } 16571 }
16527 16572
16528 error::Error GLES2DecoderImpl::HandleCoverStrokePathCHROMIUM( 16573 error::Error GLES2DecoderImpl::HandleCoverStrokePathCHROMIUM(
16529 uint32_t immediate_data_size, 16574 uint32_t immediate_data_size,
16530 const void* cmd_data) { 16575 const void* cmd_data) {
16531 static const char kFunctionName[] = "glCoverStrokePathCHROMIUM"; 16576 static const char kFunctionName[] = "glCoverStrokePathCHROMIUM";
16532 const gles2::cmds::CoverStrokePathCHROMIUM& c = 16577 const gles2::cmds::CoverStrokePathCHROMIUM& c =
16533 *static_cast<const gles2::cmds::CoverStrokePathCHROMIUM*>(cmd_data); 16578 *static_cast<const gles2::cmds::CoverStrokePathCHROMIUM*>(cmd_data);
16534 if (!features().chromium_path_rendering) 16579 if (!features().chromium_path_rendering)
16535 return error::kUnknownCommand; 16580 return error::kUnknownCommand;
16536 16581
16537 PathCommandValidatorContext v(this, kFunctionName); 16582 PathCommandValidatorContext v(this, kFunctionName);
16538 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; 16583 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM;
16539 if (!v.GetCoverMode(c, &cover_mode)) 16584 if (!v.GetCoverMode(c, &cover_mode))
16540 return v.error(); 16585 return v.error();
16541 16586
16542 GLuint service_id = 0; 16587 GLuint service_id = 0;
16543 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) 16588 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id))
16544 return error::kNoError; 16589 return error::kNoError;
16545 16590
16546 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16591 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16547 return error::kNoError; 16592 return error::kNoError;
16548 ApplyDirtyState(); 16593 ApplyDirtyState();
16549 glCoverStrokePathNV(service_id, cover_mode); 16594 glCoverStrokePathNV(service_id, cover_mode);
16550 return error::kNoError; 16595 return error::kNoError;
16551 } 16596 }
16552 16597
16553 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathCHROMIUM( 16598 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathCHROMIUM(
16554 uint32_t immediate_data_size, 16599 uint32_t immediate_data_size,
16555 const void* cmd_data) { 16600 const void* cmd_data) {
16556 static const char kFunctionName[] = "glStencilThenCoverFillPathCHROMIUM"; 16601 static const char kFunctionName[] = "glStencilThenCoverFillPathCHROMIUM";
16557 const gles2::cmds::StencilThenCoverFillPathCHROMIUM& c = 16602 const gles2::cmds::StencilThenCoverFillPathCHROMIUM& c =
16558 *static_cast<const gles2::cmds::StencilThenCoverFillPathCHROMIUM*>( 16603 *static_cast<const gles2::cmds::StencilThenCoverFillPathCHROMIUM*>(
16559 cmd_data); 16604 cmd_data);
16560 if (!features().chromium_path_rendering) 16605 if (!features().chromium_path_rendering)
16561 return error::kUnknownCommand; 16606 return error::kUnknownCommand;
16562 16607
16563 PathCommandValidatorContext v(this, kFunctionName); 16608 PathCommandValidatorContext v(this, kFunctionName);
16564 GLenum fill_mode = GL_COUNT_UP_CHROMIUM; 16609 GLenum fill_mode = GL_COUNT_UP_CHROMIUM;
16565 GLuint mask = 0; 16610 GLuint mask = 0;
16566 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; 16611 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM;
16567 if (!v.GetFillModeAndMask(c, &fill_mode, &mask) || 16612 if (!v.GetFillModeAndMask(c, &fill_mode, &mask) ||
16568 !v.GetCoverMode(c, &cover_mode)) 16613 !v.GetCoverMode(c, &cover_mode))
16569 return v.error(); 16614 return v.error();
16570 16615
16571 GLuint service_id = 0; 16616 GLuint service_id = 0;
16572 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) 16617 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id))
16573 return error::kNoError; 16618 return error::kNoError;
16574 16619
16575 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16620 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16576 return error::kNoError; 16621 return error::kNoError;
16577 ApplyDirtyState(); 16622 ApplyDirtyState();
16578 glStencilThenCoverFillPathNV(service_id, fill_mode, mask, cover_mode); 16623 glStencilThenCoverFillPathNV(service_id, fill_mode, mask, cover_mode);
16579 return error::kNoError; 16624 return error::kNoError;
16580 } 16625 }
16581 16626
16582 error::Error GLES2DecoderImpl::HandleStencilThenCoverStrokePathCHROMIUM( 16627 error::Error GLES2DecoderImpl::HandleStencilThenCoverStrokePathCHROMIUM(
16583 uint32_t immediate_data_size, 16628 uint32_t immediate_data_size,
16584 const void* cmd_data) { 16629 const void* cmd_data) {
16585 static const char kFunctionName[] = "glStencilThenCoverStrokePathCHROMIUM"; 16630 static const char kFunctionName[] = "glStencilThenCoverStrokePathCHROMIUM";
16586 const gles2::cmds::StencilThenCoverStrokePathCHROMIUM& c = 16631 const gles2::cmds::StencilThenCoverStrokePathCHROMIUM& c =
16587 *static_cast<const gles2::cmds::StencilThenCoverStrokePathCHROMIUM*>( 16632 *static_cast<const gles2::cmds::StencilThenCoverStrokePathCHROMIUM*>(
16588 cmd_data); 16633 cmd_data);
16589 if (!features().chromium_path_rendering) 16634 if (!features().chromium_path_rendering)
16590 return error::kUnknownCommand; 16635 return error::kUnknownCommand;
16591 16636
16592 PathCommandValidatorContext v(this, kFunctionName); 16637 PathCommandValidatorContext v(this, kFunctionName);
16593 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; 16638 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM;
16594 if (!v.GetCoverMode(c, &cover_mode)) 16639 if (!v.GetCoverMode(c, &cover_mode))
16595 return v.error(); 16640 return v.error();
16596 16641
16597 GLuint service_id = 0; 16642 GLuint service_id = 0;
16598 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) 16643 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id))
16599 return error::kNoError; 16644 return error::kNoError;
16600 16645
16601 GLint reference = static_cast<GLint>(c.reference); 16646 GLint reference = static_cast<GLint>(c.reference);
16602 GLuint mask = static_cast<GLuint>(c.mask); 16647 GLuint mask = static_cast<GLuint>(c.mask);
16603 16648
16604 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16649 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16605 return error::kNoError; 16650 return error::kNoError;
16606 ApplyDirtyState(); 16651 ApplyDirtyState();
16607 glStencilThenCoverStrokePathNV(service_id, reference, mask, cover_mode); 16652 glStencilThenCoverStrokePathNV(service_id, reference, mask, cover_mode);
16608 return error::kNoError; 16653 return error::kNoError;
16609 } 16654 }
16610 16655
16611 error::Error GLES2DecoderImpl::HandleStencilFillPathInstancedCHROMIUM( 16656 error::Error GLES2DecoderImpl::HandleStencilFillPathInstancedCHROMIUM(
16612 uint32_t immediate_data_size, 16657 uint32_t immediate_data_size,
16613 const void* cmd_data) { 16658 const void* cmd_data) {
16614 static const char kFunctionName[] = "glStencilFillPathInstancedCHROMIUM"; 16659 static const char kFunctionName[] = "glStencilFillPathInstancedCHROMIUM";
(...skipping 18 matching lines...) Expand all
16633 return error::kNoError; 16678 return error::kNoError;
16634 16679
16635 std::unique_ptr<GLuint[]> paths; 16680 std::unique_ptr<GLuint[]> paths;
16636 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) 16681 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths))
16637 return v.error(); 16682 return v.error();
16638 16683
16639 const GLfloat* transforms = nullptr; 16684 const GLfloat* transforms = nullptr;
16640 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) 16685 if (!v.GetTransforms(c, num_paths, transform_type, &transforms))
16641 return v.error(); 16686 return v.error();
16642 16687
16643 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16688 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16644 return error::kNoError; 16689 return error::kNoError;
16645 ApplyDirtyState(); 16690 ApplyDirtyState();
16646 glStencilFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0, 16691 glStencilFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0,
16647 fill_mode, mask, transform_type, transforms); 16692 fill_mode, mask, transform_type, transforms);
16648 return error::kNoError; 16693 return error::kNoError;
16649 } 16694 }
16650 16695
16651 error::Error GLES2DecoderImpl::HandleStencilStrokePathInstancedCHROMIUM( 16696 error::Error GLES2DecoderImpl::HandleStencilStrokePathInstancedCHROMIUM(
16652 uint32_t immediate_data_size, 16697 uint32_t immediate_data_size,
16653 const void* cmd_data) { 16698 const void* cmd_data) {
(...skipping 18 matching lines...) Expand all
16672 std::unique_ptr<GLuint[]> paths; 16717 std::unique_ptr<GLuint[]> paths;
16673 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) 16718 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths))
16674 return v.error(); 16719 return v.error();
16675 16720
16676 const GLfloat* transforms = nullptr; 16721 const GLfloat* transforms = nullptr;
16677 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) 16722 if (!v.GetTransforms(c, num_paths, transform_type, &transforms))
16678 return v.error(); 16723 return v.error();
16679 16724
16680 GLint reference = static_cast<GLint>(c.reference); 16725 GLint reference = static_cast<GLint>(c.reference);
16681 GLuint mask = static_cast<GLuint>(c.mask); 16726 GLuint mask = static_cast<GLuint>(c.mask);
16682 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16727 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16683 return error::kNoError; 16728 return error::kNoError;
16684 ApplyDirtyState(); 16729 ApplyDirtyState();
16685 glStencilStrokePathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0, 16730 glStencilStrokePathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0,
16686 reference, mask, transform_type, transforms); 16731 reference, mask, transform_type, transforms);
16687 return error::kNoError; 16732 return error::kNoError;
16688 } 16733 }
16689 16734
16690 error::Error GLES2DecoderImpl::HandleCoverFillPathInstancedCHROMIUM( 16735 error::Error GLES2DecoderImpl::HandleCoverFillPathInstancedCHROMIUM(
16691 uint32_t immediate_data_size, 16736 uint32_t immediate_data_size,
16692 const void* cmd_data) { 16737 const void* cmd_data) {
(...skipping 18 matching lines...) Expand all
16711 return error::kNoError; 16756 return error::kNoError;
16712 16757
16713 std::unique_ptr<GLuint[]> paths; 16758 std::unique_ptr<GLuint[]> paths;
16714 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) 16759 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths))
16715 return v.error(); 16760 return v.error();
16716 16761
16717 const GLfloat* transforms = nullptr; 16762 const GLfloat* transforms = nullptr;
16718 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) 16763 if (!v.GetTransforms(c, num_paths, transform_type, &transforms))
16719 return v.error(); 16764 return v.error();
16720 16765
16721 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16766 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16722 return error::kNoError; 16767 return error::kNoError;
16723 ApplyDirtyState(); 16768 ApplyDirtyState();
16724 glCoverFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0, 16769 glCoverFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0,
16725 cover_mode, transform_type, transforms); 16770 cover_mode, transform_type, transforms);
16726 return error::kNoError; 16771 return error::kNoError;
16727 } 16772 }
16728 16773
16729 error::Error GLES2DecoderImpl::HandleCoverStrokePathInstancedCHROMIUM( 16774 error::Error GLES2DecoderImpl::HandleCoverStrokePathInstancedCHROMIUM(
16730 uint32_t immediate_data_size, 16775 uint32_t immediate_data_size,
16731 const void* cmd_data) { 16776 const void* cmd_data) {
(...skipping 18 matching lines...) Expand all
16750 return error::kNoError; 16795 return error::kNoError;
16751 16796
16752 std::unique_ptr<GLuint[]> paths; 16797 std::unique_ptr<GLuint[]> paths;
16753 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) 16798 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths))
16754 return v.error(); 16799 return v.error();
16755 16800
16756 const GLfloat* transforms = nullptr; 16801 const GLfloat* transforms = nullptr;
16757 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) 16802 if (!v.GetTransforms(c, num_paths, transform_type, &transforms))
16758 return v.error(); 16803 return v.error();
16759 16804
16760 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16805 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16761 return error::kNoError; 16806 return error::kNoError;
16762 ApplyDirtyState(); 16807 ApplyDirtyState();
16763 glCoverStrokePathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0, 16808 glCoverStrokePathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0,
16764 cover_mode, transform_type, transforms); 16809 cover_mode, transform_type, transforms);
16765 return error::kNoError; 16810 return error::kNoError;
16766 } 16811 }
16767 16812
16768 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathInstancedCHROMIUM( 16813 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathInstancedCHROMIUM(
16769 uint32_t immediate_data_size, 16814 uint32_t immediate_data_size,
16770 const void* cmd_data) { 16815 const void* cmd_data) {
(...skipping 23 matching lines...) Expand all
16794 return error::kNoError; 16839 return error::kNoError;
16795 16840
16796 std::unique_ptr<GLuint[]> paths; 16841 std::unique_ptr<GLuint[]> paths;
16797 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) 16842 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths))
16798 return v.error(); 16843 return v.error();
16799 16844
16800 const GLfloat* transforms = nullptr; 16845 const GLfloat* transforms = nullptr;
16801 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) 16846 if (!v.GetTransforms(c, num_paths, transform_type, &transforms))
16802 return v.error(); 16847 return v.error();
16803 16848
16804 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16849 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16805 return error::kNoError; 16850 return error::kNoError;
16806 ApplyDirtyState(); 16851 ApplyDirtyState();
16807 glStencilThenCoverFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 16852 glStencilThenCoverFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(),
16808 0, fill_mode, mask, cover_mode, 16853 0, fill_mode, mask, cover_mode,
16809 transform_type, transforms); 16854 transform_type, transforms);
16810 return error::kNoError; 16855 return error::kNoError;
16811 } 16856 }
16812 16857
16813 error::Error 16858 error::Error
16814 GLES2DecoderImpl::HandleStencilThenCoverStrokePathInstancedCHROMIUM( 16859 GLES2DecoderImpl::HandleStencilThenCoverStrokePathInstancedCHROMIUM(
(...skipping 24 matching lines...) Expand all
16839 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) 16884 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths))
16840 return v.error(); 16885 return v.error();
16841 16886
16842 const GLfloat* transforms = nullptr; 16887 const GLfloat* transforms = nullptr;
16843 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) 16888 if (!v.GetTransforms(c, num_paths, transform_type, &transforms))
16844 return v.error(); 16889 return v.error();
16845 16890
16846 GLint reference = static_cast<GLint>(c.reference); 16891 GLint reference = static_cast<GLint>(c.reference);
16847 GLuint mask = static_cast<GLuint>(c.mask); 16892 GLuint mask = static_cast<GLuint>(c.mask);
16848 16893
16849 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16894 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16850 return error::kNoError; 16895 return error::kNoError;
16851 ApplyDirtyState(); 16896 ApplyDirtyState();
16852 glStencilThenCoverStrokePathInstancedNV( 16897 glStencilThenCoverStrokePathInstancedNV(
16853 num_paths, GL_UNSIGNED_INT, paths.get(), 0, reference, mask, cover_mode, 16898 num_paths, GL_UNSIGNED_INT, paths.get(), 0, reference, mask, cover_mode,
16854 transform_type, transforms); 16899 transform_type, transforms);
16855 return error::kNoError; 16900 return error::kNoError;
16856 } 16901 }
16857 16902
16858 void GLES2DecoderImpl::DoBindFragmentInputLocationCHROMIUM( 16903 void GLES2DecoderImpl::DoBindFragmentInputLocationCHROMIUM(
16859 GLuint program_id, 16904 GLuint program_id,
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
17106 } 17151 }
17107 17152
17108 // Include the auto-generated part of this file. We split this because it means 17153 // Include the auto-generated part of this file. We split this because it means
17109 // we can easily edit the non-auto generated parts right here in this file 17154 // we can easily edit the non-auto generated parts right here in this file
17110 // instead of having to edit some template or the code generator. 17155 // instead of having to edit some template or the code generator.
17111 #include "base/macros.h" 17156 #include "base/macros.h"
17112 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 17157 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
17113 17158
17114 } // namespace gles2 17159 } // namespace gles2
17115 } // namespace gpu 17160 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698