summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer
diff options
context:
space:
mode:
authorkkinnunen@nvidia.com <kkinnunen@nvidia.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-15 17:12:42 +0000
committerkkinnunen@nvidia.com <kkinnunen@nvidia.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-15 17:12:42 +0000
commit8a478b19c3493e8fc1efa63f35e85ba262bf0aae (patch)
treea2832bee4844a86cf2cfb0499071babd67c16e64 /gpu/command_buffer
parent1a196945ade3e23548a3f5f34f26b44ea6c47b5b (diff)
downloadchromium_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-xgpu/command_buffer/build_gles2_cmd_buffer.py33
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc33
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_autogen.h42
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;