Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(436)

Unified Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 11412262: gpu: Defer reads from default framebuffer when needed. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: do it in the generator Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 406f728c6ec9ae5d4313aeaa1acc792c7f4fb3af..917f4f2aa17e737ea1b0b210bc8bae2c8150e748 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -1409,6 +1409,12 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
surface_->DeferDraws();
}
+ bool ShouldDeferReads() {
+ return !offscreen_target_frame_buffer_.get() &&
+ state_.bound_read_framebuffer == NULL &&
+ surface_->DeferDraws();
+ }
+
void ForceCompileShaderIfPending(ShaderManager::ShaderInfo* info);
// Generate a member function prototype for each command in an automated and
@@ -3124,7 +3130,7 @@ bool GLES2DecoderImpl::ResizeOffscreenFrameBuffer(const gfx::Size& size) {
error::Error GLES2DecoderImpl::HandleResizeCHROMIUM(
uint32 immediate_data_size, const gles2::ResizeCHROMIUM& c) {
- if (ShouldDeferDraws())
+ if (!offscreen_target_frame_buffer_.get() && surface_->DeferDraws())
return error::kDeferCommandUntilLater;
GLuint width = static_cast<GLuint>(c.width);
@@ -4237,8 +4243,7 @@ error::Error GLES2DecoderImpl::HandleRegisterSharedIdsCHROMIUM(
}
error::Error GLES2DecoderImpl::DoClear(GLbitfield mask) {
- if (ShouldDeferDraws())
- return error::kDeferCommandUntilLater;
+ DCHECK(!ShouldDeferDraws());
if (CheckBoundFramebuffersValid("glClear")) {
UNSHIPPED_TRACE_EVENT_INSTANT2(
"test_gpu", "DoClear",
@@ -4250,12 +4255,6 @@ error::Error GLES2DecoderImpl::DoClear(GLbitfield mask) {
return error::kNoError;
}
-error::Error GLES2DecoderImpl::HandleClear(
- uint32 immediate_data_size, const gles2::Clear& c) {
- GLbitfield mask = static_cast<GLbitfield>(c.mask);
- return DoClear(mask);
-}
-
void GLES2DecoderImpl::DoFramebufferRenderbuffer(
GLenum target, GLenum attachment, GLenum renderbuffertarget,
GLuint client_renderbuffer_id) {
@@ -4504,6 +4503,7 @@ void GLES2DecoderImpl::DoBlitFramebufferEXT(
GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
GLbitfield mask, GLenum filter) {
+ DCHECK(!ShouldDeferReads() && !ShouldDeferDraws());
if (!features().chromium_framebuffer_multisample) {
SetGLError(GL_INVALID_OPERATION,
"glBlitFramebufferEXT", "function not available");
@@ -6292,6 +6292,8 @@ error::Error GLES2DecoderImpl::HandleVertexAttribDivisorANGLE(
error::Error GLES2DecoderImpl::HandleReadPixels(
uint32 immediate_data_size, const gles2::ReadPixels& c) {
+ if (ShouldDeferReads())
+ return error::kDeferCommandUntilLater;
GLint x = c.x;
GLint y = c.y;
GLsizei width = c.width;
@@ -7478,6 +7480,7 @@ void GLES2DecoderImpl::DoCopyTexImage2D(
GLsizei width,
GLsizei height,
GLint border) {
+ DCHECK(!ShouldDeferReads());
TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
if (!info) {
SetGLError(GL_INVALID_OPERATION,
@@ -7580,6 +7583,7 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D(
GLint y,
GLsizei width,
GLsizei height) {
+ DCHECK(!ShouldDeferReads());
TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
if (!info) {
SetGLError(GL_INVALID_OPERATION,
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation_impl_autogen.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698