| 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 09f73aee94f32aa45a0e990f5aedf5cad4f5d7df..5b0fc8f9506f29c0995e92b06b0c2fb54e245211 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -540,6 +540,31 @@ class GLES2DecoderImpl : public GLES2Decoder {
|
| virtual gfx::GLContext* GetGLContext() OVERRIDE { return context_.get(); }
|
| virtual ContextGroup* GetContextGroup() OVERRIDE { return group_.get(); }
|
| virtual void RestoreState() const OVERRIDE;
|
| +
|
| + virtual void RestoreActiveTexture() const OVERRIDE {
|
| + state_.RestoreActiveTexture();
|
| + }
|
| + virtual void RestoreAttribute(unsigned index) const OVERRIDE {
|
| + state_.RestoreAttribute(index);
|
| + }
|
| + virtual void RestoreBufferBindings() const OVERRIDE {
|
| + state_.RestoreBufferBindings();
|
| + }
|
| + virtual void RestoreGlobalState() const OVERRIDE {
|
| + state_.RestoreGlobalState();
|
| + }
|
| + virtual void RestoreProgramBindings() const OVERRIDE {
|
| + state_.RestoreProgramBindings();
|
| + }
|
| + virtual void RestoreRenderbufferBindings() const OVERRIDE {
|
| + state_.RestoreRenderbufferBindings();
|
| + }
|
| + virtual void RestoreTextureUnitBindings(unsigned unit) const OVERRIDE {
|
| + state_.RestoreTextureUnitBindings(unit);
|
| + }
|
| + virtual void RestoreFramebufferBindings() const OVERRIDE;
|
| + virtual void RestoreTextureState(unsigned service_id) const OVERRIDE;
|
| +
|
| virtual QueryManager* GetQueryManager() OVERRIDE {
|
| return query_manager_.get();
|
| }
|
| @@ -644,6 +669,10 @@ class GLES2DecoderImpl : public GLES2Decoder {
|
| return group_->shader_manager();
|
| }
|
|
|
| + const TextureManager* texture_manager() const {
|
| + return group_->texture_manager();
|
| + }
|
| +
|
| TextureManager* texture_manager() {
|
| return group_->texture_manager();
|
| }
|
| @@ -683,7 +712,7 @@ class GLES2DecoderImpl : public GLES2Decoder {
|
| }
|
|
|
| // Gets the texture info for the given texture. Returns NULL if none exists.
|
| - TextureManager::TextureInfo* GetTextureInfo(GLuint client_id) {
|
| + TextureManager::TextureInfo* GetTextureInfo(GLuint client_id) const {
|
| TextureManager::TextureInfo* info =
|
| texture_manager()->GetTextureInfo(client_id);
|
| return info;
|
| @@ -3605,17 +3634,45 @@ GLuint GLES2DecoderImpl::GetBackbufferServiceId() const {
|
| }
|
|
|
| void GLES2DecoderImpl::RestoreState() const {
|
| - // TODO: Restore multisample bindings
|
| + // Restore the Framebuffer first because of bugs in Intel drivers.
|
| + // Intel drivers incorrectly clip the viewport settings to
|
| + // the size of the current framebuffer object.
|
| + RestoreFramebufferBindings();
|
| + state_.RestoreState();
|
| +}
|
| +
|
| +void GLES2DecoderImpl::RestoreFramebufferBindings() const {
|
| GLuint service_id = state_.bound_draw_framebuffer ?
|
| state_.bound_draw_framebuffer->service_id() :
|
| GetBackbufferServiceId();
|
| - glBindFramebufferEXT(GL_FRAMEBUFFER, service_id);
|
| + if (!features().chromium_framebuffer_multisample) {
|
| + glBindFramebufferEXT(GL_FRAMEBUFFER, service_id);
|
| + } else {
|
| + glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, service_id);
|
| + service_id = state_.bound_read_framebuffer ?
|
| + state_.bound_read_framebuffer->service_id() :
|
| + GetBackbufferServiceId();
|
| + glBindFramebufferEXT(GL_READ_FRAMEBUFFER, service_id);
|
| + }
|
| OnFboChanged();
|
|
|
| - // Restore gl states after bind framebuffer, to ensure the gl states
|
| - // applied to right FBO
|
| - // gman: There is no framebuffer state so this is a bug in the driver
|
| - state_.RestoreState();
|
| +}
|
| +
|
| +void GLES2DecoderImpl::RestoreTextureState(unsigned service_id) const {
|
| + GLuint client_id = 0;
|
| + if (texture_manager()->GetClientId(service_id, &client_id)) {
|
| + TextureManager::TextureInfo* texture = GetTextureInfo(client_id);
|
| + glBindTexture(GL_TEXTURE_2D, service_id);
|
| + glTexParameteri(
|
| + GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, texture->wrap_s());
|
| + glTexParameteri(
|
| + GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, texture->wrap_t());
|
| + glTexParameteri(
|
| + GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->min_filter());
|
| + glTexParameteri(
|
| + GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->mag_filter());
|
| + RestoreTextureUnitBindings(state_.active_texture_unit);
|
| + }
|
| }
|
|
|
| void GLES2DecoderImpl::OnFboChanged() const {
|
|
|