diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-28 00:36:27 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-28 00:36:27 +0000 |
commit | 07a0cc3cd3ebb314f81c18e3c64ae1f270fd6415 (patch) | |
tree | 6d2373437eb2bb86331169670b0359b5fc43d5e4 /gpu/command_buffer/service | |
parent | 5e2ea3a59f54c44901457f16d58f580dbdb5489f (diff) | |
download | chromium_src-07a0cc3cd3ebb314f81c18e3c64ae1f270fd6415.zip chromium_src-07a0cc3cd3ebb314f81c18e3c64ae1f270fd6415.tar.gz chromium_src-07a0cc3cd3ebb314f81c18e3c64ae1f270fd6415.tar.bz2 |
Make CopyTextureCHROMIUM restore its own state
BUG=none
Review URL: https://codereview.chromium.org/12315051
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@185085 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/service')
3 files changed, 82 insertions, 57 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc index cdf2f30..3679a1e 100644 --- a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc +++ b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc @@ -7,6 +7,7 @@ #include "base/basictypes.h" #include "gpu/command_buffer/common/types.h" #include "gpu/command_buffer/service/gl_utils.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder.h" #define SHADER0(Src) \ "#ifdef GL_ES\n"\ @@ -142,7 +143,10 @@ const char* GetShaderSource(ShaderId shader) { } // namespace -void CopyTextureCHROMIUMResourceManager::Initialize() { +namespace gpu { + +void CopyTextureCHROMIUMResourceManager::Initialize( + const gles2::GLES2Decoder* decoder) { COMPILE_ASSERT( kVertexPositionAttrib == 0u || kVertexTextureAttrib == 0u, CopyTexture_One_of_these_attribs_must_be_0); @@ -159,6 +163,7 @@ void CopyTextureCHROMIUMResourceManager::Initialize() { glGenFramebuffersEXT(1, &framebuffer_); + // TODO(gman): Init these on demand. GLuint shaders[kNumShaders]; for (int shader = 0; shader < kNumShaders; ++shader) { shaders[shader] = glCreateShader( @@ -174,6 +179,7 @@ void CopyTextureCHROMIUMResourceManager::Initialize() { #endif } + // TODO(gman): Init these on demand. for (int program = 0; program < kNumPrograms; ++program) { programs_[program] = glCreateProgram(); glAttachShader(programs_[program], shaders[0]); @@ -199,6 +205,8 @@ void CopyTextureCHROMIUMResourceManager::Initialize() { for (int shader = 0; shader < kNumShaders; ++shader) glDeleteShader(shaders[shader]); + decoder->RestoreBufferBindings(); + initialized_ = true; } @@ -215,10 +223,13 @@ void CopyTextureCHROMIUMResourceManager::Destroy() { } void CopyTextureCHROMIUMResourceManager::DoCopyTexture( + const gles2::GLES2Decoder* decoder, GLenum target, GLuint source_id, GLuint dest_id, GLint level, + GLsizei width, + GLsizei height, bool flip_y, bool premultiply_alpha, bool unpremultiply_alpha) { @@ -240,6 +251,14 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTexture( } #endif + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, dest_id); + // NVidia drivers require texture settings to be a certain way + // or they won't report FRAMEBUFFER_COMPLETE. + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer_); glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, dest_id, level); @@ -248,38 +267,51 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTexture( GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); if (GL_FRAMEBUFFER_COMPLETE != fb_status) { DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer."; - return; - } + } else #endif + { + glEnableVertexAttribArray(kVertexPositionAttrib); + glEnableVertexAttribArray(kVertexTextureAttrib); + + glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[0]); + glVertexAttribPointer(kVertexPositionAttrib, 4, GL_FLOAT, GL_FALSE, + 4 * sizeof(GLfloat), 0); + + glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[1]); + glVertexAttribPointer(kVertexTextureAttrib, 2, GL_FLOAT, GL_FALSE, + 2 * sizeof(GLfloat), 0); + + glUniform1i(sampler_locations_[program], 0); + + glBindTexture(GL_TEXTURE_2D, source_id); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + glDisable(GL_DEPTH_TEST); + glDisable(GL_SCISSOR_TEST); + glDisable(GL_STENCIL_TEST); + glDisable(GL_CULL_FACE); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glDepthMask(GL_FALSE); + glDisable(GL_BLEND); + + glViewport(0, 0, width, height); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + } - glEnableVertexAttribArray(kVertexPositionAttrib); - glEnableVertexAttribArray(kVertexTextureAttrib); - - glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[0]); - glVertexAttribPointer(kVertexPositionAttrib, 4, GL_FLOAT, GL_FALSE, - 4 * sizeof(GLfloat), 0); - - glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[1]); - glVertexAttribPointer(kVertexTextureAttrib, 2, GL_FLOAT, GL_FALSE, - 2 * sizeof(GLfloat), 0); - - glActiveTexture(GL_TEXTURE0); - glUniform1i(sampler_locations_[program], 0); - - glBindTexture(GL_TEXTURE_2D, source_id); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - - glDisable(GL_DEPTH_TEST); - glDisable(GL_SCISSOR_TEST); - glDisable(GL_STENCIL_TEST); - glDisable(GL_CULL_FACE); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - glDepthMask(GL_FALSE); - glDisable(GL_BLEND); - - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + decoder->RestoreAttribute(kVertexTextureAttrib); + decoder->RestoreAttribute(kVertexPositionAttrib); + decoder->RestoreTextureUnitBindings(0); + decoder->RestoreTextureState(source_id); + decoder->RestoreTextureState(dest_id); + decoder->RestoreActiveTexture(); + decoder->RestoreProgramBindings(); + decoder->RestoreBufferBindings(); + decoder->RestoreFramebufferBindings(); + decoder->RestoreGlobalState(); } +} // namespace + diff --git a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h index 933bf65..fc297df 100644 --- a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h +++ b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h @@ -7,6 +7,13 @@ #include "gpu/command_buffer/service/gl_utils.h" +namespace gpu { +namespace gles2 { + +class GLES2Decoder; + +} // namespace gles2. + // This class encapsulates the resources required to implement the // GL_CHROMIUM_copy_texture extension. The copy operation is performed // via a blit to a framebuffer object. @@ -14,11 +21,13 @@ class CopyTextureCHROMIUMResourceManager { public: CopyTextureCHROMIUMResourceManager() : initialized_(false) {} - void Initialize(); + void Initialize(const gles2::GLES2Decoder* decoder); void Destroy(); - void DoCopyTexture(GLenum target, GLuint source_id, GLuint dest_id, - GLint level, bool flip_y, bool premultiply_alpha, + void DoCopyTexture(const gles2::GLES2Decoder* decoder, + GLenum target, GLuint source_id, GLuint dest_id, + GLint level, GLsizei width, GLsizei height, + bool flip_y, bool premultiply_alpha, bool unpremultiply_alpha); // The attributes used during invocation of the extension. @@ -37,6 +46,8 @@ class CopyTextureCHROMIUMResourceManager { DISALLOW_COPY_AND_ASSIGN(CopyTextureCHROMIUMResourceManager); }; +} // namespace gpu. + #endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_COPY_TEXTURE_CHROMIUM_H_ diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 573d6cb..66426e9 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -9581,7 +9581,7 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( if (!copy_texture_CHROMIUM_.get()) { CopyRealGLErrorsToWrapper(); copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager()); - copy_texture_CHROMIUM_->Initialize(); + copy_texture_CHROMIUM_->Initialize(this); RestoreCurrentFramebufferBindings(); if (PeekGLError() != GL_NO_ERROR) return; @@ -9625,31 +9625,13 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( texture_manager()->SetLevelCleared(dest_info, GL_TEXTURE_2D, level, true); } - clear_state_dirty_ = true; - glViewport(0, 0, source_width, source_height); - copy_texture_CHROMIUM_->DoCopyTexture(target, source_info->service_id(), + copy_texture_CHROMIUM_->DoCopyTexture(this, + target, source_info->service_id(), dest_info->service_id(), level, + source_width, source_height, unpack_flip_y_, unpack_premultiply_alpha_, unpack_unpremultiply_alpha_); - glViewport( - state_.viewport_x, state_.viewport_y, - state_.viewport_width, state_.viewport_height); - - // Restore all of the state touched by the extension. - if (state_.current_program) - glUseProgram(state_.current_program->service_id()); - else - glUseProgram(0); - - RestoreCurrentFramebufferBindings(); - RestoreCurrentTexture2DBindings(); - RestoreStateForAttrib( - CopyTextureCHROMIUMResourceManager::kVertexPositionAttrib); - RestoreStateForAttrib( - CopyTextureCHROMIUMResourceManager::kVertexTextureAttrib); - - ApplyDirtyState(); } static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) { |