summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorjamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-13 11:13:07 +0000
committerjamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-13 11:13:07 +0000
commit5dfc457b046705366bc8e58f5006b4e27c58f5c6 (patch)
treec7571ceaf0c4dc7ebc32b978b89950630ad540b7 /gpu
parentdf4c9c7f61a4de12ccc7e8020bcca9dcb5454192 (diff)
downloadchromium_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')
-rw-r--r--gpu/GLES2/gl2chromium_autogen.h1
-rwxr-xr-xgpu/command_buffer/build_gles2_cmd_buffer.py6
-rw-r--r--gpu/command_buffer/client/gles2_c_lib_autogen.h5
-rw-r--r--gpu/command_buffer/client/gles2_cmd_helper_autogen.h8
-rw-r--r--gpu/command_buffer/client/gles2_implementation_autogen.h2
-rw-r--r--gpu/command_buffer/client/gles2_implementation_impl_autogen.h7
-rw-r--r--gpu/command_buffer/client/gles2_implementation_unittest_autogen.h11
-rw-r--r--gpu/command_buffer/client/gles2_interface_autogen.h1
-rw-r--r--gpu/command_buffer/client/gles2_interface_stub_autogen.h1
-rw-r--r--gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h2
-rw-r--r--gpu/command_buffer/client/gles2_trace_implementation_autogen.h1
-rw-r--r--gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h5
-rw-r--r--gpu/command_buffer/cmd_buffer_functions.txt1
-rw-r--r--gpu/command_buffer/common/gles2_cmd_format_autogen.h30
-rw-r--r--gpu/command_buffer/common/gles2_cmd_format_test_autogen.h12
-rw-r--r--gpu/command_buffer/common/gles2_cmd_ids_autogen.h1
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc12
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) {