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

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

Issue 2689006: Refactor validation code so it can be modified at runtime.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 <stdio.h> 7 #include <stdio.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <list> 10 #include <list>
(...skipping 1021 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 1032
1033 // Validates the program and location for a glGetUniform call and returns 1033 // Validates the program and location for a glGetUniform call and returns
1034 // a SizeResult setup to receive the result. Returns true if glGetUniform 1034 // a SizeResult setup to receive the result. Returns true if glGetUniform
1035 // should be called. 1035 // should be called.
1036 bool GetUniformSetup( 1036 bool GetUniformSetup(
1037 GLuint program, GLint location, 1037 GLuint program, GLint location,
1038 uint32 shm_id, uint32 shm_offset, 1038 uint32 shm_id, uint32 shm_offset,
1039 error::Error* error, GLuint* service_id, void** result, 1039 error::Error* error, GLuint* service_id, void** result,
1040 GLenum* result_type); 1040 GLenum* result_type);
1041 1041
1042 bool ValidateGLenumCompressedTextureInternalFormat(GLenum format);
1043
1044 // Generate a member function prototype for each command in an automated and 1042 // Generate a member function prototype for each command in an automated and
1045 // typesafe way. 1043 // typesafe way.
1046 #define GLES2_CMD_OP(name) \ 1044 #define GLES2_CMD_OP(name) \
1047 Error Handle ## name( \ 1045 Error Handle ## name( \
1048 uint32 immediate_data_size, \ 1046 uint32 immediate_data_size, \
1049 const gles2::name& args); \ 1047 const gles2::name& args); \
1050 1048
1051 GLES2_COMMAND_LIST(GLES2_CMD_OP) 1049 GLES2_COMMAND_LIST(GLES2_CMD_OP)
1052 1050
1053 #undef GLES2_CMD_OP 1051 #undef GLES2_CMD_OP
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
1139 // The copy that is saved when SwapBuffers is called. 1137 // The copy that is saved when SwapBuffers is called.
1140 scoped_ptr<Texture> offscreen_saved_color_texture_; 1138 scoped_ptr<Texture> offscreen_saved_color_texture_;
1141 1139
1142 scoped_ptr<Callback0::Type> swap_buffers_callback_; 1140 scoped_ptr<Callback0::Type> swap_buffers_callback_;
1143 1141
1144 // The last error message set. 1142 // The last error message set.
1145 std::string last_error_; 1143 std::string last_error_;
1146 1144
1147 bool use_shader_translator_; 1145 bool use_shader_translator_;
1148 1146
1147 // Cached from the context group.
1148 const Validators* validators_;
1149
1149 DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl); 1150 DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl);
1150 }; 1151 };
1151 1152
1152 ScopedGLErrorSuppressor::ScopedGLErrorSuppressor(GLES2DecoderImpl* decoder) 1153 ScopedGLErrorSuppressor::ScopedGLErrorSuppressor(GLES2DecoderImpl* decoder)
1153 : decoder_(decoder) { 1154 : decoder_(decoder) {
1154 decoder_->CopyRealGLErrorsToWrapper(); 1155 decoder_->CopyRealGLErrorsToWrapper();
1155 } 1156 }
1156 1157
1157 ScopedGLErrorSuppressor::~ScopedGLErrorSuppressor() { 1158 ScopedGLErrorSuppressor::~ScopedGLErrorSuppressor() {
1158 decoder_->ClearRealGLErrors(); 1159 decoder_->ClearRealGLErrors();
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
1400 error_bits_(0), 1401 error_bits_(0),
1401 util_(0), // TODO(gman): Set to actual num compress texture formats. 1402 util_(0), // TODO(gman): Set to actual num compress texture formats.
1402 pack_alignment_(4), 1403 pack_alignment_(4),
1403 unpack_alignment_(4), 1404 unpack_alignment_(4),
1404 attrib_0_buffer_id_(0), 1405 attrib_0_buffer_id_(0),
1405 attrib_0_size_(0), 1406 attrib_0_size_(0),
1406 active_texture_unit_(0), 1407 active_texture_unit_(0),
1407 black_2d_texture_id_(0), 1408 black_2d_texture_id_(0),
1408 black_cube_texture_id_(0), 1409 black_cube_texture_id_(0),
1409 anti_aliased_(false), 1410 anti_aliased_(false),
1410 use_shader_translator_(true) { 1411 use_shader_translator_(true),
1412 validators_(group->validators()) {
1411 attrib_0_value_.v[0] = 0.0f; 1413 attrib_0_value_.v[0] = 0.0f;
1412 attrib_0_value_.v[1] = 0.0f; 1414 attrib_0_value_.v[1] = 0.0f;
1413 attrib_0_value_.v[2] = 0.0f; 1415 attrib_0_value_.v[2] = 0.0f;
1414 attrib_0_value_.v[3] = 1.0f; 1416 attrib_0_value_.v[3] = 1.0f;
1415 1417
1416 // The shader translator is not needed for EGL because it already uses the 1418 // The shader translator is not needed for EGL because it already uses the
1417 // GLSL ES syntax. It is translated for the unit tests because 1419 // GLSL ES syntax. It is translated for the unit tests because
1418 // GLES2DecoderWithShaderTest.GetShaderInfoLogValidArgs passes the empty 1420 // GLES2DecoderWithShaderTest.GetShaderInfoLogValidArgs passes the empty
1419 // string to CompileShader and this is not a valid shader. TODO(apatrick): 1421 // string to CompileShader and this is not a valid shader. TODO(apatrick):
1420 // fix this test. 1422 // fix this test.
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after
2021 if (GetShaderInfo(client_id)) { 2023 if (GetShaderInfo(client_id)) {
2022 return false; 2024 return false;
2023 } 2025 }
2024 GLuint service_id = glCreateShader(type); 2026 GLuint service_id = glCreateShader(type);
2025 if (service_id != 0) { 2027 if (service_id != 0) {
2026 CreateShaderInfo(client_id, service_id, type); 2028 CreateShaderInfo(client_id, service_id, type);
2027 } 2029 }
2028 return true; 2030 return true;
2029 } 2031 }
2030 2032
2031 bool GLES2DecoderImpl::ValidateGLenumCompressedTextureInternalFormat(GLenum) {
2032 // TODO(gman): Add support for compressed texture formats.
2033 return false;
2034 }
2035
2036 void GLES2DecoderImpl::DoActiveTexture(GLenum texture_unit) { 2033 void GLES2DecoderImpl::DoActiveTexture(GLenum texture_unit) {
2037 GLuint texture_index = texture_unit - GL_TEXTURE0; 2034 GLuint texture_index = texture_unit - GL_TEXTURE0;
2038 if (texture_index > group_->max_texture_units()) { 2035 if (texture_index > group_->max_texture_units()) {
2039 SetGLError(GL_INVALID_ENUM, "glActiveTexture: texture_unit out of range."); 2036 SetGLError(GL_INVALID_ENUM, "glActiveTexture: texture_unit out of range.");
2040 return; 2037 return;
2041 } 2038 }
2042 active_texture_unit_ = texture_index; 2039 active_texture_unit_ = texture_index;
2043 glActiveTexture(texture_unit); 2040 glActiveTexture(texture_unit);
2044 } 2041 }
2045 2042
(...skipping 1102 matching lines...) Expand 10 before | Expand all | Expand 10 after
3148 GLenum type = c.type; 3145 GLenum type = c.type;
3149 int32 offset = c.index_offset; 3146 int32 offset = c.index_offset;
3150 if (count < 0) { 3147 if (count < 0) {
3151 SetGLError(GL_INVALID_VALUE, "glDrawElements: count < 0"); 3148 SetGLError(GL_INVALID_VALUE, "glDrawElements: count < 0");
3152 return error::kNoError; 3149 return error::kNoError;
3153 } 3150 }
3154 if (offset < 0) { 3151 if (offset < 0) {
3155 SetGLError(GL_INVALID_VALUE, "glDrawElements: offset < 0"); 3152 SetGLError(GL_INVALID_VALUE, "glDrawElements: offset < 0");
3156 return error::kNoError; 3153 return error::kNoError;
3157 } 3154 }
3158 if (!ValidateGLenumDrawMode(mode)) { 3155 if (!validators_->draw_mode.IsValid(mode)) {
3159 SetGLError(GL_INVALID_ENUM, "glDrawElements: mode GL_INVALID_ENUM"); 3156 SetGLError(GL_INVALID_ENUM, "glDrawElements: mode GL_INVALID_ENUM");
3160 return error::kNoError; 3157 return error::kNoError;
3161 } 3158 }
3162 if (!ValidateGLenumIndexType(type)) { 3159 if (!validators_->index_type.IsValid(type)) {
3163 SetGLError(GL_INVALID_ENUM, "glDrawElements: type GL_INVALID_ENUM"); 3160 SetGLError(GL_INVALID_ENUM, "glDrawElements: type GL_INVALID_ENUM");
3164 return error::kNoError; 3161 return error::kNoError;
3165 } 3162 }
3166 3163
3167 GLuint max_vertex_accessed; 3164 GLuint max_vertex_accessed;
3168 if (!bound_element_array_buffer_->GetMaxValueForRange( 3165 if (!bound_element_array_buffer_->GetMaxValueForRange(
3169 offset, count, type, &max_vertex_accessed)) { 3166 offset, count, type, &max_vertex_accessed)) {
3170 SetGLError(GL_INVALID_OPERATION, 3167 SetGLError(GL_INVALID_OPERATION,
3171 "glDrawElements: range out of bounds for buffer"); 3168 "glDrawElements: range out of bounds for buffer");
3172 return error::kNoError; 3169 return error::kNoError;
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after
3678 return error::kNoError; 3675 return error::kNoError;
3679 } 3676 }
3680 3677
3681 GLuint indx = c.indx; 3678 GLuint indx = c.indx;
3682 GLint size = c.size; 3679 GLint size = c.size;
3683 GLenum type = c.type; 3680 GLenum type = c.type;
3684 GLboolean normalized = c.normalized; 3681 GLboolean normalized = c.normalized;
3685 GLsizei stride = c.stride; 3682 GLsizei stride = c.stride;
3686 GLsizei offset = c.offset; 3683 GLsizei offset = c.offset;
3687 const void* ptr = reinterpret_cast<const void*>(offset); 3684 const void* ptr = reinterpret_cast<const void*>(offset);
3688 if (!ValidateGLenumVertexAttribType(type)) { 3685 if (!validators_->vertex_attrib_type.IsValid(type)) {
3689 SetGLError(GL_INVALID_ENUM, 3686 SetGLError(GL_INVALID_ENUM,
3690 "glVertexAttribPointer: type GL_INVALID_ENUM"); 3687 "glVertexAttribPointer: type GL_INVALID_ENUM");
3691 return error::kNoError; 3688 return error::kNoError;
3692 } 3689 }
3693 if (!ValidateGLintVertexAttribSize(size)) { 3690 if (!validators_->vertex_attrib_size.IsValid(size)) {
3694 SetGLError(GL_INVALID_ENUM, 3691 SetGLError(GL_INVALID_ENUM,
3695 "glVertexAttribPointer: size GL_INVALID_VALUE"); 3692 "glVertexAttribPointer: size GL_INVALID_VALUE");
3696 return error::kNoError; 3693 return error::kNoError;
3697 } 3694 }
3698 if (indx >= group_->max_vertex_attribs()) { 3695 if (indx >= group_->max_vertex_attribs()) {
3699 SetGLError(GL_INVALID_VALUE, "glVertexAttribPointer: index out of range"); 3696 SetGLError(GL_INVALID_VALUE, "glVertexAttribPointer: index out of range");
3700 return error::kNoError; 3697 return error::kNoError;
3701 } 3698 }
3702 if (stride < 0) { 3699 if (stride < 0) {
3703 SetGLError(GL_INVALID_VALUE, 3700 SetGLError(GL_INVALID_VALUE,
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
3752 return error::kOutOfBounds; 3749 return error::kOutOfBounds;
3753 } 3750 }
3754 void* pixels = GetSharedMemoryAs<void*>( 3751 void* pixels = GetSharedMemoryAs<void*>(
3755 c.pixels_shm_id, c.pixels_shm_offset, pixels_size); 3752 c.pixels_shm_id, c.pixels_shm_offset, pixels_size);
3756 Result* result = GetSharedMemoryAs<Result*>( 3753 Result* result = GetSharedMemoryAs<Result*>(
3757 c.result_shm_id, c.result_shm_offset, sizeof(*result)); 3754 c.result_shm_id, c.result_shm_offset, sizeof(*result));
3758 if (!pixels || !result) { 3755 if (!pixels || !result) {
3759 return error::kOutOfBounds; 3756 return error::kOutOfBounds;
3760 } 3757 }
3761 3758
3762 if (!ValidateGLenumReadPixelFormat(format)) { 3759 if (!validators_->read_pixel_format.IsValid(format)) {
3763 SetGLError(GL_INVALID_ENUM, "glReadPixels: format GL_INVALID_ENUM"); 3760 SetGLError(GL_INVALID_ENUM, "glReadPixels: format GL_INVALID_ENUM");
3764 return error::kNoError; 3761 return error::kNoError;
3765 } 3762 }
3766 if (!ValidateGLenumPixelType(type)) { 3763 if (!validators_->pixel_type.IsValid(type)) {
3767 SetGLError(GL_INVALID_ENUM, "glReadPixels: type GL_INVALID_ENUM"); 3764 SetGLError(GL_INVALID_ENUM, "glReadPixels: type GL_INVALID_ENUM");
3768 return error::kNoError; 3765 return error::kNoError;
3769 } 3766 }
3770 if (width == 0 || height == 0) { 3767 if (width == 0 || height == 0) {
3771 return error::kNoError; 3768 return error::kNoError;
3772 } 3769 }
3773 3770
3774 CopyRealGLErrorsToWrapper(); 3771 CopyRealGLErrorsToWrapper();
3775 3772
3776 // Get the size of the current fbo or backbuffer. 3773 // Get the size of the current fbo or backbuffer.
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
3839 } else { 3836 } else {
3840 SetGLError(error, NULL); 3837 SetGLError(error, NULL);
3841 } 3838 }
3842 return error::kNoError; 3839 return error::kNoError;
3843 } 3840 }
3844 3841
3845 error::Error GLES2DecoderImpl::HandlePixelStorei( 3842 error::Error GLES2DecoderImpl::HandlePixelStorei(
3846 uint32 immediate_data_size, const gles2::PixelStorei& c) { 3843 uint32 immediate_data_size, const gles2::PixelStorei& c) {
3847 GLenum pname = c.pname; 3844 GLenum pname = c.pname;
3848 GLenum param = c.param; 3845 GLenum param = c.param;
3849 if (!ValidateGLenumPixelStore(pname)) { 3846 if (!validators_->pixel_store.IsValid(pname)) {
3850 SetGLError(GL_INVALID_ENUM, "glPixelStorei: pname GL_INVALID_ENUM"); 3847 SetGLError(GL_INVALID_ENUM, "glPixelStorei: pname GL_INVALID_ENUM");
3851 return error::kNoError; 3848 return error::kNoError;
3852 } 3849 }
3853 if (!ValidateGLintPixelStoreAlignment(param)) { 3850 if (!validators_->pixel_store_alignment.IsValid(param)) {
3854 SetGLError(GL_INVALID_VALUE, "glPixelSTore: param GL_INVALID_VALUE"); 3851 SetGLError(GL_INVALID_VALUE, "glPixelSTore: param GL_INVALID_VALUE");
3855 return error::kNoError; 3852 return error::kNoError;
3856 } 3853 }
3857 glPixelStorei(pname, param); 3854 glPixelStorei(pname, param);
3858 switch (pname) { 3855 switch (pname) {
3859 case GL_PACK_ALIGNMENT: 3856 case GL_PACK_ALIGNMENT:
3860 pack_alignment_ = param; 3857 pack_alignment_ = param;
3861 break; 3858 break;
3862 case GL_UNPACK_ALIGNMENT: 3859 case GL_UNPACK_ALIGNMENT:
3863 unpack_alignment_ = param; 3860 unpack_alignment_ = param;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
3999 if (!bucket->GetAsString(&name_str)) { 3996 if (!bucket->GetAsString(&name_str)) {
4000 return error::kInvalidArguments; 3997 return error::kInvalidArguments;
4001 } 3998 }
4002 return GetUniformLocationHelper( 3999 return GetUniformLocationHelper(
4003 c.program, c.location_shm_id, c.location_shm_offset, name_str); 4000 c.program, c.location_shm_id, c.location_shm_offset, name_str);
4004 } 4001 }
4005 4002
4006 error::Error GLES2DecoderImpl::HandleGetString( 4003 error::Error GLES2DecoderImpl::HandleGetString(
4007 uint32 immediate_data_size, const gles2::GetString& c) { 4004 uint32 immediate_data_size, const gles2::GetString& c) {
4008 GLenum name = static_cast<GLenum>(c.name); 4005 GLenum name = static_cast<GLenum>(c.name);
4009 if (!ValidateGLenumStringType(name)) { 4006 if (!validators_->string_type.IsValid(name)) {
4010 SetGLError(GL_INVALID_ENUM, "glGetString: name GL_INVALID_ENUM"); 4007 SetGLError(GL_INVALID_ENUM, "glGetString: name GL_INVALID_ENUM");
4011 return error::kNoError; 4008 return error::kNoError;
4012 } 4009 }
4013 const char* gl_str = reinterpret_cast<const char*>(glGetString(name)); 4010 const char* gl_str = reinterpret_cast<const char*>(glGetString(name));
4014 const char* str = NULL; 4011 const char* str = NULL;
4015 switch (name) { 4012 switch (name) {
4016 case GL_VERSION: 4013 case GL_VERSION:
4017 str = "OpenGL ES 2.0 Chromium"; 4014 str = "OpenGL ES 2.0 Chromium";
4018 break; 4015 break;
4019 case GL_SHADING_LANGUAGE_VERSION: 4016 case GL_SHADING_LANGUAGE_VERSION:
4020 str = "OpenGL ES GLSL ES 1.0 Chromium"; 4017 str = "OpenGL ES GLSL ES 1.0 Chromium";
4021 break; 4018 break;
4022 case GL_EXTENSIONS: 4019 case GL_EXTENSIONS:
4023 str = ""; 4020 str = "";
4024 break; 4021 break;
4025 default: 4022 default:
4026 str = gl_str; 4023 str = gl_str;
4027 break; 4024 break;
4028 } 4025 }
4029 Bucket* bucket = CreateBucket(c.bucket_id); 4026 Bucket* bucket = CreateBucket(c.bucket_id);
4030 bucket->SetFromString(str); 4027 bucket->SetFromString(str);
4031 return error::kNoError; 4028 return error::kNoError;
4032 } 4029 }
4033 4030
4034 void GLES2DecoderImpl::DoBufferData( 4031 void GLES2DecoderImpl::DoBufferData(
4035 GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage) { 4032 GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage) {
4036 if (!ValidateGLenumBufferTarget(target)) { 4033 if (!validators_->buffer_target.IsValid(target)) {
4037 SetGLError(GL_INVALID_ENUM, "glBufferData: target GL_INVALID_ENUM"); 4034 SetGLError(GL_INVALID_ENUM, "glBufferData: target GL_INVALID_ENUM");
4038 return; 4035 return;
4039 } 4036 }
4040 if (!ValidateGLenumBufferUsage(usage)) { 4037 if (!validators_->buffer_usage.IsValid(usage)) {
4041 SetGLError(GL_INVALID_ENUM, "glBufferData: usage GL_INVALID_ENUM"); 4038 SetGLError(GL_INVALID_ENUM, "glBufferData: usage GL_INVALID_ENUM");
4042 return; 4039 return;
4043 } 4040 }
4044 if (size < 0) { 4041 if (size < 0) {
4045 SetGLError(GL_INVALID_VALUE, "glBufferData: size < 0"); 4042 SetGLError(GL_INVALID_VALUE, "glBufferData: size < 0");
4046 return; 4043 return;
4047 } 4044 }
4048 BufferManager::BufferInfo* info = GetBufferInfoForTarget(target); 4045 BufferManager::BufferInfo* info = GetBufferInfoForTarget(target);
4049 if (!info) { 4046 if (!info) {
4050 SetGLError(GL_INVALID_VALUE, "glBufferData: unknown buffer"); 4047 SetGLError(GL_INVALID_VALUE, "glBufferData: unknown buffer");
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
4117 error::Error GLES2DecoderImpl::DoCompressedTexImage2D( 4114 error::Error GLES2DecoderImpl::DoCompressedTexImage2D(
4118 GLenum target, 4115 GLenum target,
4119 GLint level, 4116 GLint level,
4120 GLenum internal_format, 4117 GLenum internal_format,
4121 GLsizei width, 4118 GLsizei width,
4122 GLsizei height, 4119 GLsizei height,
4123 GLint border, 4120 GLint border,
4124 GLsizei image_size, 4121 GLsizei image_size,
4125 const void* data) { 4122 const void* data) {
4126 // TODO(gman): Validate image_size is correct for width, height and format. 4123 // TODO(gman): Validate image_size is correct for width, height and format.
4127 if (!ValidateGLenumTextureTarget(target)) { 4124 if (!validators_->texture_target.IsValid(target)) {
4128 SetGLError(GL_INVALID_ENUM, 4125 SetGLError(GL_INVALID_ENUM,
4129 "glCompressedTexImage2D: target GL_INVALID_ENUM"); 4126 "glCompressedTexImage2D: target GL_INVALID_ENUM");
4130 return error::kNoError; 4127 return error::kNoError;
4131 } 4128 }
4132 if (!ValidateGLenumCompressedTextureInternalFormat(internal_format)) { 4129 if (!validators_->compressed_texture_format.IsValid(
4130 internal_format)) {
4133 SetGLError(GL_INVALID_ENUM, 4131 SetGLError(GL_INVALID_ENUM,
4134 "glCompressedTexImage2D: internal_format GL_INVALID_ENUM"); 4132 "glCompressedTexImage2D: internal_format GL_INVALID_ENUM");
4135 return error::kNoError; 4133 return error::kNoError;
4136 } 4134 }
4137 if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || 4135 if (!texture_manager()->ValidForTarget(target, level, width, height, 1) ||
4138 border != 0) { 4136 border != 0) {
4139 SetGLError(GL_INVALID_VALUE, 4137 SetGLError(GL_INVALID_VALUE,
4140 "glCompressedTexImage2D: dimensions out of range"); 4138 "glCompressedTexImage2D: dimensions out of range");
4141 return error::kNoError; 4139 return error::kNoError;
4142 } 4140 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
4221 GLint level = static_cast<GLint>(c.level); 4219 GLint level = static_cast<GLint>(c.level);
4222 GLint xoffset = static_cast<GLint>(c.xoffset); 4220 GLint xoffset = static_cast<GLint>(c.xoffset);
4223 GLint yoffset = static_cast<GLint>(c.yoffset); 4221 GLint yoffset = static_cast<GLint>(c.yoffset);
4224 GLsizei width = static_cast<GLsizei>(c.width); 4222 GLsizei width = static_cast<GLsizei>(c.width);
4225 GLsizei height = static_cast<GLsizei>(c.height); 4223 GLsizei height = static_cast<GLsizei>(c.height);
4226 GLenum format = static_cast<GLenum>(c.format); 4224 GLenum format = static_cast<GLenum>(c.format);
4227 Bucket* bucket = GetBucket(c.bucket_id); 4225 Bucket* bucket = GetBucket(c.bucket_id);
4228 uint32 data_size = bucket->size(); 4226 uint32 data_size = bucket->size();
4229 GLsizei imageSize = data_size; 4227 GLsizei imageSize = data_size;
4230 const void* data = bucket->GetData(0, data_size); 4228 const void* data = bucket->GetData(0, data_size);
4231 if (!ValidateGLenumTextureTarget(target)) { 4229 if (!validators_->texture_target.IsValid(target)) {
4232 SetGLError( 4230 SetGLError(
4233 GL_INVALID_ENUM, "glCompressedTexSubImage2D: target GL_INVALID_ENUM"); 4231 GL_INVALID_ENUM, "glCompressedTexSubImage2D: target GL_INVALID_ENUM");
4234 return error::kNoError; 4232 return error::kNoError;
4235 } 4233 }
4234 if (!validators_->compressed_texture_format.IsValid(format)) {
4235 SetGLError(GL_INVALID_ENUM,
4236 "glCompressedTexSubImage2D: format GL_INVALID_ENUM");
4237 return error::kNoError;
4238 }
4236 if (width < 0) { 4239 if (width < 0) {
4237 SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: width < 0"); 4240 SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: width < 0");
4238 return error::kNoError; 4241 return error::kNoError;
4239 } 4242 }
4240 if (height < 0) { 4243 if (height < 0) {
4241 SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: height < 0"); 4244 SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: height < 0");
4242 return error::kNoError; 4245 return error::kNoError;
4243 } 4246 }
4244 if (imageSize < 0) { 4247 if (imageSize < 0) {
4245 SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: imageSize < 0"); 4248 SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: imageSize < 0");
4246 return error::kNoError; 4249 return error::kNoError;
4247 } 4250 }
4248 glCompressedTexSubImage2D( 4251 glCompressedTexSubImage2D(
4249 target, level, xoffset, yoffset, width, height, format, imageSize, data); 4252 target, level, xoffset, yoffset, width, height, format, imageSize, data);
4250 return error::kNoError; 4253 return error::kNoError;
4251 } 4254 }
4252 4255
4253 error::Error GLES2DecoderImpl::DoTexImage2D( 4256 error::Error GLES2DecoderImpl::DoTexImage2D(
4254 GLenum target, 4257 GLenum target,
4255 GLint level, 4258 GLint level,
4256 GLenum internal_format, 4259 GLenum internal_format,
4257 GLsizei width, 4260 GLsizei width,
4258 GLsizei height, 4261 GLsizei height,
4259 GLint border, 4262 GLint border,
4260 GLenum format, 4263 GLenum format,
4261 GLenum type, 4264 GLenum type,
4262 const void* pixels, 4265 const void* pixels,
4263 uint32 pixels_size) { 4266 uint32 pixels_size) {
4264 if (!ValidateGLenumTextureTarget(target)) { 4267 if (!validators_->texture_target.IsValid(target)) {
4265 SetGLError(GL_INVALID_ENUM, "glTexImage2D: target GL_INVALID_ENUM"); 4268 SetGLError(GL_INVALID_ENUM, "glTexImage2D: target GL_INVALID_ENUM");
4266 return error::kNoError; 4269 return error::kNoError;
4267 } 4270 }
4268 if (!ValidateGLenumTextureFormat(internal_format)) { 4271 if (!validators_->texture_format.IsValid(internal_format)) {
4269 SetGLError(GL_INVALID_ENUM, 4272 SetGLError(GL_INVALID_ENUM,
4270 "glTexImage2D: internal_format GL_INVALID_ENUM"); 4273 "glTexImage2D: internal_format GL_INVALID_ENUM");
4271 return error::kNoError; 4274 return error::kNoError;
4272 } 4275 }
4273 if (!ValidateGLenumTextureFormat(format)) { 4276 if (!validators_->texture_format.IsValid(format)) {
4274 SetGLError(GL_INVALID_ENUM, "glTexImage2D: format GL_INVALID_ENUM"); 4277 SetGLError(GL_INVALID_ENUM, "glTexImage2D: format GL_INVALID_ENUM");
4275 return error::kNoError; 4278 return error::kNoError;
4276 } 4279 }
4277 if (!ValidateGLenumPixelType(type)) { 4280 if (!validators_->pixel_type.IsValid(type)) {
4278 SetGLError(GL_INVALID_ENUM, "glTexImage2D: type GL_INVALID_ENUM"); 4281 SetGLError(GL_INVALID_ENUM, "glTexImage2D: type GL_INVALID_ENUM");
4279 return error::kNoError; 4282 return error::kNoError;
4280 } 4283 }
4281 if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || 4284 if (!texture_manager()->ValidForTarget(target, level, width, height, 1) ||
4282 border != 0) { 4285 border != 0) {
4283 SetGLError(GL_INVALID_VALUE, "glTexImage2D: dimensions out of range"); 4286 SetGLError(GL_INVALID_VALUE, "glTexImage2D: dimensions out of range");
4284 return error::kNoError; 4287 return error::kNoError;
4285 } 4288 }
4286 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); 4289 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
4287 if (!info) { 4290 if (!info) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
4366 typedef gles2::GetVertexAttribPointerv::Result Result; 4369 typedef gles2::GetVertexAttribPointerv::Result Result;
4367 Result* result = GetSharedMemoryAs<Result*>( 4370 Result* result = GetSharedMemoryAs<Result*>(
4368 c.pointer_shm_id, c.pointer_shm_offset, Result::ComputeSize(1)); 4371 c.pointer_shm_id, c.pointer_shm_offset, Result::ComputeSize(1));
4369 if (!result) { 4372 if (!result) {
4370 return error::kOutOfBounds; 4373 return error::kOutOfBounds;
4371 } 4374 }
4372 // Check that the client initialized the result. 4375 // Check that the client initialized the result.
4373 if (result->size != 0) { 4376 if (result->size != 0) {
4374 return error::kInvalidArguments; 4377 return error::kInvalidArguments;
4375 } 4378 }
4376 if (!ValidateGLenumVertexPointer(pname)) { 4379 if (!validators_->vertex_pointer.IsValid(pname)) {
4377 SetGLError(GL_INVALID_ENUM, 4380 SetGLError(GL_INVALID_ENUM,
4378 "glGetVertexAttribPointerv: pname GL_INVALID_ENUM"); 4381 "glGetVertexAttribPointerv: pname GL_INVALID_ENUM");
4379 return error::kNoError; 4382 return error::kNoError;
4380 } 4383 }
4381 if (index >= group_->max_vertex_attribs()) { 4384 if (index >= group_->max_vertex_attribs()) {
4382 SetGLError(GL_INVALID_VALUE, 4385 SetGLError(GL_INVALID_VALUE,
4383 "glGetVertexAttribPointerv: index out of range."); 4386 "glGetVertexAttribPointerv: index out of range.");
4384 return error::kNoError; 4387 return error::kNoError;
4385 } 4388 }
4386 result->SetNumResults(1); 4389 result->SetNumResults(1);
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
4496 typedef gles2::GetShaderPrecisionFormat::Result Result; 4499 typedef gles2::GetShaderPrecisionFormat::Result Result;
4497 Result* result = GetSharedMemoryAs<Result*>( 4500 Result* result = GetSharedMemoryAs<Result*>(
4498 c.result_shm_id, c.result_shm_offset, sizeof(*result)); 4501 c.result_shm_id, c.result_shm_offset, sizeof(*result));
4499 if (!result) { 4502 if (!result) {
4500 return error::kOutOfBounds; 4503 return error::kOutOfBounds;
4501 } 4504 }
4502 // Check that the client initialized the result. 4505 // Check that the client initialized the result.
4503 if (result->success != 0) { 4506 if (result->success != 0) {
4504 return error::kInvalidArguments; 4507 return error::kInvalidArguments;
4505 } 4508 }
4506 if (!ValidateGLenumShaderType(shader_type)) { 4509 if (!validators_->shader_type.IsValid(shader_type)) {
4507 SetGLError(GL_INVALID_ENUM, 4510 SetGLError(GL_INVALID_ENUM,
4508 "glGetShaderPrecisionFormat: shader_type GL_INVALID_ENUM"); 4511 "glGetShaderPrecisionFormat: shader_type GL_INVALID_ENUM");
4509 return error::kNoError; 4512 return error::kNoError;
4510 } 4513 }
4511 if (!ValidateGLenumShaderPrecision(precision_type)) { 4514 if (!validators_->shader_precision.IsValid(precision_type)) {
4512 SetGLError(GL_INVALID_ENUM, 4515 SetGLError(GL_INVALID_ENUM,
4513 "glGetShaderPrecisionFormat: precision_type GL_INVALID_ENUM"); 4516 "glGetShaderPrecisionFormat: precision_type GL_INVALID_ENUM");
4514 return error::kNoError; 4517 return error::kNoError;
4515 } 4518 }
4516 4519
4517 result->success = 1; // true 4520 result->success = 1; // true
4518 switch (precision_type) { 4521 switch (precision_type) {
4519 case GL_LOW_INT: 4522 case GL_LOW_INT:
4520 case GL_MEDIUM_INT: 4523 case GL_MEDIUM_INT:
4521 case GL_HIGH_INT: 4524 case GL_HIGH_INT:
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
4746 return error::kNoError; 4749 return error::kNoError;
4747 } 4750 }
4748 4751
4749 // Include the auto-generated part of this file. We split this because it means 4752 // Include the auto-generated part of this file. We split this because it means
4750 // we can easily edit the non-auto generated parts right here in this file 4753 // we can easily edit the non-auto generated parts right here in this file
4751 // instead of having to edit some template or the code generator. 4754 // instead of having to edit some template or the code generator.
4752 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 4755 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
4753 4756
4754 } // namespace gles2 4757 } // namespace gles2
4755 } // namespace gpu 4758 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gl_utils.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698