summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-28 00:36:27 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-28 00:36:27 +0000
commit07a0cc3cd3ebb314f81c18e3c64ae1f270fd6415 (patch)
tree6d2373437eb2bb86331169670b0359b5fc43d5e4 /gpu/command_buffer/service
parent5e2ea3a59f54c44901457f16d58f580dbdb5489f (diff)
downloadchromium_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')
-rw-r--r--gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc96
-rw-r--r--gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h17
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc26
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) {