diff options
author | piman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-30 10:30:44 +0000 |
---|---|---|
committer | piman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-30 10:30:44 +0000 |
commit | 09e1727e620979f016f6b78748f7085e5a00838a (patch) | |
tree | 813b47043aaca2c75630bf24a279e86f0b9b5f22 /gpu/command_buffer/build_gles2_cmd_buffer.py | |
parent | 316248b10045aaecfcff81c509a3448d57518118 (diff) | |
download | chromium_src-09e1727e620979f016f6b78748f7085e5a00838a.zip chromium_src-09e1727e620979f016f6b78748f7085e5a00838a.tar.gz chromium_src-09e1727e620979f016f6b78748f7085e5a00838a.tar.bz2 |
gpu: Defer reads from default framebuffer when needed.
On some platforms, we want to unschedule after a swap until the ack, but the
DeferDraws mechanism allows us to delay the unschedule until we actually need to
access the back buffer. Up to now, only commands that *write* to the framebuffer
were considered, however we also need to consider *reads*. This fixes that.
BUG=None
Review URL: https://chromiumcodereview.appspot.com/11412262
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@170435 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/build_gles2_cmd_buffer.py')
-rwxr-xr-x | gpu/command_buffer/build_gles2_cmd_buffer.py | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index ecd62a8..da321b2 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py @@ -1184,6 +1184,8 @@ _FUNCTION_INFO = { 'unit_test': False, 'extension': True, 'pepper_interface': 'FramebufferBlit', + 'defer_reads': True, + 'defer_draws': True, }, 'BufferData': { 'type': 'Manual', @@ -1203,8 +1205,8 @@ _FUNCTION_INFO = { 'result': ['GLenum'], }, 'Clear': { - 'type': 'Manual', - 'cmd_args': 'GLbitfield mask' + 'decoder_func': 'DoClear', + 'defer_draws': True, }, 'ClearColor': { 'type': 'StateSet', @@ -1263,9 +1265,11 @@ _FUNCTION_INFO = { 'CopyTexImage2D': { 'decoder_func': 'DoCopyTexImage2D', 'unit_test': False, + 'defer_reads': True, }, 'CopyTexSubImage2D': { 'decoder_func': 'DoCopyTexSubImage2D', + 'defer_reads': True, }, 'CreateProgram': { 'type': 'Create', @@ -1396,12 +1400,14 @@ _FUNCTION_INFO = { 'DrawArrays': { 'type': 'Manual', 'cmd_args': 'GLenumDrawMode mode, GLint first, GLsizei count', + 'defer_draws': True, }, 'DrawElements': { 'type': 'Manual', 'cmd_args': 'GLenumDrawMode mode, GLsizei count, ' 'GLenumIndexType type, GLuint index_offset', - 'client_test': False + 'client_test': False, + 'defer_draws': True, }, 'Enable': { 'decoder_func': 'DoEnable', @@ -1794,6 +1800,7 @@ _FUNCTION_INFO = { 'uint32 pixels_shm_id, uint32 pixels_shm_offset, ' 'uint32 result_shm_id, uint32 result_shm_offset', 'result': ['uint32'], + 'defer_reads': True, }, 'RegisterSharedIdsCHROMIUM': { 'type': 'Custom', @@ -2097,6 +2104,7 @@ _FUNCTION_INFO = { 'extension': True, 'unit_test': False, 'pepper_interface': 'InstancedArrays', + 'defer_draws': True, }, 'DrawElementsInstancedANGLE': { 'type': 'Manual', @@ -2106,6 +2114,7 @@ _FUNCTION_INFO = { 'unit_test': False, 'client_test': False, 'pepper_interface': 'InstancedArrays', + 'defer_draws': True, }, 'VertexAttribDivisorANGLE': { 'type': 'Manual', @@ -2567,6 +2576,7 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) file.Write( " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name) + self.WriteHandlerDeferReadWrite(func, file); if len(func.GetOriginalArgs()) > 0: last_arg = func.GetLastOriginalArg() all_but_last_arg = func.GetOriginalArgs()[:-1] @@ -2586,6 +2596,7 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) file.Write( " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name) + self.WriteHandlerDeferReadWrite(func, file); last_arg = func.GetLastOriginalArg() all_but_last_arg = func.GetOriginalArgs()[:-1] for arg in all_but_last_arg: @@ -2604,6 +2615,7 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) file.Write( " uint32 immediate_data_size, const gles2::%s& c) {\n" % func.name) + self.WriteHandlerDeferReadWrite(func, file); last_arg = func.GetLastOriginalArg() all_but_last_arg = func.GetOriginalArgs()[:-1] for arg in all_but_last_arg: @@ -2616,6 +2628,20 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write("}\n") file.Write("\n") + def WriteHandlerDeferReadWrite(self, func, file): + """Writes the code to handle deferring reads or writes.""" + defer_reads = func.GetInfo('defer_reads') + defer_draws = func.GetInfo('defer_draws') + conditions = [] + if defer_draws: + conditions.append('ShouldDeferDraws()'); + if defer_reads: + conditions.append('ShouldDeferReads()'); + if not conditions: + return + file.Write(" if (%s)\n" % ' || '.join(conditions)) + file.Write(" return error::kDeferCommandUntilLater;\n") + def WriteValidUnitTest(self, func, file, test, extra = {}): """Writes a valid unit test.""" if func.GetInfo('expectation') == False: |