Chromium Code Reviews| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
| =================================================================== |
| --- gpu/command_buffer/service/gles2_cmd_decoder.cc (revision 99750) |
| +++ gpu/command_buffer/service/gles2_cmd_decoder.cc (working copy) |
| @@ -1311,6 +1311,18 @@ |
| const Validators* validators_; |
| FeatureInfo* feature_info_; |
| + // Per GLES2DecoderImpl instance set of validators, which are used if |
| + // a more constrained set of extensions is required for this particular |
| + // context, wrt the shared ContextGroup. |
| + scoped_ptr<FeatureInfo> local_feature_info_; |
| + |
| + // Get the set of validators to use for API parameter verification. |
| + const Validators* validators() const { |
| + if (local_feature_info_.get()) |
| + return local_feature_info_->validators(); |
| + return validators_; |
| + } |
| + |
| // This indicates all the following texSubImage2D calls that are part of the |
| // failed texImage2D call should be ignored. |
| bool tex_image_2d_failed_; |
| @@ -1736,7 +1748,22 @@ |
| return false; |
| } |
| - if (!group_->Initialize(disallowed_extensions, allowed_extensions)) { |
| + // Initialization for a constrained set of extensions constructs a local |
| + // set of validators, that override those of the sharing group. |
| + if (0 == strcmp(allowed_extensions, "*")) { |
|
Ken Russell (switch to Gerrit)
2011/09/15 23:57:27
Shouldn't this comparison be "0 != strcmp(...)"? W
Jeff Timanus
2011/09/16 15:00:17
Yes!
Done.
|
| + local_feature_info_.reset(new FeatureInfo()); |
| + if (!local_feature_info_->Initialize(allowed_extensions)) { |
| + LOG(ERROR) << "GpuScheduler::InitializeCommon failed because local " |
| + << "FeatureInfo overrides failed to initialize."; |
| + Destroy(); |
| + return false; |
| + } |
| + } |
| + |
| + // The shared group should always be initialized with all extensions. |
| + // This ensures that all contexts will have access to all of the exentsions |
| + // they may need. |
| + if (!group_->Initialize(disallowed_extensions, "*")) { |
| LOG(ERROR) << "GpuScheduler::InitializeCommon failed because group " |
| << "failed to initialize."; |
| Destroy(); |
| @@ -1749,7 +1776,7 @@ |
| vertex_attrib_manager_.Initialize(group_->max_vertex_attribs()); |
| util_.set_num_compressed_texture_formats( |
| - validators_->compressed_texture_format.GetValues().size()); |
| + validators()->compressed_texture_format.GetValues().size()); |
| if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { |
| // We have to enable vertex array 0 on OpenGL or it won't render. Note that |
| @@ -1951,9 +1978,9 @@ |
| void GLES2DecoderImpl::UpdateCapabilities() { |
| util_.set_num_compressed_texture_formats( |
| - validators_->compressed_texture_format.GetValues().size()); |
| + validators()->compressed_texture_format.GetValues().size()); |
| util_.set_num_shader_binary_formats( |
| - validators_->shader_binary_format.GetValues().size()); |
| + validators()->shader_binary_format.GetValues().size()); |
| } |
| bool GLES2DecoderImpl::InitializeShaderTranslator() { |
| @@ -3005,30 +3032,30 @@ |
| } |
| return true; |
| case GL_COMPRESSED_TEXTURE_FORMATS: |
| - *num_written = validators_->compressed_texture_format.GetValues().size(); |
| + *num_written = validators()->compressed_texture_format.GetValues().size(); |
| if (params) { |
| for (GLint ii = 0; ii < *num_written; ++ii) { |
| - params[ii] = validators_->compressed_texture_format.GetValues()[ii]; |
| + params[ii] = validators()->compressed_texture_format.GetValues()[ii]; |
| } |
| } |
| return true; |
| case GL_NUM_COMPRESSED_TEXTURE_FORMATS: |
| *num_written = 1; |
| if (params) { |
| - *params = validators_->compressed_texture_format.GetValues().size(); |
| + *params = validators()->compressed_texture_format.GetValues().size(); |
| } |
| return true; |
| case GL_NUM_SHADER_BINARY_FORMATS: |
| *num_written = 1; |
| if (params) { |
| - *params = validators_->shader_binary_format.GetValues().size(); |
| + *params = validators()->shader_binary_format.GetValues().size(); |
| } |
| return true; |
| case GL_SHADER_BINARY_FORMATS: |
| - *num_written = validators_->shader_binary_format.GetValues().size(); |
| + *num_written = validators()->shader_binary_format.GetValues().size(); |
| if (params) { |
| for (GLint ii = 0; ii < *num_written; ++ii) { |
| - params[ii] = validators_->shader_binary_format.GetValues()[ii]; |
| + params[ii] = validators()->shader_binary_format.GetValues()[ii]; |
| } |
| } |
| return true; |
| @@ -4399,7 +4426,7 @@ |
| GLenum mode = static_cast<GLenum>(c.mode); |
| GLint first = static_cast<GLint>(c.first); |
| GLsizei count = static_cast<GLsizei>(c.count); |
| - if (!validators_->draw_mode.IsValid(mode)) { |
| + if (!validators()->draw_mode.IsValid(mode)) { |
| SetGLError(GL_INVALID_ENUM, "glDrawArrays: mode GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| @@ -4468,11 +4495,11 @@ |
| SetGLError(GL_INVALID_VALUE, "glDrawElements: offset < 0"); |
| return error::kNoError; |
| } |
| - if (!validators_->draw_mode.IsValid(mode)) { |
| + if (!validators()->draw_mode.IsValid(mode)) { |
| SetGLError(GL_INVALID_ENUM, "glDrawElements: mode GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| - if (!validators_->index_type.IsValid(type)) { |
| + if (!validators()->index_type.IsValid(type)) { |
| SetGLError(GL_INVALID_ENUM, "glDrawElements: type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| @@ -5020,12 +5047,12 @@ |
| GLsizei stride = c.stride; |
| GLsizei offset = c.offset; |
| const void* ptr = reinterpret_cast<const void*>(offset); |
| - if (!validators_->vertex_attrib_type.IsValid(type)) { |
| + if (!validators()->vertex_attrib_type.IsValid(type)) { |
| SetGLError(GL_INVALID_ENUM, |
| "glVertexAttribPointer: type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| - if (!validators_->vertex_attrib_size.IsValid(size)) { |
| + if (!validators()->vertex_attrib_size.IsValid(size)) { |
| SetGLError(GL_INVALID_VALUE, |
| "glVertexAttribPointer: size GL_INVALID_VALUE"); |
| return error::kNoError; |
| @@ -5102,11 +5129,11 @@ |
| return error::kOutOfBounds; |
| } |
| - if (!validators_->read_pixel_format.IsValid(format)) { |
| + if (!validators()->read_pixel_format.IsValid(format)) { |
| SetGLError(GL_INVALID_ENUM, "glReadPixels: format GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| - if (!validators_->pixel_type.IsValid(type)) { |
| + if (!validators()->pixel_type.IsValid(type)) { |
| SetGLError(GL_INVALID_ENUM, "glReadPixels: type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| @@ -5238,11 +5265,11 @@ |
| uint32 immediate_data_size, const gles2::PixelStorei& c) { |
| GLenum pname = c.pname; |
| GLenum param = c.param; |
| - if (!validators_->pixel_store.IsValid(pname)) { |
| + if (!validators()->pixel_store.IsValid(pname)) { |
| SetGLError(GL_INVALID_ENUM, "glPixelStorei: pname GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| - if (!validators_->pixel_store_alignment.IsValid(param)) { |
| + if (!validators()->pixel_store_alignment.IsValid(param)) { |
| SetGLError(GL_INVALID_VALUE, "glPixelSTore: param GL_INVALID_VALUE"); |
| return error::kNoError; |
| } |
| @@ -5398,7 +5425,7 @@ |
| error::Error GLES2DecoderImpl::HandleGetString( |
| uint32 immediate_data_size, const gles2::GetString& c) { |
| GLenum name = static_cast<GLenum>(c.name); |
| - if (!validators_->string_type.IsValid(name)) { |
| + if (!validators()->string_type.IsValid(name)) { |
| SetGLError(GL_INVALID_ENUM, "glGetString: name GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| @@ -5425,11 +5452,11 @@ |
| void GLES2DecoderImpl::DoBufferData( |
| GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage) { |
| - if (!validators_->buffer_target.IsValid(target)) { |
| + if (!validators()->buffer_target.IsValid(target)) { |
| SetGLError(GL_INVALID_ENUM, "glBufferData: target GL_INVALID_ENUM"); |
| return; |
| } |
| - if (!validators_->buffer_usage.IsValid(usage)) { |
| + if (!validators()->buffer_usage.IsValid(usage)) { |
| SetGLError(GL_INVALID_ENUM, "glBufferData: usage GL_INVALID_ENUM"); |
| return; |
| } |
| @@ -5527,12 +5554,12 @@ |
| GLsizei image_size, |
| const void* data) { |
| // TODO(gman): Validate image_size is correct for width, height and format. |
| - if (!validators_->texture_target.IsValid(target)) { |
| + if (!validators()->texture_target.IsValid(target)) { |
| SetGLError(GL_INVALID_ENUM, |
| "glCompressedTexImage2D: target GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| - if (!validators_->compressed_texture_format.IsValid( |
| + if (!validators()->compressed_texture_format.IsValid( |
| internal_format)) { |
| SetGLError(GL_INVALID_ENUM, |
| "glCompressedTexImage2D: internal_format GL_INVALID_ENUM"); |
| @@ -5638,12 +5665,12 @@ |
| uint32 data_size = bucket->size(); |
| GLsizei imageSize = data_size; |
| const void* data = bucket->GetData(0, data_size); |
| - if (!validators_->texture_target.IsValid(target)) { |
| + if (!validators()->texture_target.IsValid(target)) { |
| SetGLError( |
| GL_INVALID_ENUM, "glCompressedTexSubImage2D: target GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| - if (!validators_->compressed_texture_format.IsValid(format)) { |
| + if (!validators()->compressed_texture_format.IsValid(format)) { |
| SetGLError(GL_INVALID_ENUM, |
| "glCompressedTexSubImage2D: format GL_INVALID_ENUM"); |
| return error::kNoError; |
| @@ -5676,20 +5703,20 @@ |
| GLenum type, |
| const void* pixels, |
| uint32 pixels_size) { |
| - if (!validators_->texture_target.IsValid(target)) { |
| + if (!validators()->texture_target.IsValid(target)) { |
| SetGLError(GL_INVALID_ENUM, "glTexImage2D: target GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| - if (!validators_->texture_format.IsValid(internal_format)) { |
| + if (!validators()->texture_format.IsValid(internal_format)) { |
| SetGLError(GL_INVALID_ENUM, |
| "glTexImage2D: internal_format GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| - if (!validators_->texture_format.IsValid(format)) { |
| + if (!validators()->texture_format.IsValid(format)) { |
| SetGLError(GL_INVALID_ENUM, "glTexImage2D: format GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| - if (!validators_->pixel_type.IsValid(type)) { |
| + if (!validators()->pixel_type.IsValid(type)) { |
| SetGLError(GL_INVALID_ENUM, "glTexImage2D: type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| @@ -6110,7 +6137,7 @@ |
| } |
| const void* pixels = GetSharedMemoryAs<const void*>( |
| c.pixels_shm_id, c.pixels_shm_offset, data_size); |
| - if (!validators_->texture_target.IsValid(target)) { |
| + if (!validators()->texture_target.IsValid(target)) { |
| SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: target GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| @@ -6122,11 +6149,11 @@ |
| SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: height < 0"); |
| return error::kNoError; |
| } |
| - if (!validators_->texture_format.IsValid(format)) { |
| + if (!validators()->texture_format.IsValid(format)) { |
| SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: format GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| - if (!validators_->pixel_type.IsValid(type)) { |
| + if (!validators()->pixel_type.IsValid(type)) { |
| SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| @@ -6159,7 +6186,7 @@ |
| } |
| const void* pixels = GetImmediateDataAs<const void*>( |
| c, data_size, immediate_data_size); |
| - if (!validators_->texture_target.IsValid(target)) { |
| + if (!validators()->texture_target.IsValid(target)) { |
| SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: target GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| @@ -6171,11 +6198,11 @@ |
| SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: height < 0"); |
| return error::kNoError; |
| } |
| - if (!validators_->texture_format.IsValid(format)) { |
| + if (!validators()->texture_format.IsValid(format)) { |
| SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: format GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| - if (!validators_->pixel_type.IsValid(type)) { |
| + if (!validators()->pixel_type.IsValid(type)) { |
| SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| @@ -6201,7 +6228,7 @@ |
| if (result->size != 0) { |
| return error::kInvalidArguments; |
| } |
| - if (!validators_->vertex_pointer.IsValid(pname)) { |
| + if (!validators()->vertex_pointer.IsValid(pname)) { |
| SetGLError(GL_INVALID_ENUM, |
| "glGetVertexAttribPointerv: pname GL_INVALID_ENUM"); |
| return error::kNoError; |
| @@ -6334,12 +6361,12 @@ |
| if (result->success != 0) { |
| return error::kInvalidArguments; |
| } |
| - if (!validators_->shader_type.IsValid(shader_type)) { |
| + if (!validators()->shader_type.IsValid(shader_type)) { |
| SetGLError(GL_INVALID_ENUM, |
| "glGetShaderPrecisionFormat: shader_type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| - if (!validators_->shader_precision.IsValid(precision_type)) { |
| + if (!validators()->shader_precision.IsValid(precision_type)) { |
| SetGLError(GL_INVALID_ENUM, |
| "glGetShaderPrecisionFormat: precision_type GL_INVALID_ENUM"); |
| return error::kNoError; |
| @@ -6647,7 +6674,7 @@ |
| } else if (feature_str.compare("pepper3d_support_fixed_attribs") == 0) { |
| buffer_manager()->set_allow_buffers_on_multiple_targets(true); |
| // TODO(gman): decide how to remove the need for this const_cast. |
| - // I could make validators_ non const but that seems bad as this is the only |
| + // I could make validators() non const but that seems bad as this is the only |
| // place it is needed. I could make some special friend class of validators |
| // just to allow this to set them. That seems silly. I could refactor this |
| // code to use the extension mechanism or the initialization attributes to |
| @@ -6655,7 +6682,8 @@ |
| // the conformance tests pass and given that there is lots of real work that |
| // needs to be done it seems like refactoring for one to one of those |
| // methods is a very low priority. |
| - const_cast<Validators*>(validators_)->vertex_attrib_type.AddValue(GL_FIXED); |
| + const_cast<Validators*>(validators())->vertex_attrib_type.AddValue( |
| + GL_FIXED); |
| } else { |
| return error::kNoError; |
| } |