diff options
author | kkinnunen@nvidia.com <kkinnunen@nvidia.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-15 17:12:42 +0000 |
---|---|---|
committer | kkinnunen@nvidia.com <kkinnunen@nvidia.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-15 17:12:42 +0000 |
commit | 8a478b19c3493e8fc1efa63f35e85ba262bf0aae (patch) | |
tree | a2832bee4844a86cf2cfb0499071babd67c16e64 /gpu/command_buffer | |
parent | 1a196945ade3e23548a3f5f34f26b44ea6c47b5b (diff) | |
download | chromium_src-8a478b19c3493e8fc1efa63f35e85ba262bf0aae.zip chromium_src-8a478b19c3493e8fc1efa63f35e85ba262bf0aae.tar.gz chromium_src-8a478b19c3493e8fc1efa63f35e85ba262bf0aae.tar.bz2 |
Generate feature info extension flag check for GL extension functions
Generate feature info extension flag check for GL extension functions,
if the function is marked with optional 'extension_flag':
'extension_flag_name' property. This implies current 'extension': True
behavior.
This moves few extension flag checks from gles2_cmd_decoder.cc to
gles2_cmd_decoder_autogen.h
BUG=373272
Review URL: https://codereview.chromium.org/275483007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@270707 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer')
-rwxr-xr-x | gpu/command_buffer/build_gles2_cmd_buffer.py | 33 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 33 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h | 42 |
3 files changed, 69 insertions, 39 deletions
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index c7ec3af..470ff29 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py @@ -1274,6 +1274,11 @@ _PEPPER_INTERFACES = [ # first_element_only: For PUT types, True if only the first element of an # array is used and we end up calling the single value # corresponding function. eg. TexParameteriv -> TexParameteri +# extension: Function is an extension to GL and should not be exposed to +# pepper unless pepper_interface is defined. +# extension_flag: Function is an extension and should be enabled only when +# the corresponding feature info flag is enabled. Implies +# 'extension': True. _FUNCTION_INFO = { 'ActiveTexture': { @@ -1318,7 +1323,7 @@ _FUNCTION_INFO = { 'BlitFramebufferCHROMIUM': { 'decoder_func': 'DoBlitFramebufferCHROMIUM', 'unit_test': False, - 'extension': True, + 'extension_flag': 'chromium_framebuffer_multisample', 'pepper_interface': 'FramebufferBlit', 'pepper_name': 'BlitFramebufferEXT', 'defer_reads': True, @@ -1617,7 +1622,7 @@ _FUNCTION_INFO = { 'gl_test_func': 'glFramebufferTexture2DMultisampleEXT', 'expectation': False, 'unit_test': False, - 'extension': True, + 'extension_flag': 'multisampled_render_to_texture', 'trace_level': 1, }, 'GenerateMipmap': { @@ -1983,7 +1988,7 @@ _FUNCTION_INFO = { 'gl_test_func': 'glRenderbufferStorageMultisampleCHROMIUM', 'expectation': False, 'unit_test': False, - 'extension': True, + 'extension_flag': 'chromium_framebuffer_multisample', 'pepper_interface': 'FramebufferMultisample', 'pepper_name': 'RenderbufferStorageMultisampleEXT', }, @@ -1994,7 +1999,7 @@ _FUNCTION_INFO = { 'gl_test_func': 'glRenderbufferStorageMultisampleEXT', 'expectation': False, 'unit_test': False, - 'extension': True, + 'extension_flag': 'multisampled_render_to_texture', }, 'ReadPixels': { 'cmd_comment': @@ -2308,6 +2313,8 @@ _FUNCTION_INFO = { 'count': 1, 'client_test': False, 'unit_test': False, + # could use 'extension_flag': 'ext_draw_buffers' but currently expected to + # work without. 'extension': True, 'pepper_interface': 'DrawBuffers', }, @@ -2530,7 +2537,7 @@ _FUNCTION_INFO = { 'decoder_func': 'DoDiscardFramebufferEXT', 'unit_test': False, 'client_test': False, - 'extension': True, + 'extension_flag': 'ext_discard_framebuffer', }, 'LoseContextCHROMIUM': { 'type': 'Manual', @@ -2847,6 +2854,7 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write( " uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" % func.name) + self.WriteHandlerExtensionCheck(func, file) self.WriteHandlerDeferReadWrite(func, file); if len(func.GetOriginalArgs()) > 0: last_arg = func.GetLastOriginalArg() @@ -2868,6 +2876,7 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write( " uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" % func.name) + self.WriteHandlerExtensionCheck(func, file) self.WriteHandlerDeferReadWrite(func, file); last_arg = func.GetLastOriginalArg() all_but_last_arg = func.GetOriginalArgs()[:-1] @@ -2888,6 +2897,7 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write( " uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" % func.name) + self.WriteHandlerExtensionCheck(func, file) self.WriteHandlerDeferReadWrite(func, file); last_arg = func.GetLastOriginalArg() all_but_last_arg = func.GetOriginalArgs()[:-1] @@ -2901,6 +2911,14 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write("}\n") file.Write("\n") + def WriteHandlerExtensionCheck(self, func, file): + if func.GetInfo('extension_flag'): + file.Write(" if (!features().%s) {\n" % func.GetInfo('extension_flag')) + file.Write(" LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, \"gl%s\"," + " \"function not available\");\n" % func.original_name) + file.Write(" return error::kNoError;") + file.Write(" }\n\n") + def WriteHandlerDeferReadWrite(self, func, file): """Writes the code to handle deferring reads or writes.""" defer_draws = func.GetInfo('defer_draws') @@ -6699,8 +6717,11 @@ class Function(object): """Adds an info.""" self.info[name] = value + def IsExtension(self): + return self.GetInfo('extension') or self.GetInfo('extension_flag') + def IsCoreGLFunction(self): - return (not self.GetInfo('extension') and + return (not self.IsExtension() and not self.GetInfo('pepper_interface')) def InPepperInterface(self, interface): diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 65fc86d..85a1e01 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -4116,13 +4116,6 @@ void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) { void GLES2DecoderImpl::DoDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum* attachments) { - if (!features().ext_discard_framebuffer) { - LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, - "glDiscardFramebufferEXT", - "function not available"); - return; - } - Framebuffer* framebuffer = GetFramebufferInfoForTarget(GL_FRAMEBUFFER); @@ -5100,12 +5093,6 @@ void GLES2DecoderImpl::DoFramebufferTexture2D( void GLES2DecoderImpl::DoFramebufferTexture2DMultisample( GLenum target, GLenum attachment, GLenum textarget, GLuint client_texture_id, GLint level, GLsizei samples) { - if (!features().multisampled_render_to_texture) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glFramebufferTexture2DMultisample", "function not available"); - return; - } DoFramebufferTexture2DCommon( "glFramebufferTexture2DMultisample", target, attachment, textarget, client_texture_id, level, samples); @@ -5238,12 +5225,6 @@ void GLES2DecoderImpl::DoBlitFramebufferCHROMIUM( GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { DCHECK(!ShouldDeferReads() && !ShouldDeferDraws()); - if (!features().chromium_framebuffer_multisample) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glBlitFramebufferCHROMIUM", "function not available"); - return; - } if (!CheckBoundFramebuffersValid("glBlitFramebufferCHROMIUM")) { return; @@ -5343,13 +5324,6 @@ bool GLES2DecoderImpl::ValidateRenderbufferStorageMultisample( void GLES2DecoderImpl::DoRenderbufferStorageMultisampleCHROMIUM( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { - if (!features().chromium_framebuffer_multisample) { - LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, - "glRenderbufferStorageMultisampleCHROMIUM", - "function not available"); - return; - } - Renderbuffer* renderbuffer = GetRenderbufferInfoForTarget(GL_RENDERBUFFER); if (!renderbuffer) { LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, @@ -5396,13 +5370,6 @@ void GLES2DecoderImpl::DoRenderbufferStorageMultisampleCHROMIUM( void GLES2DecoderImpl::DoRenderbufferStorageMultisampleEXT( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { - if (!features().multisampled_render_to_texture) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glRenderbufferStorageMultisampleEXT", "function not available"); - return; - } - Renderbuffer* renderbuffer = GetRenderbufferInfoForTarget(GL_RENDERBUFFER); if (!renderbuffer) { LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h index d339636..17ce8e3 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h @@ -2711,6 +2711,13 @@ error::Error GLES2DecoderImpl::HandleViewport(uint32_t immediate_data_size, error::Error GLES2DecoderImpl::HandleBlitFramebufferCHROMIUM( uint32_t immediate_data_size, const gles2::cmds::BlitFramebufferCHROMIUM& c) { + if (!features().chromium_framebuffer_multisample) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glBlitFramebufferCHROMIUM", + "function not available"); + return error::kNoError; + } + error::Error error; error = WillAccessBoundFramebufferForDraw(); if (error != error::kNoError) @@ -2741,6 +2748,13 @@ error::Error GLES2DecoderImpl::HandleBlitFramebufferCHROMIUM( error::Error GLES2DecoderImpl::HandleRenderbufferStorageMultisampleCHROMIUM( uint32_t immediate_data_size, const gles2::cmds::RenderbufferStorageMultisampleCHROMIUM& c) { + if (!features().chromium_framebuffer_multisample) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glRenderbufferStorageMultisampleCHROMIUM", + "function not available"); + return error::kNoError; + } + GLenum target = static_cast<GLenum>(c.target); GLsizei samples = static_cast<GLsizei>(c.samples); GLenum internalformat = static_cast<GLenum>(c.internalformat); @@ -2783,6 +2797,13 @@ error::Error GLES2DecoderImpl::HandleRenderbufferStorageMultisampleCHROMIUM( error::Error GLES2DecoderImpl::HandleRenderbufferStorageMultisampleEXT( uint32_t immediate_data_size, const gles2::cmds::RenderbufferStorageMultisampleEXT& c) { + if (!features().multisampled_render_to_texture) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glRenderbufferStorageMultisampleEXT", + "function not available"); + return error::kNoError; + } + GLenum target = static_cast<GLenum>(c.target); GLsizei samples = static_cast<GLsizei>(c.samples); GLenum internalformat = static_cast<GLenum>(c.internalformat); @@ -2822,6 +2843,13 @@ error::Error GLES2DecoderImpl::HandleRenderbufferStorageMultisampleEXT( error::Error GLES2DecoderImpl::HandleFramebufferTexture2DMultisampleEXT( uint32_t immediate_data_size, const gles2::cmds::FramebufferTexture2DMultisampleEXT& c) { + if (!features().multisampled_render_to_texture) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glFramebufferTexture2DMultisampleEXT", + "function not available"); + return error::kNoError; + } + GLenum target = static_cast<GLenum>(c.target); GLenum attachment = static_cast<GLenum>(c.attachment); GLenum textarget = static_cast<GLenum>(c.textarget); @@ -3310,6 +3338,13 @@ error::Error GLES2DecoderImpl::HandleTraceEndCHROMIUM( error::Error GLES2DecoderImpl::HandleDiscardFramebufferEXT( uint32_t immediate_data_size, const gles2::cmds::DiscardFramebufferEXT& c) { + if (!features().ext_discard_framebuffer) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glDiscardFramebufferEXT", + "function not available"); + return error::kNoError; + } + GLenum target = static_cast<GLenum>(c.target); GLsizei count = static_cast<GLsizei>(c.count); uint32_t data_size; @@ -3333,6 +3368,13 @@ error::Error GLES2DecoderImpl::HandleDiscardFramebufferEXT( error::Error GLES2DecoderImpl::HandleDiscardFramebufferEXTImmediate( uint32_t immediate_data_size, const gles2::cmds::DiscardFramebufferEXTImmediate& c) { + if (!features().ext_discard_framebuffer) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glDiscardFramebufferEXT", + "function not available"); + return error::kNoError; + } + GLenum target = static_cast<GLenum>(c.target); GLsizei count = static_cast<GLsizei>(c.count); uint32_t data_size; |