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

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: revision addressed piman review comments 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 1321 matching lines...) Expand 10 before | Expand all | Expand 10 after
1332 1332
1333 // Check that the currently bound read framebuffer's color image 1333 // Check that the currently bound read framebuffer's color image
1334 // isn't the target texture of the glCopyTex{Sub}Image2D. 1334 // isn't the target texture of the glCopyTex{Sub}Image2D.
1335 bool FormsTextureCopyingFeedbackLoop(TextureRef* texture, GLint level); 1335 bool FormsTextureCopyingFeedbackLoop(TextureRef* texture, GLint level);
1336 1336
1337 // Check if a framebuffer meets our requirements. 1337 // Check if a framebuffer meets our requirements.
1338 // Generates |gl_error| if the framebuffer is incomplete. 1338 // Generates |gl_error| if the framebuffer is incomplete.
1339 bool CheckFramebufferValid( 1339 bool CheckFramebufferValid(
1340 Framebuffer* framebuffer, 1340 Framebuffer* framebuffer,
1341 GLenum target, 1341 GLenum target,
1342 bool clear_uncleared_images,
1343 GLenum gl_error, 1342 GLenum gl_error,
1344 const char* func_name); 1343 const char* func_name);
1345 1344
1346 bool CheckBoundDrawFramebufferValid( 1345 bool CheckBoundDrawFramebufferValid(const char* func_name);
1347 bool clear_uncleared_images, const char* func_name);
1348 // Generates |gl_error| if the bound read fbo is incomplete. 1346 // Generates |gl_error| if the bound read fbo is incomplete.
1349 bool CheckBoundReadFramebufferValid(const char* func_name, GLenum gl_error); 1347 bool CheckBoundReadFramebufferValid(const char* func_name, GLenum gl_error);
1350 // This is only used by DoBlitFramebufferCHROMIUM which operates read/draw 1348 // This is only used by DoBlitFramebufferCHROMIUM which operates read/draw
1351 // framebuffer at the same time. 1349 // framebuffer at the same time.
1352 bool CheckBoundFramebufferValid(const char* func_name); 1350 bool CheckBoundFramebufferValid(const char* func_name);
1353 1351
1354 // Checks if the current program exists and is valid. If not generates the 1352 // Checks if the current program exists and is valid. If not generates the
1355 // appropriate GL error. Returns true if the current program is in a usable 1353 // appropriate GL error. Returns true if the current program is in a usable
1356 // state. 1354 // state.
1357 bool CheckCurrentProgram(const char* function_name); 1355 bool CheckCurrentProgram(const char* function_name);
1358 1356
1359 // Checks if the current program exists and is valid and that location is not 1357 // Checks if the current program exists and is valid and that location is not
1360 // -1. If the current program is not valid generates the appropriate GL 1358 // -1. If the current program is not valid generates the appropriate GL
1361 // error. Returns true if the current program is in a usable state and 1359 // error. Returns true if the current program is in a usable state and
1362 // location is not -1. 1360 // location is not -1.
1363 bool CheckCurrentProgramForUniform(GLint location, const char* function_name); 1361 bool CheckCurrentProgramForUniform(GLint location, const char* function_name);
1364 1362
1365 // Checks if the current program samples a texture that is also the color 1363 // Checks if the current program samples a texture that is also the color
1366 // image of the current bound framebuffer, i.e., the source and destination 1364 // image of the current bound framebuffer, i.e., the source and destination
1367 // of the draw operation are the same. 1365 // of the draw operation are the same.
1368 bool CheckDrawingFeedbackLoops(); 1366 bool CheckDrawingFeedbackLoops();
1369 1367
1368 bool SupportsDrawBuffers() const;
1369
1370 // Checks if a draw buffer's format and its corresponding fragment shader
1371 // output's type are compatible, i.e., a signed integer typed variable is
1372 // incompatible with a float or unsigned integer buffer.
1373 // If incompaticle, generates an INVALID_OPERATION to avoid undefined buffer
1374 // contents and return false.
1375 // Otherwise, filter out the draw buffers that are not written to but are not
1376 // NONE through DrawBuffers, to be on the safe side. Return true.
1377 bool ValidateAndAdjustDrawBuffers(const char* function_name);
1378
1370 // Checks if |api_type| is valid for the given uniform 1379 // Checks if |api_type| is valid for the given uniform
1371 // If the api type is not valid generates the appropriate GL 1380 // If the api type is not valid generates the appropriate GL
1372 // error. Returns true if |api_type| is valid for the uniform 1381 // error. Returns true if |api_type| is valid for the uniform
1373 bool CheckUniformForApiType(const Program::UniformInfo* info, 1382 bool CheckUniformForApiType(const Program::UniformInfo* info,
1374 const char* function_name, 1383 const char* function_name,
1375 Program::UniformApiType api_type); 1384 Program::UniformApiType api_type);
1376 1385
1377 // Gets the type of a uniform for a location in the current program. Sets GL 1386 // Gets the type of a uniform for a location in the current program. Sets GL
1378 // errors if the current program is not valid. Returns true if the current 1387 // errors if the current program is not valid. Returns true if the current
1379 // program is valid and the location exists. Adjusts count so it 1388 // program is valid and the location exists. Adjusts count so it
(...skipping 2715 matching lines...) Expand 10 before | Expand all | Expand 10 after
4095 GL_DRAW_FRAMEBUFFER_EXT, 4104 GL_DRAW_FRAMEBUFFER_EXT,
4096 framebuffer_state_.bound_draw_framebuffer.get(), 4105 framebuffer_state_.bound_draw_framebuffer.get(),
4097 GetBackbufferServiceId()); 4106 GetBackbufferServiceId());
4098 } 4107 }
4099 OnFboChanged(); 4108 OnFboChanged();
4100 } 4109 }
4101 4110
4102 bool GLES2DecoderImpl::CheckFramebufferValid( 4111 bool GLES2DecoderImpl::CheckFramebufferValid(
4103 Framebuffer* framebuffer, 4112 Framebuffer* framebuffer,
4104 GLenum target, 4113 GLenum target,
4105 bool clear_uncleared_images,
4106 GLenum gl_error, 4114 GLenum gl_error,
4107 const char* func_name) { 4115 const char* func_name) {
4108 if (!framebuffer) { 4116 if (!framebuffer) {
4109 if (surfaceless_) 4117 if (surfaceless_)
4110 return false; 4118 return false;
4111 if (backbuffer_needs_clear_bits_ && clear_uncleared_images) { 4119 if (backbuffer_needs_clear_bits_) {
4112 glClearColor(0, 0, 0, BackBufferAlphaClearColor()); 4120 glClearColor(0, 0, 0, BackBufferAlphaClearColor());
4113 state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 4121 state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
4114 glClearStencil(0); 4122 glClearStencil(0);
4115 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask); 4123 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask);
4116 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask); 4124 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask);
4117 glClearDepth(1.0f); 4125 glClearDepth(1.0f);
4118 state_.SetDeviceDepthMask(GL_TRUE); 4126 state_.SetDeviceDepthMask(GL_TRUE);
4119 state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); 4127 state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false);
4120 bool reset_draw_buffer = false; 4128 bool reset_draw_buffer = false;
4121 if ((backbuffer_needs_clear_bits_ & GL_COLOR_BUFFER_BIT) != 0 && 4129 if ((backbuffer_needs_clear_bits_ & GL_COLOR_BUFFER_BIT) != 0 &&
(...skipping 25 matching lines...) Expand all
4147 if (framebuffer->GetStatus(texture_manager(), target) != 4155 if (framebuffer->GetStatus(texture_manager(), target) !=
4148 GL_FRAMEBUFFER_COMPLETE) { 4156 GL_FRAMEBUFFER_COMPLETE) {
4149 LOCAL_SET_GL_ERROR( 4157 LOCAL_SET_GL_ERROR(
4150 gl_error, func_name, "framebuffer incomplete (check)"); 4158 gl_error, func_name, "framebuffer incomplete (check)");
4151 return false; 4159 return false;
4152 } 4160 }
4153 framebuffer_manager()->MarkAsComplete(framebuffer); 4161 framebuffer_manager()->MarkAsComplete(framebuffer);
4154 } 4162 }
4155 4163
4156 // Are all the attachments cleared? 4164 // Are all the attachments cleared?
4157 if (clear_uncleared_images && 4165 if (renderbuffer_manager()->HaveUnclearedRenderbuffers() ||
4158 (renderbuffer_manager()->HaveUnclearedRenderbuffers() || 4166 texture_manager()->HaveUnclearedMips()) {
4159 texture_manager()->HaveUnclearedMips())) {
4160 if (!framebuffer->IsCleared()) { 4167 if (!framebuffer->IsCleared()) {
4161 ClearUnclearedAttachments(target, framebuffer); 4168 ClearUnclearedAttachments(target, framebuffer);
4162 } 4169 }
4163 } 4170 }
4164 return true; 4171 return true;
4165 } 4172 }
4166 4173
4167 bool GLES2DecoderImpl::CheckBoundDrawFramebufferValid( 4174 bool GLES2DecoderImpl::CheckBoundDrawFramebufferValid(const char* func_name) {
4168 bool clear_uncleared_images, const char* func_name) {
4169 GLenum target = features().chromium_framebuffer_multisample ? 4175 GLenum target = features().chromium_framebuffer_multisample ?
4170 GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER; 4176 GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER;
4171 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); 4177 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target);
4172 bool valid = CheckFramebufferValid( 4178 bool valid = CheckFramebufferValid(
4173 framebuffer, target, clear_uncleared_images, 4179 framebuffer, target, GL_INVALID_FRAMEBUFFER_OPERATION, func_name);
4174 GL_INVALID_FRAMEBUFFER_OPERATION, func_name);
4175 if (valid && !features().chromium_framebuffer_multisample) 4180 if (valid && !features().chromium_framebuffer_multisample)
4176 OnUseFramebuffer(); 4181 OnUseFramebuffer();
4177 if (valid && feature_info_->feature_flags().desktop_srgb_support) { 4182 if (valid && feature_info_->feature_flags().desktop_srgb_support) {
4178 // If framebuffer contains sRGB images, then enable FRAMEBUFFER_SRGB. 4183 // If framebuffer contains sRGB images, then enable FRAMEBUFFER_SRGB.
4179 // Otherwise, disable FRAMEBUFFER_SRGB. Assume default fbo does not have 4184 // Otherwise, disable FRAMEBUFFER_SRGB. Assume default fbo does not have
4180 // sRGB image. 4185 // sRGB image.
4181 // In theory, we can just leave FRAMEBUFFER_SRGB on. However, many drivers 4186 // In theory, we can just leave FRAMEBUFFER_SRGB on. However, many drivers
4182 // behave incorrectly when all images are linear encoding, they still apply 4187 // behave incorrectly when all images are linear encoding, they still apply
4183 // the sRGB conversion, but when at least one image is sRGB, then they 4188 // the sRGB conversion, but when at least one image is sRGB, then they
4184 // behave correctly. 4189 // behave correctly.
4185 bool enable_framebuffer_srgb = 4190 bool enable_framebuffer_srgb =
4186 framebuffer && framebuffer->HasSRGBAttachments(); 4191 framebuffer && framebuffer->HasSRGBAttachments();
4187 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); 4192 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb);
4188 } 4193 }
4189 return valid; 4194 return valid;
4190 } 4195 }
4191 4196
4192 bool GLES2DecoderImpl::CheckBoundReadFramebufferValid( 4197 bool GLES2DecoderImpl::CheckBoundReadFramebufferValid(
4193 const char* func_name, GLenum gl_error) { 4198 const char* func_name, GLenum gl_error) {
4194 GLenum target = features().chromium_framebuffer_multisample ? 4199 GLenum target = features().chromium_framebuffer_multisample ?
4195 GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER; 4200 GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER;
4196 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); 4201 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target);
4197 bool valid = CheckFramebufferValid( 4202 bool valid = CheckFramebufferValid(
4198 framebuffer, target, true, gl_error, func_name); 4203 framebuffer, target, gl_error, func_name);
4199 return valid; 4204 return valid;
4200 } 4205 }
4201 4206
4202 bool GLES2DecoderImpl::CheckBoundFramebufferValid(const char* func_name) { 4207 bool GLES2DecoderImpl::CheckBoundFramebufferValid(const char* func_name) {
4203 GLenum target = features().chromium_framebuffer_multisample ? 4208 GLenum target = features().chromium_framebuffer_multisample ?
4204 GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER; 4209 GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER;
4205 Framebuffer* draw_framebuffer = GetFramebufferInfoForTarget(target); 4210 Framebuffer* draw_framebuffer = GetFramebufferInfoForTarget(target);
4206 bool valid = CheckFramebufferValid( 4211 bool valid = CheckFramebufferValid(
4207 draw_framebuffer, target, true, 4212 draw_framebuffer, target, GL_INVALID_FRAMEBUFFER_OPERATION, func_name);
4208 GL_INVALID_FRAMEBUFFER_OPERATION, func_name);
4209 4213
4210 target = features().chromium_framebuffer_multisample ? 4214 target = features().chromium_framebuffer_multisample ?
4211 GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER; 4215 GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER;
4212 Framebuffer* read_framebuffer = GetFramebufferInfoForTarget(target); 4216 Framebuffer* read_framebuffer = GetFramebufferInfoForTarget(target);
4213 valid = valid && CheckFramebufferValid( 4217 valid = valid && CheckFramebufferValid(
4214 read_framebuffer, target, true, 4218 read_framebuffer, target, GL_INVALID_FRAMEBUFFER_OPERATION, func_name);
4215 GL_INVALID_FRAMEBUFFER_OPERATION, func_name);
4216 4219
4217 if (valid && feature_info_->feature_flags().desktop_srgb_support) { 4220 if (valid && feature_info_->feature_flags().desktop_srgb_support) {
4218 bool enable_framebuffer_srgb = 4221 bool enable_framebuffer_srgb =
4219 (draw_framebuffer && draw_framebuffer->HasSRGBAttachments()) || 4222 (draw_framebuffer && draw_framebuffer->HasSRGBAttachments()) ||
4220 (read_framebuffer && read_framebuffer->HasSRGBAttachments()); 4223 (read_framebuffer && read_framebuffer->HasSRGBAttachments());
4221 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); 4224 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb);
4222 } 4225 }
4223 4226
4224 return valid; 4227 return valid;
4225 } 4228 }
(...skipping 2582 matching lines...) Expand 10 before | Expand all | Expand 10 after
6808 } else { 6811 } else {
6809 LOCAL_SET_GL_ERROR( 6812 LOCAL_SET_GL_ERROR(
6810 GL_INVALID_VALUE, "glDeleteProgram", "unknown program"); 6813 GL_INVALID_VALUE, "glDeleteProgram", "unknown program");
6811 } 6814 }
6812 } 6815 }
6813 return error::kNoError; 6816 return error::kNoError;
6814 } 6817 }
6815 6818
6816 error::Error GLES2DecoderImpl::DoClear(GLbitfield mask) { 6819 error::Error GLES2DecoderImpl::DoClear(GLbitfield mask) {
6817 DCHECK(!ShouldDeferDraws()); 6820 DCHECK(!ShouldDeferDraws());
6818 if (CheckBoundDrawFramebufferValid(true, "glClear")) { 6821 if (CheckBoundDrawFramebufferValid("glClear")) {
6819 ApplyDirtyState(); 6822 ApplyDirtyState();
6820 // TODO(zmo): Filter out INTEGER/SIGNED INTEGER images to avoid
6821 // undefined results.
6822 if (workarounds().gl_clear_broken) { 6823 if (workarounds().gl_clear_broken) {
6823 ScopedGLErrorSuppressor suppressor("GLES2DecoderImpl::ClearWorkaround", 6824 ScopedGLErrorSuppressor suppressor("GLES2DecoderImpl::ClearWorkaround",
6824 GetErrorState()); 6825 GetErrorState());
6825 if (!BoundFramebufferHasDepthAttachment()) 6826 if (!BoundFramebufferHasDepthAttachment())
6826 mask &= ~GL_DEPTH_BUFFER_BIT; 6827 mask &= ~GL_DEPTH_BUFFER_BIT;
6827 if (!BoundFramebufferHasStencilAttachment()) 6828 if (!BoundFramebufferHasStencilAttachment())
6828 mask &= ~GL_STENCIL_BUFFER_BIT; 6829 mask &= ~GL_STENCIL_BUFFER_BIT;
6829 clear_framebuffer_blit_->ClearFramebuffer( 6830 clear_framebuffer_blit_->ClearFramebuffer(
6830 this, GetBoundReadFrameBufferSize(), mask, state_.color_clear_red, 6831 this, GetBoundReadFrameBufferSize(), mask, state_.color_clear_red,
6831 state_.color_clear_green, state_.color_clear_blue, 6832 state_.color_clear_green, state_.color_clear_blue,
6832 state_.color_clear_alpha, state_.depth_clear, state_.stencil_clear); 6833 state_.color_clear_alpha, state_.depth_clear, state_.stencil_clear);
6833 return error::kNoError; 6834 return error::kNoError;
6834 } 6835 }
6836 if (SupportsDrawBuffers()) {
6837 Framebuffer* framebuffer =
6838 framebuffer_state_.bound_draw_framebuffer.get();
6839 if (framebuffer && framebuffer->ContainsActiveIntegerAttachments()) {
6840 LOCAL_SET_GL_ERROR(
6841 GL_INVALID_VALUE, "glClear",
6842 "Clear can't be called on integer buffers");
6843 return error::kNoError;
6844 }
6845 }
Zhenyao Mo 2016/07/15 02:42:50 Have to take this out because it caused a lot of d
6835 glClear(mask); 6846 glClear(mask);
6836 } 6847 }
6837 return error::kNoError; 6848 return error::kNoError;
6838 } 6849 }
6839 6850
6840 void GLES2DecoderImpl::DoClearBufferiv( 6851 void GLES2DecoderImpl::DoClearBufferiv(
6841 GLenum buffer, GLint drawbuffer, const GLint* value) { 6852 GLenum buffer, GLint drawbuffer, const GLint* value) {
6842 // TODO(zmo): Set clear_uncleared_images=true once crbug.com/584059 is fixed. 6853 if (!CheckBoundDrawFramebufferValid("glClearBufferiv"))
6843 if (!CheckBoundDrawFramebufferValid(false, "glClearBufferiv"))
6844 return; 6854 return;
6845 ApplyDirtyState(); 6855 ApplyDirtyState();
6846 6856
6847 if (buffer == GL_COLOR) { 6857 if (buffer == GL_COLOR) {
6848 if (drawbuffer < 0 || 6858 if (drawbuffer < 0 ||
6849 drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) { 6859 drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) {
6850 LOCAL_SET_GL_ERROR( 6860 LOCAL_SET_GL_ERROR(
6851 GL_INVALID_VALUE, "glClearBufferiv", "invalid drawBuffer"); 6861 GL_INVALID_VALUE, "glClearBufferiv", "invalid drawBuffer");
6852 return; 6862 return;
6853 } 6863 }
(...skipping 13 matching lines...) Expand all
6867 if (!BoundFramebufferHasStencilAttachment()) { 6877 if (!BoundFramebufferHasStencilAttachment()) {
6868 return; 6878 return;
6869 } 6879 }
6870 } 6880 }
6871 MarkDrawBufferAsCleared(buffer, drawbuffer); 6881 MarkDrawBufferAsCleared(buffer, drawbuffer);
6872 glClearBufferiv(buffer, drawbuffer, value); 6882 glClearBufferiv(buffer, drawbuffer, value);
6873 } 6883 }
6874 6884
6875 void GLES2DecoderImpl::DoClearBufferuiv( 6885 void GLES2DecoderImpl::DoClearBufferuiv(
6876 GLenum buffer, GLint drawbuffer, const GLuint* value) { 6886 GLenum buffer, GLint drawbuffer, const GLuint* value) {
6877 // TODO(zmo): Set clear_uncleared_images=true once crbug.com/584059 is fixed. 6887 if (!CheckBoundDrawFramebufferValid("glClearBufferuiv"))
6878 if (!CheckBoundDrawFramebufferValid(false, "glClearBufferuiv"))
6879 return; 6888 return;
6880 ApplyDirtyState(); 6889 ApplyDirtyState();
6881 6890
6882 if (drawbuffer < 0 || 6891 if (drawbuffer < 0 ||
6883 drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) { 6892 drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) {
6884 LOCAL_SET_GL_ERROR( 6893 LOCAL_SET_GL_ERROR(
6885 GL_INVALID_VALUE, "glClearBufferuiv", "invalid drawBuffer"); 6894 GL_INVALID_VALUE, "glClearBufferuiv", "invalid drawBuffer");
6886 return; 6895 return;
6887 } 6896 }
6888 GLenum internal_format = 6897 GLenum internal_format =
6889 GetBoundColorDrawBufferInternalFormat(drawbuffer); 6898 GetBoundColorDrawBufferInternalFormat(drawbuffer);
6890 if (!GLES2Util::IsUnsignedIntegerFormat(internal_format)) { 6899 if (!GLES2Util::IsUnsignedIntegerFormat(internal_format)) {
6891 // To avoid undefined results, return without calling the gl function. 6900 // To avoid undefined results, return without calling the gl function.
6892 return; 6901 return;
6893 } 6902 }
6894 MarkDrawBufferAsCleared(buffer, drawbuffer); 6903 MarkDrawBufferAsCleared(buffer, drawbuffer);
6895 glClearBufferuiv(buffer, drawbuffer, value); 6904 glClearBufferuiv(buffer, drawbuffer, value);
6896 } 6905 }
6897 6906
6898 void GLES2DecoderImpl::DoClearBufferfv( 6907 void GLES2DecoderImpl::DoClearBufferfv(
6899 GLenum buffer, GLint drawbuffer, const GLfloat* value) { 6908 GLenum buffer, GLint drawbuffer, const GLfloat* value) {
6900 // TODO(zmo): Set clear_uncleared_images=true once crbug.com/584059 is fixed. 6909 if (!CheckBoundDrawFramebufferValid("glClearBufferfv"))
6901 if (!CheckBoundDrawFramebufferValid(false, "glClearBufferfv"))
6902 return; 6910 return;
6903 ApplyDirtyState(); 6911 ApplyDirtyState();
6904 6912
6905 if (buffer == GL_COLOR) { 6913 if (buffer == GL_COLOR) {
6906 if (drawbuffer < 0 || 6914 if (drawbuffer < 0 ||
6907 drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) { 6915 drawbuffer >= static_cast<GLint>(group_->max_draw_buffers())) {
6908 LOCAL_SET_GL_ERROR( 6916 LOCAL_SET_GL_ERROR(
6909 GL_INVALID_VALUE, "glClearBufferfv", "invalid drawBuffer"); 6917 GL_INVALID_VALUE, "glClearBufferfv", "invalid drawBuffer");
6910 return; 6918 return;
6911 } 6919 }
(...skipping 13 matching lines...) Expand all
6925 if (!BoundFramebufferHasDepthAttachment()) { 6933 if (!BoundFramebufferHasDepthAttachment()) {
6926 return; 6934 return;
6927 } 6935 }
6928 } 6936 }
6929 MarkDrawBufferAsCleared(buffer, drawbuffer); 6937 MarkDrawBufferAsCleared(buffer, drawbuffer);
6930 glClearBufferfv(buffer, drawbuffer, value); 6938 glClearBufferfv(buffer, drawbuffer, value);
6931 } 6939 }
6932 6940
6933 void GLES2DecoderImpl::DoClearBufferfi( 6941 void GLES2DecoderImpl::DoClearBufferfi(
6934 GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) { 6942 GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) {
6935 // TODO(zmo): Set clear_uncleared_images=true once crbug.com/584059 is fixed. 6943 if (!CheckBoundDrawFramebufferValid("glClearBufferfi"))
6936 if (!CheckBoundDrawFramebufferValid(false, "glClearBufferfi"))
6937 return; 6944 return;
6938 ApplyDirtyState(); 6945 ApplyDirtyState();
6939 6946
6940 if (drawbuffer != 0) { 6947 if (drawbuffer != 0) {
6941 LOCAL_SET_GL_ERROR( 6948 LOCAL_SET_GL_ERROR(
6942 GL_INVALID_VALUE, "glClearBufferfi", "invalid drawBuffer"); 6949 GL_INVALID_VALUE, "glClearBufferfi", "invalid drawBuffer");
6943 return; 6950 return;
6944 } 6951 }
6945 if (!BoundFramebufferHasDepthAttachment() && 6952 if (!BoundFramebufferHasDepthAttachment() &&
6946 !BoundFramebufferHasStencilAttachment()) { 6953 !BoundFramebufferHasStencilAttachment()) {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
7059 7066
7060 GLbitfield clear_bits = 0; 7067 GLbitfield clear_bits = 0;
7061 bool reset_draw_buffers = false; 7068 bool reset_draw_buffers = false;
7062 if (framebuffer->HasUnclearedColorAttachments()) { 7069 if (framebuffer->HasUnclearedColorAttachments()) {
7063 // We should always use alpha == 0 here, because 1) some draw buffers may 7070 // We should always use alpha == 0 here, because 1) some draw buffers may
7064 // have alpha and some may not; 2) we won't have the same situation as the 7071 // have alpha and some may not; 2) we won't have the same situation as the
7065 // back buffer where alpha channel exists but is not requested. 7072 // back buffer where alpha channel exists but is not requested.
7066 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 7073 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
7067 state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 7074 state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
7068 clear_bits |= GL_COLOR_BUFFER_BIT; 7075 clear_bits |= GL_COLOR_BUFFER_BIT;
7069 if (feature_info_->feature_flags().ext_draw_buffers || 7076
7070 feature_info_->IsES3Enabled()) { 7077 if (SupportsDrawBuffers()) {
7071 reset_draw_buffers = framebuffer->PrepareDrawBuffersForClear(); 7078 reset_draw_buffers =
7079 framebuffer->PrepareDrawBuffersForClearingUninitializedAttachments();
7072 } 7080 }
7073 } 7081 }
7074 7082
7075 if (framebuffer->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT) || 7083 if (framebuffer->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT) ||
7076 framebuffer->HasUnclearedAttachment(GL_DEPTH_STENCIL_ATTACHMENT)) { 7084 framebuffer->HasUnclearedAttachment(GL_DEPTH_STENCIL_ATTACHMENT)) {
7077 glClearStencil(0); 7085 glClearStencil(0);
7078 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask); 7086 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask);
7079 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask); 7087 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask);
7080 clear_bits |= GL_STENCIL_BUFFER_BIT; 7088 clear_bits |= GL_STENCIL_BUFFER_BIT;
7081 } 7089 }
(...skipping 11 matching lines...) Expand all
7093 // TODO(zmo): There is no guarantee that an FBO that is complete on the 7101 // TODO(zmo): There is no guarantee that an FBO that is complete on the
7094 // READ attachment will be complete as a DRAW attachment. 7102 // READ attachment will be complete as a DRAW attachment.
7095 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, framebuffer->service_id()); 7103 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, framebuffer->service_id());
7096 } 7104 }
7097 state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); 7105 state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false);
7098 glClear(clear_bits); 7106 glClear(clear_bits);
7099 } 7107 }
7100 7108
7101 if (cleared_int_renderbuffers || clear_bits) { 7109 if (cleared_int_renderbuffers || clear_bits) {
7102 if (reset_draw_buffers) 7110 if (reset_draw_buffers)
7103 framebuffer->RestoreDrawBuffersAfterClear(); 7111 framebuffer->RestoreDrawBuffers();
7104 RestoreClearState(); 7112 RestoreClearState();
7105 if (target == GL_READ_FRAMEBUFFER && draw_framebuffer != framebuffer) { 7113 if (target == GL_READ_FRAMEBUFFER && draw_framebuffer != framebuffer) {
7106 GLuint service_id = draw_framebuffer ? draw_framebuffer->service_id() : 7114 GLuint service_id = draw_framebuffer ? draw_framebuffer->service_id() :
7107 GetBackbufferServiceId(); 7115 GetBackbufferServiceId();
7108 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, service_id); 7116 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, service_id);
7109 } 7117 }
7110 } 7118 }
7111 7119
7112 framebuffer_manager()->MarkAttachmentsAsCleared( 7120 framebuffer_manager()->MarkAttachmentsAsCleared(
7113 framebuffer, renderbuffer_manager(), texture_manager()); 7121 framebuffer, renderbuffer_manager(), texture_manager());
(...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after
8023 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; 8031 TextureUnit& texture_unit = state_.texture_units[texture_unit_index];
8024 TextureRef* texture_ref = 8032 TextureRef* texture_ref =
8025 texture_unit.GetInfoForSamplerType(uniform_info->type).get(); 8033 texture_unit.GetInfoForSamplerType(uniform_info->type).get();
8026 if (attachment->IsTexture(texture_ref)) 8034 if (attachment->IsTexture(texture_ref))
8027 return true; 8035 return true;
8028 } 8036 }
8029 } 8037 }
8030 return false; 8038 return false;
8031 } 8039 }
8032 8040
8041 bool GLES2DecoderImpl::SupportsDrawBuffers() const {
8042 switch (feature_info_->context_type()) {
8043 case CONTEXT_TYPE_OPENGLES2:
8044 case CONTEXT_TYPE_WEBGL1:
8045 return feature_info_->feature_flags().ext_draw_buffers;
8046 default:
8047 return true;
8048 }
8049 }
8050
8051 bool GLES2DecoderImpl::ValidateAndAdjustDrawBuffers(const char* func_name) {
8052 if (!SupportsDrawBuffers()) {
8053 return true;
8054 }
8055 Framebuffer* framebuffer = framebuffer_state_.bound_draw_framebuffer.get();
8056 if (!state_.current_program.get() || !framebuffer) {
8057 return true;
8058 }
8059 uint32_t fragment_output_type_mask =
8060 state_.current_program->fragment_output_type_mask();
8061 uint32_t fragment_output_written_mask =
8062 state_.current_program->fragment_output_written_mask();
8063 if (!framebuffer->ValidateAndAdjustDrawBuffers(
8064 fragment_output_type_mask, fragment_output_written_mask)) {
8065 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name,
8066 "buffer format and fragment output variable type incompatible");
8067 return false;
8068 }
8069 return true;
8070 }
8071
8033 bool GLES2DecoderImpl::CheckUniformForApiType( 8072 bool GLES2DecoderImpl::CheckUniformForApiType(
8034 const Program::UniformInfo* info, 8073 const Program::UniformInfo* info,
8035 const char* function_name, 8074 const char* function_name,
8036 Program::UniformApiType api_type) { 8075 Program::UniformApiType api_type) {
8037 DCHECK(info); 8076 DCHECK(info);
8038 if ((api_type & info->accepts_api_type) == 0) { 8077 if ((api_type & info->accepts_api_type) == 0) {
8039 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, 8078 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
8040 "wrong uniform function for type"); 8079 "wrong uniform function for type");
8041 return false; 8080 return false;
8042 } 8081 }
(...skipping 966 matching lines...) Expand 10 before | Expand all | Expand 10 after
9009 return error::kNoError; 9048 return error::kNoError;
9010 } 9049 }
9011 if (count < 0) { 9050 if (count < 0) {
9012 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "count < 0"); 9051 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "count < 0");
9013 return error::kNoError; 9052 return error::kNoError;
9014 } 9053 }
9015 if (primcount < 0) { 9054 if (primcount < 0) {
9016 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "primcount < 0"); 9055 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "primcount < 0");
9017 return error::kNoError; 9056 return error::kNoError;
9018 } 9057 }
9019 if (!CheckBoundDrawFramebufferValid(true, function_name)) { 9058 if (!CheckBoundDrawFramebufferValid(function_name)) {
9020 return error::kNoError; 9059 return error::kNoError;
9021 } 9060 }
9022 // We have to check this here because the prototype for glDrawArrays 9061 // We have to check this here because the prototype for glDrawArrays
9023 // is GLint not GLsizei. 9062 // is GLint not GLsizei.
9024 if (first < 0) { 9063 if (first < 0) {
9025 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "first < 0"); 9064 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "first < 0");
9026 return error::kNoError; 9065 return error::kNoError;
9027 } 9066 }
9028 9067
9029 if (state_.bound_transform_feedback.get() && 9068 if (state_.bound_transform_feedback.get() &&
(...skipping 20 matching lines...) Expand all
9050 if (!SimulateAttrib0( 9089 if (!SimulateAttrib0(
9051 function_name, max_vertex_accessed, &simulated_attrib_0)) { 9090 function_name, max_vertex_accessed, &simulated_attrib_0)) {
9052 return error::kNoError; 9091 return error::kNoError;
9053 } 9092 }
9054 bool simulated_fixed_attribs = false; 9093 bool simulated_fixed_attribs = false;
9055 if (SimulateFixedAttribs( 9094 if (SimulateFixedAttribs(
9056 function_name, max_vertex_accessed, &simulated_fixed_attribs, 9095 function_name, max_vertex_accessed, &simulated_fixed_attribs,
9057 primcount)) { 9096 primcount)) {
9058 bool textures_set = !PrepareTexturesForRender(); 9097 bool textures_set = !PrepareTexturesForRender();
9059 ApplyDirtyState(); 9098 ApplyDirtyState();
9099 if (!ValidateAndAdjustDrawBuffers(function_name)) {
9100 return error::kNoError;
9101 }
9060 if (!instanced) { 9102 if (!instanced) {
9061 glDrawArrays(mode, first, count); 9103 glDrawArrays(mode, first, count);
9062 } else { 9104 } else {
9063 glDrawArraysInstancedANGLE(mode, first, count, primcount); 9105 glDrawArraysInstancedANGLE(mode, first, count, primcount);
9064 } 9106 }
9065 if (textures_set) { 9107 if (textures_set) {
9066 RestoreStateForTextures(); 9108 RestoreStateForTextures();
9067 } 9109 }
9068 if (simulated_fixed_attribs) { 9110 if (simulated_fixed_attribs) {
9069 RestoreStateForSimulatedFixedAttribs(); 9111 RestoreStateForSimulatedFixedAttribs();
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
9137 } 9179 }
9138 if (!validators_->index_type.IsValid(type)) { 9180 if (!validators_->index_type.IsValid(type)) {
9139 LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, type, "type"); 9181 LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, type, "type");
9140 return error::kNoError; 9182 return error::kNoError;
9141 } 9183 }
9142 if (primcount < 0) { 9184 if (primcount < 0) {
9143 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "primcount < 0"); 9185 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "primcount < 0");
9144 return error::kNoError; 9186 return error::kNoError;
9145 } 9187 }
9146 9188
9147 if (!CheckBoundDrawFramebufferValid(true, function_name)) { 9189 if (!CheckBoundDrawFramebufferValid(function_name)) {
9148 return error::kNoError; 9190 return error::kNoError;
9149 } 9191 }
9150 9192
9151 if (state_.bound_transform_feedback.get() && 9193 if (state_.bound_transform_feedback.get() &&
9152 state_.bound_transform_feedback->active() && 9194 state_.bound_transform_feedback->active() &&
9153 !state_.bound_transform_feedback->paused()) { 9195 !state_.bound_transform_feedback->paused()) {
9154 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, 9196 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
9155 "transformfeedback is active and not paused"); 9197 "transformfeedback is active and not paused");
9156 return error::kNoError; 9198 return error::kNoError;
9157 } 9199 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
9191 ApplyDirtyState(); 9233 ApplyDirtyState();
9192 // TODO(gman): Refactor to hide these details in BufferManager or 9234 // TODO(gman): Refactor to hide these details in BufferManager or
9193 // VertexAttribManager. 9235 // VertexAttribManager.
9194 const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset); 9236 const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset);
9195 bool used_client_side_array = false; 9237 bool used_client_side_array = false;
9196 if (element_array_buffer->IsClientSideArray()) { 9238 if (element_array_buffer->IsClientSideArray()) {
9197 used_client_side_array = true; 9239 used_client_side_array = true;
9198 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 9240 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
9199 indices = element_array_buffer->GetRange(offset, 0); 9241 indices = element_array_buffer->GetRange(offset, 0);
9200 } 9242 }
9201 9243 if (!ValidateAndAdjustDrawBuffers(function_name)) {
9244 return error::kNoError;
9245 }
9202 if (state_.enable_flags.primitive_restart_fixed_index && 9246 if (state_.enable_flags.primitive_restart_fixed_index &&
9203 feature_info_->feature_flags(). 9247 feature_info_->feature_flags().
9204 emulate_primitive_restart_fixed_index) { 9248 emulate_primitive_restart_fixed_index) {
9205 glEnable(GL_PRIMITIVE_RESTART); 9249 glEnable(GL_PRIMITIVE_RESTART);
9206 buffer_manager()->SetPrimitiveRestartFixedIndexIfNecessary(type); 9250 buffer_manager()->SetPrimitiveRestartFixedIndexIfNecessary(type);
9207 } 9251 }
9208
9209 if (!instanced) { 9252 if (!instanced) {
9210 glDrawElements(mode, count, type, indices); 9253 glDrawElements(mode, count, type, indices);
9211 } else { 9254 } else {
9212 glDrawElementsInstancedANGLE(mode, count, type, indices, primcount); 9255 glDrawElementsInstancedANGLE(mode, count, type, indices, primcount);
9213 } 9256 }
9214 if (state_.enable_flags.primitive_restart_fixed_index && 9257 if (state_.enable_flags.primitive_restart_fixed_index &&
9215 feature_info_->feature_flags(). 9258 feature_info_->feature_flags().
9216 emulate_primitive_restart_fixed_index) { 9259 emulate_primitive_restart_fixed_index) {
9217 glDisable(GL_PRIMITIVE_RESTART); 9260 glDisable(GL_PRIMITIVE_RESTART);
9218 } 9261 }
9219
9220 if (used_client_side_array) { 9262 if (used_client_side_array) {
9221 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 9263 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
9222 element_array_buffer->service_id()); 9264 element_array_buffer->service_id());
9223 } 9265 }
9224
9225 if (textures_set) { 9266 if (textures_set) {
9226 RestoreStateForTextures(); 9267 RestoreStateForTextures();
9227 } 9268 }
9228 if (simulated_fixed_attribs) { 9269 if (simulated_fixed_attribs) {
9229 RestoreStateForSimulatedFixedAttribs(); 9270 RestoreStateForSimulatedFixedAttribs();
9230 } 9271 }
9231 } 9272 }
9232 if (simulated_attrib_0) { 9273 if (simulated_attrib_0) {
9233 // 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
9234 // 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 7472 matching lines...) Expand 10 before | Expand all | Expand 10 after
16707 GLuint mask = 0; 16748 GLuint mask = 0;
16708 if (!v.GetFillModeAndMask(c, &fill_mode, &mask)) 16749 if (!v.GetFillModeAndMask(c, &fill_mode, &mask))
16709 return v.error(); 16750 return v.error();
16710 GLuint service_id = 0; 16751 GLuint service_id = 0;
16711 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) { 16752 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) {
16712 // "If /path/ does not name an existing path object, the command does 16753 // "If /path/ does not name an existing path object, the command does
16713 // nothing (and no error is generated)." 16754 // nothing (and no error is generated)."
16714 // This holds for other rendering functions, too. 16755 // This holds for other rendering functions, too.
16715 return error::kNoError; 16756 return error::kNoError;
16716 } 16757 }
16717 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16758 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16718 return error::kNoError; 16759 return error::kNoError;
16719 ApplyDirtyState(); 16760 ApplyDirtyState();
16720 glStencilFillPathNV(service_id, fill_mode, mask); 16761 glStencilFillPathNV(service_id, fill_mode, mask);
16721 return error::kNoError; 16762 return error::kNoError;
16722 } 16763 }
16723 16764
16724 error::Error GLES2DecoderImpl::HandleStencilStrokePathCHROMIUM( 16765 error::Error GLES2DecoderImpl::HandleStencilStrokePathCHROMIUM(
16725 uint32_t immediate_data_size, 16766 uint32_t immediate_data_size,
16726 const void* cmd_data) { 16767 const void* cmd_data) {
16727 static const char kFunctionName[] = "glStencilStrokePathCHROMIUM"; 16768 static const char kFunctionName[] = "glStencilStrokePathCHROMIUM";
16728 const gles2::cmds::StencilStrokePathCHROMIUM& c = 16769 const gles2::cmds::StencilStrokePathCHROMIUM& c =
16729 *static_cast<const gles2::cmds::StencilStrokePathCHROMIUM*>(cmd_data); 16770 *static_cast<const gles2::cmds::StencilStrokePathCHROMIUM*>(cmd_data);
16730 if (!features().chromium_path_rendering) 16771 if (!features().chromium_path_rendering)
16731 return error::kUnknownCommand; 16772 return error::kUnknownCommand;
16732 16773
16733 GLuint service_id = 0; 16774 GLuint service_id = 0;
16734 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) { 16775 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) {
16735 return error::kNoError; 16776 return error::kNoError;
16736 } 16777 }
16737 GLint reference = static_cast<GLint>(c.reference); 16778 GLint reference = static_cast<GLint>(c.reference);
16738 GLuint mask = static_cast<GLuint>(c.mask); 16779 GLuint mask = static_cast<GLuint>(c.mask);
16739 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16780 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16740 return error::kNoError; 16781 return error::kNoError;
16741 ApplyDirtyState(); 16782 ApplyDirtyState();
16742 glStencilStrokePathNV(service_id, reference, mask); 16783 glStencilStrokePathNV(service_id, reference, mask);
16743 return error::kNoError; 16784 return error::kNoError;
16744 } 16785 }
16745 16786
16746 error::Error GLES2DecoderImpl::HandleCoverFillPathCHROMIUM( 16787 error::Error GLES2DecoderImpl::HandleCoverFillPathCHROMIUM(
16747 uint32_t immediate_data_size, 16788 uint32_t immediate_data_size,
16748 const void* cmd_data) { 16789 const void* cmd_data) {
16749 static const char kFunctionName[] = "glCoverFillPathCHROMIUM"; 16790 static const char kFunctionName[] = "glCoverFillPathCHROMIUM";
16750 const gles2::cmds::CoverFillPathCHROMIUM& c = 16791 const gles2::cmds::CoverFillPathCHROMIUM& c =
16751 *static_cast<const gles2::cmds::CoverFillPathCHROMIUM*>(cmd_data); 16792 *static_cast<const gles2::cmds::CoverFillPathCHROMIUM*>(cmd_data);
16752 if (!features().chromium_path_rendering) 16793 if (!features().chromium_path_rendering)
16753 return error::kUnknownCommand; 16794 return error::kUnknownCommand;
16754 16795
16755 PathCommandValidatorContext v(this, kFunctionName); 16796 PathCommandValidatorContext v(this, kFunctionName);
16756 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; 16797 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM;
16757 if (!v.GetCoverMode(c, &cover_mode)) 16798 if (!v.GetCoverMode(c, &cover_mode))
16758 return v.error(); 16799 return v.error();
16759 16800
16760 GLuint service_id = 0; 16801 GLuint service_id = 0;
16761 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) 16802 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id))
16762 return error::kNoError; 16803 return error::kNoError;
16763 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16804 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16764 return error::kNoError; 16805 return error::kNoError;
16765 ApplyDirtyState(); 16806 ApplyDirtyState();
16766 glCoverFillPathNV(service_id, cover_mode); 16807 glCoverFillPathNV(service_id, cover_mode);
16767 return error::kNoError; 16808 return error::kNoError;
16768 } 16809 }
16769 16810
16770 error::Error GLES2DecoderImpl::HandleCoverStrokePathCHROMIUM( 16811 error::Error GLES2DecoderImpl::HandleCoverStrokePathCHROMIUM(
16771 uint32_t immediate_data_size, 16812 uint32_t immediate_data_size,
16772 const void* cmd_data) { 16813 const void* cmd_data) {
16773 static const char kFunctionName[] = "glCoverStrokePathCHROMIUM"; 16814 static const char kFunctionName[] = "glCoverStrokePathCHROMIUM";
16774 const gles2::cmds::CoverStrokePathCHROMIUM& c = 16815 const gles2::cmds::CoverStrokePathCHROMIUM& c =
16775 *static_cast<const gles2::cmds::CoverStrokePathCHROMIUM*>(cmd_data); 16816 *static_cast<const gles2::cmds::CoverStrokePathCHROMIUM*>(cmd_data);
16776 if (!features().chromium_path_rendering) 16817 if (!features().chromium_path_rendering)
16777 return error::kUnknownCommand; 16818 return error::kUnknownCommand;
16778 16819
16779 PathCommandValidatorContext v(this, kFunctionName); 16820 PathCommandValidatorContext v(this, kFunctionName);
16780 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; 16821 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM;
16781 if (!v.GetCoverMode(c, &cover_mode)) 16822 if (!v.GetCoverMode(c, &cover_mode))
16782 return v.error(); 16823 return v.error();
16783 16824
16784 GLuint service_id = 0; 16825 GLuint service_id = 0;
16785 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) 16826 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id))
16786 return error::kNoError; 16827 return error::kNoError;
16787 16828
16788 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16829 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16789 return error::kNoError; 16830 return error::kNoError;
16790 ApplyDirtyState(); 16831 ApplyDirtyState();
16791 glCoverStrokePathNV(service_id, cover_mode); 16832 glCoverStrokePathNV(service_id, cover_mode);
16792 return error::kNoError; 16833 return error::kNoError;
16793 } 16834 }
16794 16835
16795 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathCHROMIUM( 16836 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathCHROMIUM(
16796 uint32_t immediate_data_size, 16837 uint32_t immediate_data_size,
16797 const void* cmd_data) { 16838 const void* cmd_data) {
16798 static const char kFunctionName[] = "glStencilThenCoverFillPathCHROMIUM"; 16839 static const char kFunctionName[] = "glStencilThenCoverFillPathCHROMIUM";
16799 const gles2::cmds::StencilThenCoverFillPathCHROMIUM& c = 16840 const gles2::cmds::StencilThenCoverFillPathCHROMIUM& c =
16800 *static_cast<const gles2::cmds::StencilThenCoverFillPathCHROMIUM*>( 16841 *static_cast<const gles2::cmds::StencilThenCoverFillPathCHROMIUM*>(
16801 cmd_data); 16842 cmd_data);
16802 if (!features().chromium_path_rendering) 16843 if (!features().chromium_path_rendering)
16803 return error::kUnknownCommand; 16844 return error::kUnknownCommand;
16804 16845
16805 PathCommandValidatorContext v(this, kFunctionName); 16846 PathCommandValidatorContext v(this, kFunctionName);
16806 GLenum fill_mode = GL_COUNT_UP_CHROMIUM; 16847 GLenum fill_mode = GL_COUNT_UP_CHROMIUM;
16807 GLuint mask = 0; 16848 GLuint mask = 0;
16808 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; 16849 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM;
16809 if (!v.GetFillModeAndMask(c, &fill_mode, &mask) || 16850 if (!v.GetFillModeAndMask(c, &fill_mode, &mask) ||
16810 !v.GetCoverMode(c, &cover_mode)) 16851 !v.GetCoverMode(c, &cover_mode))
16811 return v.error(); 16852 return v.error();
16812 16853
16813 GLuint service_id = 0; 16854 GLuint service_id = 0;
16814 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) 16855 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id))
16815 return error::kNoError; 16856 return error::kNoError;
16816 16857
16817 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16858 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16818 return error::kNoError; 16859 return error::kNoError;
16819 ApplyDirtyState(); 16860 ApplyDirtyState();
16820 glStencilThenCoverFillPathNV(service_id, fill_mode, mask, cover_mode); 16861 glStencilThenCoverFillPathNV(service_id, fill_mode, mask, cover_mode);
16821 return error::kNoError; 16862 return error::kNoError;
16822 } 16863 }
16823 16864
16824 error::Error GLES2DecoderImpl::HandleStencilThenCoverStrokePathCHROMIUM( 16865 error::Error GLES2DecoderImpl::HandleStencilThenCoverStrokePathCHROMIUM(
16825 uint32_t immediate_data_size, 16866 uint32_t immediate_data_size,
16826 const void* cmd_data) { 16867 const void* cmd_data) {
16827 static const char kFunctionName[] = "glStencilThenCoverStrokePathCHROMIUM"; 16868 static const char kFunctionName[] = "glStencilThenCoverStrokePathCHROMIUM";
16828 const gles2::cmds::StencilThenCoverStrokePathCHROMIUM& c = 16869 const gles2::cmds::StencilThenCoverStrokePathCHROMIUM& c =
16829 *static_cast<const gles2::cmds::StencilThenCoverStrokePathCHROMIUM*>( 16870 *static_cast<const gles2::cmds::StencilThenCoverStrokePathCHROMIUM*>(
16830 cmd_data); 16871 cmd_data);
16831 if (!features().chromium_path_rendering) 16872 if (!features().chromium_path_rendering)
16832 return error::kUnknownCommand; 16873 return error::kUnknownCommand;
16833 16874
16834 PathCommandValidatorContext v(this, kFunctionName); 16875 PathCommandValidatorContext v(this, kFunctionName);
16835 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM; 16876 GLenum cover_mode = GL_BOUNDING_BOX_CHROMIUM;
16836 if (!v.GetCoverMode(c, &cover_mode)) 16877 if (!v.GetCoverMode(c, &cover_mode))
16837 return v.error(); 16878 return v.error();
16838 16879
16839 GLuint service_id = 0; 16880 GLuint service_id = 0;
16840 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id)) 16881 if (!path_manager()->GetPath(static_cast<GLuint>(c.path), &service_id))
16841 return error::kNoError; 16882 return error::kNoError;
16842 16883
16843 GLint reference = static_cast<GLint>(c.reference); 16884 GLint reference = static_cast<GLint>(c.reference);
16844 GLuint mask = static_cast<GLuint>(c.mask); 16885 GLuint mask = static_cast<GLuint>(c.mask);
16845 16886
16846 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16887 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16847 return error::kNoError; 16888 return error::kNoError;
16848 ApplyDirtyState(); 16889 ApplyDirtyState();
16849 glStencilThenCoverStrokePathNV(service_id, reference, mask, cover_mode); 16890 glStencilThenCoverStrokePathNV(service_id, reference, mask, cover_mode);
16850 return error::kNoError; 16891 return error::kNoError;
16851 } 16892 }
16852 16893
16853 error::Error GLES2DecoderImpl::HandleStencilFillPathInstancedCHROMIUM( 16894 error::Error GLES2DecoderImpl::HandleStencilFillPathInstancedCHROMIUM(
16854 uint32_t immediate_data_size, 16895 uint32_t immediate_data_size,
16855 const void* cmd_data) { 16896 const void* cmd_data) {
16856 static const char kFunctionName[] = "glStencilFillPathInstancedCHROMIUM"; 16897 static const char kFunctionName[] = "glStencilFillPathInstancedCHROMIUM";
(...skipping 18 matching lines...) Expand all
16875 return error::kNoError; 16916 return error::kNoError;
16876 16917
16877 std::unique_ptr<GLuint[]> paths; 16918 std::unique_ptr<GLuint[]> paths;
16878 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) 16919 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths))
16879 return v.error(); 16920 return v.error();
16880 16921
16881 const GLfloat* transforms = nullptr; 16922 const GLfloat* transforms = nullptr;
16882 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) 16923 if (!v.GetTransforms(c, num_paths, transform_type, &transforms))
16883 return v.error(); 16924 return v.error();
16884 16925
16885 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16926 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16886 return error::kNoError; 16927 return error::kNoError;
16887 ApplyDirtyState(); 16928 ApplyDirtyState();
16888 glStencilFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0, 16929 glStencilFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0,
16889 fill_mode, mask, transform_type, transforms); 16930 fill_mode, mask, transform_type, transforms);
16890 return error::kNoError; 16931 return error::kNoError;
16891 } 16932 }
16892 16933
16893 error::Error GLES2DecoderImpl::HandleStencilStrokePathInstancedCHROMIUM( 16934 error::Error GLES2DecoderImpl::HandleStencilStrokePathInstancedCHROMIUM(
16894 uint32_t immediate_data_size, 16935 uint32_t immediate_data_size,
16895 const void* cmd_data) { 16936 const void* cmd_data) {
(...skipping 18 matching lines...) Expand all
16914 std::unique_ptr<GLuint[]> paths; 16955 std::unique_ptr<GLuint[]> paths;
16915 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) 16956 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths))
16916 return v.error(); 16957 return v.error();
16917 16958
16918 const GLfloat* transforms = nullptr; 16959 const GLfloat* transforms = nullptr;
16919 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) 16960 if (!v.GetTransforms(c, num_paths, transform_type, &transforms))
16920 return v.error(); 16961 return v.error();
16921 16962
16922 GLint reference = static_cast<GLint>(c.reference); 16963 GLint reference = static_cast<GLint>(c.reference);
16923 GLuint mask = static_cast<GLuint>(c.mask); 16964 GLuint mask = static_cast<GLuint>(c.mask);
16924 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 16965 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16925 return error::kNoError; 16966 return error::kNoError;
16926 ApplyDirtyState(); 16967 ApplyDirtyState();
16927 glStencilStrokePathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0, 16968 glStencilStrokePathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0,
16928 reference, mask, transform_type, transforms); 16969 reference, mask, transform_type, transforms);
16929 return error::kNoError; 16970 return error::kNoError;
16930 } 16971 }
16931 16972
16932 error::Error GLES2DecoderImpl::HandleCoverFillPathInstancedCHROMIUM( 16973 error::Error GLES2DecoderImpl::HandleCoverFillPathInstancedCHROMIUM(
16933 uint32_t immediate_data_size, 16974 uint32_t immediate_data_size,
16934 const void* cmd_data) { 16975 const void* cmd_data) {
(...skipping 18 matching lines...) Expand all
16953 return error::kNoError; 16994 return error::kNoError;
16954 16995
16955 std::unique_ptr<GLuint[]> paths; 16996 std::unique_ptr<GLuint[]> paths;
16956 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) 16997 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths))
16957 return v.error(); 16998 return v.error();
16958 16999
16959 const GLfloat* transforms = nullptr; 17000 const GLfloat* transforms = nullptr;
16960 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) 17001 if (!v.GetTransforms(c, num_paths, transform_type, &transforms))
16961 return v.error(); 17002 return v.error();
16962 17003
16963 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 17004 if (!CheckBoundDrawFramebufferValid(kFunctionName))
16964 return error::kNoError; 17005 return error::kNoError;
16965 ApplyDirtyState(); 17006 ApplyDirtyState();
16966 glCoverFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0, 17007 glCoverFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0,
16967 cover_mode, transform_type, transforms); 17008 cover_mode, transform_type, transforms);
16968 return error::kNoError; 17009 return error::kNoError;
16969 } 17010 }
16970 17011
16971 error::Error GLES2DecoderImpl::HandleCoverStrokePathInstancedCHROMIUM( 17012 error::Error GLES2DecoderImpl::HandleCoverStrokePathInstancedCHROMIUM(
16972 uint32_t immediate_data_size, 17013 uint32_t immediate_data_size,
16973 const void* cmd_data) { 17014 const void* cmd_data) {
(...skipping 18 matching lines...) Expand all
16992 return error::kNoError; 17033 return error::kNoError;
16993 17034
16994 std::unique_ptr<GLuint[]> paths; 17035 std::unique_ptr<GLuint[]> paths;
16995 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) 17036 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths))
16996 return v.error(); 17037 return v.error();
16997 17038
16998 const GLfloat* transforms = nullptr; 17039 const GLfloat* transforms = nullptr;
16999 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) 17040 if (!v.GetTransforms(c, num_paths, transform_type, &transforms))
17000 return v.error(); 17041 return v.error();
17001 17042
17002 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 17043 if (!CheckBoundDrawFramebufferValid(kFunctionName))
17003 return error::kNoError; 17044 return error::kNoError;
17004 ApplyDirtyState(); 17045 ApplyDirtyState();
17005 glCoverStrokePathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0, 17046 glCoverStrokePathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 0,
17006 cover_mode, transform_type, transforms); 17047 cover_mode, transform_type, transforms);
17007 return error::kNoError; 17048 return error::kNoError;
17008 } 17049 }
17009 17050
17010 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathInstancedCHROMIUM( 17051 error::Error GLES2DecoderImpl::HandleStencilThenCoverFillPathInstancedCHROMIUM(
17011 uint32_t immediate_data_size, 17052 uint32_t immediate_data_size,
17012 const void* cmd_data) { 17053 const void* cmd_data) {
(...skipping 23 matching lines...) Expand all
17036 return error::kNoError; 17077 return error::kNoError;
17037 17078
17038 std::unique_ptr<GLuint[]> paths; 17079 std::unique_ptr<GLuint[]> paths;
17039 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) 17080 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths))
17040 return v.error(); 17081 return v.error();
17041 17082
17042 const GLfloat* transforms = nullptr; 17083 const GLfloat* transforms = nullptr;
17043 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) 17084 if (!v.GetTransforms(c, num_paths, transform_type, &transforms))
17044 return v.error(); 17085 return v.error();
17045 17086
17046 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 17087 if (!CheckBoundDrawFramebufferValid(kFunctionName))
17047 return error::kNoError; 17088 return error::kNoError;
17048 ApplyDirtyState(); 17089 ApplyDirtyState();
17049 glStencilThenCoverFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(), 17090 glStencilThenCoverFillPathInstancedNV(num_paths, GL_UNSIGNED_INT, paths.get(),
17050 0, fill_mode, mask, cover_mode, 17091 0, fill_mode, mask, cover_mode,
17051 transform_type, transforms); 17092 transform_type, transforms);
17052 return error::kNoError; 17093 return error::kNoError;
17053 } 17094 }
17054 17095
17055 error::Error 17096 error::Error
17056 GLES2DecoderImpl::HandleStencilThenCoverStrokePathInstancedCHROMIUM( 17097 GLES2DecoderImpl::HandleStencilThenCoverStrokePathInstancedCHROMIUM(
(...skipping 24 matching lines...) Expand all
17081 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths)) 17122 if (!v.GetPathNameData(c, num_paths, path_name_type, &paths))
17082 return v.error(); 17123 return v.error();
17083 17124
17084 const GLfloat* transforms = nullptr; 17125 const GLfloat* transforms = nullptr;
17085 if (!v.GetTransforms(c, num_paths, transform_type, &transforms)) 17126 if (!v.GetTransforms(c, num_paths, transform_type, &transforms))
17086 return v.error(); 17127 return v.error();
17087 17128
17088 GLint reference = static_cast<GLint>(c.reference); 17129 GLint reference = static_cast<GLint>(c.reference);
17089 GLuint mask = static_cast<GLuint>(c.mask); 17130 GLuint mask = static_cast<GLuint>(c.mask);
17090 17131
17091 if (!CheckBoundDrawFramebufferValid(true, kFunctionName)) 17132 if (!CheckBoundDrawFramebufferValid(kFunctionName))
17092 return error::kNoError; 17133 return error::kNoError;
17093 ApplyDirtyState(); 17134 ApplyDirtyState();
17094 glStencilThenCoverStrokePathInstancedNV( 17135 glStencilThenCoverStrokePathInstancedNV(
17095 num_paths, GL_UNSIGNED_INT, paths.get(), 0, reference, mask, cover_mode, 17136 num_paths, GL_UNSIGNED_INT, paths.get(), 0, reference, mask, cover_mode,
17096 transform_type, transforms); 17137 transform_type, transforms);
17097 return error::kNoError; 17138 return error::kNoError;
17098 } 17139 }
17099 17140
17100 void GLES2DecoderImpl::DoBindFragmentInputLocationCHROMIUM( 17141 void GLES2DecoderImpl::DoBindFragmentInputLocationCHROMIUM(
17101 GLuint program_id, 17142 GLuint program_id,
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
17348 } 17389 }
17349 17390
17350 // Include the auto-generated part of this file. We split this because it means 17391 // Include the auto-generated part of this file. We split this because it means
17351 // we can easily edit the non-auto generated parts right here in this file 17392 // we can easily edit the non-auto generated parts right here in this file
17352 // instead of having to edit some template or the code generator. 17393 // instead of having to edit some template or the code generator.
17353 #include "base/macros.h" 17394 #include "base/macros.h"
17354 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 17395 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
17355 17396
17356 } // namespace gles2 17397 } // namespace gles2
17357 } // namespace gpu 17398 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698