diff options
author | jamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-13 11:13:07 +0000 |
---|---|---|
committer | jamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-13 11:13:07 +0000 |
commit | 5dfc457b046705366bc8e58f5006b4e27c58f5c6 (patch) | |
tree | c7571ceaf0c4dc7ebc32b978b89950630ad540b7 /gpu | |
parent | df4c9c7f61a4de12ccc7e8020bcca9dcb5454192 (diff) | |
download | chromium_src-5dfc457b046705366bc8e58f5006b4e27c58f5c6.zip chromium_src-5dfc457b046705366bc8e58f5006b4e27c58f5c6.tar.gz chromium_src-5dfc457b046705366bc8e58f5006b4e27c58f5c6.tar.bz2 |
Add GL entry points for DiscardBackbufferCHROMIUM
This adds and uses a GL command buffer command for DiscardBackbufferCHROMIUM
instead of having a WebGraphicsContext3D entry point + common/ IPC message.
This is used to deallocate, if possible, the backbuffer when no longer in use.
BUG=181120
Review URL: https://codereview.chromium.org/104823005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@240583 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
17 files changed, 106 insertions, 0 deletions
diff --git a/gpu/GLES2/gl2chromium_autogen.h b/gpu/GLES2/gl2chromium_autogen.h index c18386b..53e5728 100644 --- a/gpu/GLES2/gl2chromium_autogen.h +++ b/gpu/GLES2/gl2chromium_autogen.h @@ -237,6 +237,7 @@ #define glInsertSyncPointCHROMIUM GLES2_GET_FUN(InsertSyncPointCHROMIUM) #define glWaitSyncPointCHROMIUM GLES2_GET_FUN(WaitSyncPointCHROMIUM) #define glDrawBuffersEXT GLES2_GET_FUN(DrawBuffersEXT) +#define glDiscardBackbufferCHROMIUM GLES2_GET_FUN(DiscardBackbufferCHROMIUM) #endif // GPU_GLES2_GL2CHROMIUM_AUTOGEN_H_ diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index 0e1ce86..49330b4 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py @@ -2481,6 +2481,12 @@ _FUNCTION_INFO = { 'extension': True, 'chromium': True, }, + 'DiscardBackbufferCHROMIUM': { + 'type': 'Custom', + 'impl_func': True, + 'extension': True, + 'chromium': True, + }, } diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h index 4f7ee07..f2eb837 100644 --- a/gpu/command_buffer/client/gles2_c_lib_autogen.h +++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h @@ -764,6 +764,9 @@ void GLES2WaitSyncPointCHROMIUM(GLuint sync_point) { void GLES2DrawBuffersEXT(GLsizei count, const GLenum* bufs) { gles2::GetGLContext()->DrawBuffersEXT(count, bufs); } +void GLES2DiscardBackbufferCHROMIUM() { + gles2::GetGLContext()->DiscardBackbufferCHROMIUM(); +} namespace gles2 { @@ -1121,6 +1124,8 @@ extern const NameToFunc g_gles2_function_table[] = { glWaitSyncPointCHROMIUM), }, { "glDrawBuffersEXT", reinterpret_cast<GLES2FunctionPointer>( glDrawBuffersEXT), }, + { "glDiscardBackbufferCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( + glDiscardBackbufferCHROMIUM), }, { NULL, NULL, }, }; diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h index 625ee89..76a9f4a 100644 --- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h +++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h @@ -2014,5 +2014,13 @@ } } + void DiscardBackbufferCHROMIUM() { + gles2::cmds::DiscardBackbufferCHROMIUM* c = + GetCmdSpace<gles2::cmds::DiscardBackbufferCHROMIUM>(); + if (c) { + c->Init(); + } + } + #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_CMD_HELPER_AUTOGEN_H_ diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h index b578914..5703956 100644 --- a/gpu/command_buffer/client/gles2_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_autogen.h @@ -555,5 +555,7 @@ virtual void WaitSyncPointCHROMIUM(GLuint sync_point) OVERRIDE; virtual void DrawBuffersEXT(GLsizei count, const GLenum* bufs) OVERRIDE; +virtual void DiscardBackbufferCHROMIUM() OVERRIDE; + #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_AUTOGEN_H_ diff --git a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h index fb6b362..3b92eb2 100644 --- a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h @@ -1759,5 +1759,12 @@ void GLES2Implementation::DrawBuffersEXT(GLsizei count, const GLenum* bufs) { CheckGLError(); } +void GLES2Implementation::DiscardBackbufferCHROMIUM() { + GPU_CLIENT_SINGLE_THREAD_CHECK(); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDiscardBackbufferCHROMIUM(" << ")"); // NOLINT + helper_->DiscardBackbufferCHROMIUM(); + CheckGLError(); +} + #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_IMPL_AUTOGEN_H_ diff --git a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h index af49f42..38e32a6 100644 --- a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h @@ -1862,5 +1862,16 @@ TEST_F(GLES2ImplementationTest, DrawBuffersEXT) { gl_->DrawBuffersEXT(1, &data[0][0]); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } + +TEST_F(GLES2ImplementationTest, DiscardBackbufferCHROMIUM) { + struct Cmds { + cmds::DiscardBackbufferCHROMIUM cmd; + }; + Cmds expected; + expected.cmd.Init(); + + gl_->DiscardBackbufferCHROMIUM(); + EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); +} #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_UNITTEST_AUTOGEN_H_ diff --git a/gpu/command_buffer/client/gles2_interface_autogen.h b/gpu/command_buffer/client/gles2_interface_autogen.h index 8b8f74f..029bf69 100644 --- a/gpu/command_buffer/client/gles2_interface_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_autogen.h @@ -322,5 +322,6 @@ virtual void LoseContextCHROMIUM(GLenum current, GLenum other) = 0; virtual GLuint InsertSyncPointCHROMIUM() = 0; virtual void WaitSyncPointCHROMIUM(GLuint sync_point) = 0; virtual void DrawBuffersEXT(GLsizei count, const GLenum* bufs) = 0; +virtual void DiscardBackbufferCHROMIUM() = 0; #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_INTERFACE_AUTOGEN_H_ diff --git a/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_autogen.h index 7e21389..59c0ce9 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_autogen.h @@ -353,5 +353,6 @@ virtual void LoseContextCHROMIUM(GLenum current, GLenum other) OVERRIDE; virtual GLuint InsertSyncPointCHROMIUM() OVERRIDE; virtual void WaitSyncPointCHROMIUM(GLuint sync_point) OVERRIDE; virtual void DrawBuffersEXT(GLsizei count, const GLenum* bufs) OVERRIDE; +virtual void DiscardBackbufferCHROMIUM() OVERRIDE; #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_INTERFACE_STUB_AUTOGEN_H_ diff --git a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h index d17a6ad..e6a26d4 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h @@ -665,5 +665,7 @@ void GLES2InterfaceStub::WaitSyncPointCHROMIUM(GLuint /* sync_point */) { void GLES2InterfaceStub::DrawBuffersEXT( GLsizei /* count */, const GLenum* /* bufs */) { } +void GLES2InterfaceStub::DiscardBackbufferCHROMIUM() { +} #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_INTERFACE_STUB_IMPL_AUTOGEN_H_ diff --git a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h index 9d42f58..d811db5 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h @@ -353,5 +353,6 @@ virtual void LoseContextCHROMIUM(GLenum current, GLenum other) OVERRIDE; virtual GLuint InsertSyncPointCHROMIUM() OVERRIDE; virtual void WaitSyncPointCHROMIUM(GLuint sync_point) OVERRIDE; virtual void DrawBuffersEXT(GLsizei count, const GLenum* bufs) OVERRIDE; +virtual void DiscardBackbufferCHROMIUM() OVERRIDE; #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_TRACE_IMPLEMENTATION_AUTOGEN_H_ diff --git a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h index e3d7c78..49d7ab2 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h @@ -1237,5 +1237,10 @@ void GLES2TraceImplementation::DrawBuffersEXT( gl_->DrawBuffersEXT(count, bufs); } +void GLES2TraceImplementation::DiscardBackbufferCHROMIUM() { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DiscardBackbufferCHROMIUM"); + gl_->DiscardBackbufferCHROMIUM(); +} + #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_TRACE_IMPLEMENTATION_IMPL_AUTOGEN_H_ diff --git a/gpu/command_buffer/cmd_buffer_functions.txt b/gpu/command_buffer/cmd_buffer_functions.txt index 00505f3..eeb4760 100644 --- a/gpu/command_buffer/cmd_buffer_functions.txt +++ b/gpu/command_buffer/cmd_buffer_functions.txt @@ -219,5 +219,6 @@ GL_APICALL void GL_APIENTRY glLoseContextCHROMIUM (GLenum current, GLenu GL_APICALL GLuint GL_APIENTRY glInsertSyncPointCHROMIUM (void); GL_APICALL void GL_APIENTRY glWaitSyncPointCHROMIUM (GLuint sync_point); GL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei count, const GLenum* bufs); +GL_APICALL void GL_APIENTRY glDiscardBackbufferCHROMIUM (void); diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h index b8ff951..248ad46 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h @@ -10596,6 +10596,36 @@ COMPILE_ASSERT(offsetof(DrawBuffersEXTImmediate, header) == 0, COMPILE_ASSERT(offsetof(DrawBuffersEXTImmediate, count) == 4, OffsetOf_DrawBuffersEXTImmediate_count_not_4); +struct DiscardBackbufferCHROMIUM { + typedef DiscardBackbufferCHROMIUM ValueType; + static const CommandId kCmdId = kDiscardBackbufferCHROMIUM; + static const cmd::ArgFlags kArgFlags = cmd::kFixed; + + static uint32 ComputeSize() { + return static_cast<uint32>(sizeof(ValueType)); // NOLINT + } + + void SetHeader() { + header.SetCmd<ValueType>(); + } + + void Init() { + SetHeader(); + } + + void* Set(void* cmd) { + static_cast<ValueType*>(cmd)->Init(); + return NextCmdAddress<ValueType>(cmd); + } + + gpu::CommandHeader header; +}; + +COMPILE_ASSERT(sizeof(DiscardBackbufferCHROMIUM) == 4, + Sizeof_DiscardBackbufferCHROMIUM_is_not_4); +COMPILE_ASSERT(offsetof(DiscardBackbufferCHROMIUM, header) == 0, + OffsetOf_DiscardBackbufferCHROMIUM_header_not_0); + #endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_AUTOGEN_H_ diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h index b3d9380..9672db4 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h @@ -4474,5 +4474,17 @@ TEST_F(GLES2FormatTest, DrawBuffersEXTImmediate) { // TODO(gman): Check that data was inserted; } +TEST_F(GLES2FormatTest, DiscardBackbufferCHROMIUM) { + cmds::DiscardBackbufferCHROMIUM& cmd = + *GetBufferAs<cmds::DiscardBackbufferCHROMIUM>(); + void* next_cmd = cmd.Set( + &cmd); + EXPECT_EQ(static_cast<uint32>(cmds::DiscardBackbufferCHROMIUM::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); + CheckBytesWrittenMatchesExpectedSize( + next_cmd, sizeof(cmd)); +} + #endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_TEST_AUTOGEN_H_ diff --git a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h index 371e576..e26e8d2 100644 --- a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h @@ -244,6 +244,7 @@ OP(WaitSyncPointCHROMIUM) /* 487 */ \ OP(DrawBuffersEXT) /* 488 */ \ OP(DrawBuffersEXTImmediate) /* 489 */ \ + OP(DiscardBackbufferCHROMIUM) /* 490 */ \ enum CommandId { kStartPoint = cmd::kLastCommonId, // All GLES2 commands start after this. diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 575a1b5..a68cd66 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -9298,6 +9298,18 @@ error::Error GLES2DecoderImpl::HandleWaitSyncPointCHROMIUM( error::kNoError : error::kDeferCommandUntilLater; } +error::Error GLES2DecoderImpl::HandleDiscardBackbufferCHROMIUM( + uint32 immediate_data_size, const cmds::DiscardBackbufferCHROMIUM& c) { + if (surface_->DeferDraws()) + return error::kDeferCommandUntilLater; + if (!surface_->SetBackbufferAllocation(false)) + return error::kLostContext; + backbuffer_needs_clear_bits_ |= GL_COLOR_BUFFER_BIT; + backbuffer_needs_clear_bits_ |= GL_DEPTH_BUFFER_BIT; + backbuffer_needs_clear_bits_ |= GL_STENCIL_BUFFER_BIT; + return error::kNoError; +} + bool GLES2DecoderImpl::GenQueriesEXTHelper( GLsizei n, const GLuint* client_ids) { for (GLsizei ii = 0; ii < n; ++ii) { |