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

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 25277005: Move more framebuffer state out of ContextState and into FramebufferState. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased onto head, in the hope this fix errors unrelated to my change. Created 7 years, 2 months 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 unified diff | Download patch
« no previous file with comments | « gpu/command_buffer/service/framebuffer_manager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
6 6
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <list> 10 #include <list>
(...skipping 1403 matching lines...) Expand 10 before | Expand all | Expand 10 after
1414 NOTREACHED(); 1414 NOTREACHED();
1415 return 0; 1415 return 0;
1416 } 1416 }
1417 1417
1418 // Gets the framebuffer info for a particular target. 1418 // Gets the framebuffer info for a particular target.
1419 Framebuffer* GetFramebufferInfoForTarget(GLenum target) { 1419 Framebuffer* GetFramebufferInfoForTarget(GLenum target) {
1420 Framebuffer* framebuffer = NULL; 1420 Framebuffer* framebuffer = NULL;
1421 switch (target) { 1421 switch (target) {
1422 case GL_FRAMEBUFFER: 1422 case GL_FRAMEBUFFER:
1423 case GL_DRAW_FRAMEBUFFER_EXT: 1423 case GL_DRAW_FRAMEBUFFER_EXT:
1424 framebuffer = state_.bound_draw_framebuffer.get(); 1424 framebuffer = framebuffer_state_.bound_draw_framebuffer.get();
1425 break; 1425 break;
1426 case GL_READ_FRAMEBUFFER_EXT: 1426 case GL_READ_FRAMEBUFFER_EXT:
1427 framebuffer = state_.bound_read_framebuffer.get(); 1427 framebuffer = framebuffer_state_.bound_read_framebuffer.get();
1428 break; 1428 break;
1429 default: 1429 default:
1430 NOTREACHED(); 1430 NOTREACHED();
1431 break; 1431 break;
1432 } 1432 }
1433 return framebuffer; 1433 return framebuffer;
1434 } 1434 }
1435 1435
1436 Renderbuffer* GetRenderbufferInfoForTarget( 1436 Renderbuffer* GetRenderbufferInfoForTarget(
1437 GLenum target) { 1437 GLenum target) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1494 const FeatureInfo::FeatureFlags& features() const { 1494 const FeatureInfo::FeatureFlags& features() const {
1495 return feature_info_->feature_flags(); 1495 return feature_info_->feature_flags();
1496 } 1496 }
1497 1497
1498 const FeatureInfo::Workarounds& workarounds() const { 1498 const FeatureInfo::Workarounds& workarounds() const {
1499 return feature_info_->workarounds(); 1499 return feature_info_->workarounds();
1500 } 1500 }
1501 1501
1502 bool ShouldDeferDraws() { 1502 bool ShouldDeferDraws() {
1503 return !offscreen_target_frame_buffer_.get() && 1503 return !offscreen_target_frame_buffer_.get() &&
1504 state_.bound_draw_framebuffer.get() == NULL && 1504 framebuffer_state_.bound_draw_framebuffer.get() == NULL &&
1505 surface_->DeferDraws(); 1505 surface_->DeferDraws();
1506 } 1506 }
1507 1507
1508 bool ShouldDeferReads() { 1508 bool ShouldDeferReads() {
1509 return !offscreen_target_frame_buffer_.get() && 1509 return !offscreen_target_frame_buffer_.get() &&
1510 state_.bound_read_framebuffer.get() == NULL && 1510 framebuffer_state_.bound_read_framebuffer.get() == NULL &&
1511 surface_->DeferDraws(); 1511 surface_->DeferDraws();
1512 } 1512 }
1513 1513
1514 void ProcessPendingReadPixels(); 1514 void ProcessPendingReadPixels();
1515 void FinishReadPixels(const cmds::ReadPixels& c, GLuint buffer); 1515 void FinishReadPixels(const cmds::ReadPixels& c, GLuint buffer);
1516 1516
1517 // Generate a member function prototype for each command in an automated and 1517 // Generate a member function prototype for each command in an automated and
1518 // typesafe way. 1518 // typesafe way.
1519 #define GLES2_CMD_OP(name) \ 1519 #define GLES2_CMD_OP(name) \
1520 Error Handle ## name( \ 1520 Error Handle ## name( \
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1738 1738
1739 ScopedFrameBufferBinder::~ScopedFrameBufferBinder() { 1739 ScopedFrameBufferBinder::~ScopedFrameBufferBinder() {
1740 ScopedGLErrorSuppressor suppressor( 1740 ScopedGLErrorSuppressor suppressor(
1741 "ScopedFrameBufferBinder::dtor", decoder_); 1741 "ScopedFrameBufferBinder::dtor", decoder_);
1742 decoder_->RestoreCurrentFramebufferBindings(); 1742 decoder_->RestoreCurrentFramebufferBindings();
1743 } 1743 }
1744 1744
1745 ScopedResolvedFrameBufferBinder::ScopedResolvedFrameBufferBinder( 1745 ScopedResolvedFrameBufferBinder::ScopedResolvedFrameBufferBinder(
1746 GLES2DecoderImpl* decoder, bool enforce_internal_framebuffer, bool internal) 1746 GLES2DecoderImpl* decoder, bool enforce_internal_framebuffer, bool internal)
1747 : decoder_(decoder) { 1747 : decoder_(decoder) {
1748 resolve_and_bind_ = (decoder_->offscreen_target_frame_buffer_.get() && 1748 resolve_and_bind_ = (
1749 decoder_->IsOffscreenBufferMultisampled() && 1749 decoder_->offscreen_target_frame_buffer_.get() &&
1750 (!decoder_->state_.bound_read_framebuffer.get() || 1750 decoder_->IsOffscreenBufferMultisampled() &&
1751 enforce_internal_framebuffer)); 1751 (!decoder_->framebuffer_state_.bound_read_framebuffer.get() ||
1752 enforce_internal_framebuffer));
1752 if (!resolve_and_bind_) 1753 if (!resolve_and_bind_)
1753 return; 1754 return;
1754 1755
1755 ScopedGLErrorSuppressor suppressor( 1756 ScopedGLErrorSuppressor suppressor(
1756 "ScopedResolvedFrameBufferBinder::ctor", decoder_); 1757 "ScopedResolvedFrameBufferBinder::ctor", decoder_);
1757 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 1758 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT,
1758 decoder_->offscreen_target_frame_buffer_->id()); 1759 decoder_->offscreen_target_frame_buffer_->id());
1759 GLuint targetid; 1760 GLuint targetid;
1760 if (internal) { 1761 if (internal) {
1761 if (!decoder_->offscreen_resolved_frame_buffer_.get()) { 1762 if (!decoder_->offscreen_resolved_frame_buffer_.get()) {
(...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after
2629 2630
2630 void GLES2DecoderImpl::DeleteFramebuffersHelper( 2631 void GLES2DecoderImpl::DeleteFramebuffersHelper(
2631 GLsizei n, const GLuint* client_ids) { 2632 GLsizei n, const GLuint* client_ids) {
2632 bool supports_separate_framebuffer_binds = 2633 bool supports_separate_framebuffer_binds =
2633 features().chromium_framebuffer_multisample; 2634 features().chromium_framebuffer_multisample;
2634 2635
2635 for (GLsizei ii = 0; ii < n; ++ii) { 2636 for (GLsizei ii = 0; ii < n; ++ii) {
2636 Framebuffer* framebuffer = 2637 Framebuffer* framebuffer =
2637 GetFramebuffer(client_ids[ii]); 2638 GetFramebuffer(client_ids[ii]);
2638 if (framebuffer && !framebuffer->IsDeleted()) { 2639 if (framebuffer && !framebuffer->IsDeleted()) {
2639 if (framebuffer == state_.bound_draw_framebuffer.get()) { 2640 if (framebuffer == framebuffer_state_.bound_draw_framebuffer.get()) {
2640 state_.bound_draw_framebuffer = NULL; 2641 framebuffer_state_.bound_draw_framebuffer = NULL;
2641 framebuffer_state_.clear_state_dirty = true; 2642 framebuffer_state_.clear_state_dirty = true;
2642 GLenum target = supports_separate_framebuffer_binds ? 2643 GLenum target = supports_separate_framebuffer_binds ?
2643 GL_DRAW_FRAMEBUFFER_EXT : GL_FRAMEBUFFER; 2644 GL_DRAW_FRAMEBUFFER_EXT : GL_FRAMEBUFFER;
2644 glBindFramebufferEXT(target, GetBackbufferServiceId()); 2645 glBindFramebufferEXT(target, GetBackbufferServiceId());
2645 } 2646 }
2646 if (framebuffer == state_.bound_read_framebuffer.get()) { 2647 if (framebuffer == framebuffer_state_.bound_read_framebuffer.get()) {
2647 state_.bound_read_framebuffer = NULL; 2648 framebuffer_state_.bound_read_framebuffer = NULL;
2648 GLenum target = supports_separate_framebuffer_binds ? 2649 GLenum target = supports_separate_framebuffer_binds ?
2649 GL_READ_FRAMEBUFFER_EXT : GL_FRAMEBUFFER; 2650 GL_READ_FRAMEBUFFER_EXT : GL_FRAMEBUFFER;
2650 glBindFramebufferEXT(target, GetBackbufferServiceId()); 2651 glBindFramebufferEXT(target, GetBackbufferServiceId());
2651 } 2652 }
2652 OnFboChanged(); 2653 OnFboChanged();
2653 RemoveFramebuffer(client_ids[ii]); 2654 RemoveFramebuffer(client_ids[ii]);
2654 } 2655 }
2655 } 2656 }
2656 } 2657 }
2657 2658
2658 void GLES2DecoderImpl::DeleteRenderbuffersHelper( 2659 void GLES2DecoderImpl::DeleteRenderbuffersHelper(
2659 GLsizei n, const GLuint* client_ids) { 2660 GLsizei n, const GLuint* client_ids) {
2660 bool supports_separate_framebuffer_binds = 2661 bool supports_separate_framebuffer_binds =
2661 features().chromium_framebuffer_multisample; 2662 features().chromium_framebuffer_multisample;
2662 for (GLsizei ii = 0; ii < n; ++ii) { 2663 for (GLsizei ii = 0; ii < n; ++ii) {
2663 Renderbuffer* renderbuffer = 2664 Renderbuffer* renderbuffer =
2664 GetRenderbuffer(client_ids[ii]); 2665 GetRenderbuffer(client_ids[ii]);
2665 if (renderbuffer && !renderbuffer->IsDeleted()) { 2666 if (renderbuffer && !renderbuffer->IsDeleted()) {
2666 if (state_.bound_renderbuffer.get() == renderbuffer) { 2667 if (state_.bound_renderbuffer.get() == renderbuffer) {
2667 state_.bound_renderbuffer = NULL; 2668 state_.bound_renderbuffer = NULL;
2668 } 2669 }
2669 // Unbind from current framebuffers. 2670 // Unbind from current framebuffers.
2670 if (supports_separate_framebuffer_binds) { 2671 if (supports_separate_framebuffer_binds) {
2671 if (state_.bound_read_framebuffer.get()) { 2672 if (framebuffer_state_.bound_read_framebuffer.get()) {
2672 state_.bound_read_framebuffer 2673 framebuffer_state_.bound_read_framebuffer
2673 ->UnbindRenderbuffer(GL_READ_FRAMEBUFFER_EXT, renderbuffer); 2674 ->UnbindRenderbuffer(GL_READ_FRAMEBUFFER_EXT, renderbuffer);
2674 } 2675 }
2675 if (state_.bound_draw_framebuffer.get()) { 2676 if (framebuffer_state_.bound_draw_framebuffer.get()) {
2676 state_.bound_draw_framebuffer 2677 framebuffer_state_.bound_draw_framebuffer
2677 ->UnbindRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, renderbuffer); 2678 ->UnbindRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, renderbuffer);
2678 } 2679 }
2679 } else { 2680 } else {
2680 if (state_.bound_draw_framebuffer.get()) { 2681 if (framebuffer_state_.bound_draw_framebuffer.get()) {
2681 state_.bound_draw_framebuffer 2682 framebuffer_state_.bound_draw_framebuffer
2682 ->UnbindRenderbuffer(GL_FRAMEBUFFER, renderbuffer); 2683 ->UnbindRenderbuffer(GL_FRAMEBUFFER, renderbuffer);
2683 } 2684 }
2684 } 2685 }
2685 framebuffer_state_.clear_state_dirty = true; 2686 framebuffer_state_.clear_state_dirty = true;
2686 RemoveRenderbuffer(client_ids[ii]); 2687 RemoveRenderbuffer(client_ids[ii]);
2687 } 2688 }
2688 } 2689 }
2689 } 2690 }
2690 2691
2691 void GLES2DecoderImpl::DeleteTexturesHelper( 2692 void GLES2DecoderImpl::DeleteTexturesHelper(
2692 GLsizei n, const GLuint* client_ids) { 2693 GLsizei n, const GLuint* client_ids) {
2693 bool supports_separate_framebuffer_binds = 2694 bool supports_separate_framebuffer_binds =
2694 features().chromium_framebuffer_multisample; 2695 features().chromium_framebuffer_multisample;
2695 for (GLsizei ii = 0; ii < n; ++ii) { 2696 for (GLsizei ii = 0; ii < n; ++ii) {
2696 TextureRef* texture_ref = GetTexture(client_ids[ii]); 2697 TextureRef* texture_ref = GetTexture(client_ids[ii]);
2697 if (texture_ref) { 2698 if (texture_ref) {
2698 Texture* texture = texture_ref->texture(); 2699 Texture* texture = texture_ref->texture();
2699 if (texture->IsAttachedToFramebuffer()) { 2700 if (texture->IsAttachedToFramebuffer()) {
2700 framebuffer_state_.clear_state_dirty = true; 2701 framebuffer_state_.clear_state_dirty = true;
2701 } 2702 }
2702 // Unbind texture_ref from texture_ref units. 2703 // Unbind texture_ref from texture_ref units.
2703 for (size_t jj = 0; jj < state_.texture_units.size(); ++jj) { 2704 for (size_t jj = 0; jj < state_.texture_units.size(); ++jj) {
2704 state_.texture_units[jj].Unbind(texture_ref); 2705 state_.texture_units[jj].Unbind(texture_ref);
2705 } 2706 }
2706 // Unbind from current framebuffers. 2707 // Unbind from current framebuffers.
2707 if (supports_separate_framebuffer_binds) { 2708 if (supports_separate_framebuffer_binds) {
2708 if (state_.bound_read_framebuffer.get()) { 2709 if (framebuffer_state_.bound_read_framebuffer.get()) {
2709 state_.bound_read_framebuffer 2710 framebuffer_state_.bound_read_framebuffer
2710 ->UnbindTexture(GL_READ_FRAMEBUFFER_EXT, texture_ref); 2711 ->UnbindTexture(GL_READ_FRAMEBUFFER_EXT, texture_ref);
2711 } 2712 }
2712 if (state_.bound_draw_framebuffer.get()) { 2713 if (framebuffer_state_.bound_draw_framebuffer.get()) {
2713 state_.bound_draw_framebuffer 2714 framebuffer_state_.bound_draw_framebuffer
2714 ->UnbindTexture(GL_DRAW_FRAMEBUFFER_EXT, texture_ref); 2715 ->UnbindTexture(GL_DRAW_FRAMEBUFFER_EXT, texture_ref);
2715 } 2716 }
2716 } else { 2717 } else {
2717 if (state_.bound_draw_framebuffer.get()) { 2718 if (framebuffer_state_.bound_draw_framebuffer.get()) {
2718 state_.bound_draw_framebuffer 2719 framebuffer_state_.bound_draw_framebuffer
2719 ->UnbindTexture(GL_FRAMEBUFFER, texture_ref); 2720 ->UnbindTexture(GL_FRAMEBUFFER, texture_ref);
2720 } 2721 }
2721 } 2722 }
2722 #if defined(OS_MACOSX) 2723 #if defined(OS_MACOSX)
2723 GLuint service_id = texture->service_id(); 2724 GLuint service_id = texture->service_id();
2724 if (texture->target() == GL_TEXTURE_RECTANGLE_ARB) { 2725 if (texture->target() == GL_TEXTURE_RECTANGLE_ARB) {
2725 ReleaseIOSurfaceForTexture(service_id); 2726 ReleaseIOSurfaceForTexture(service_id);
2726 } 2727 }
2727 #endif 2728 #endif
2728 RemoveTexture(client_ids[ii]); 2729 RemoveTexture(client_ids[ii]);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
2801 2802
2802 glBindFramebufferEXT(target, framebuffer_id); 2803 glBindFramebufferEXT(target, framebuffer_id);
2803 } 2804 }
2804 2805
2805 void GLES2DecoderImpl::RestoreCurrentFramebufferBindings() { 2806 void GLES2DecoderImpl::RestoreCurrentFramebufferBindings() {
2806 framebuffer_state_.clear_state_dirty = true; 2807 framebuffer_state_.clear_state_dirty = true;
2807 2808
2808 if (!features().chromium_framebuffer_multisample) { 2809 if (!features().chromium_framebuffer_multisample) {
2809 RebindCurrentFramebuffer( 2810 RebindCurrentFramebuffer(
2810 GL_FRAMEBUFFER, 2811 GL_FRAMEBUFFER,
2811 state_.bound_draw_framebuffer.get(), 2812 framebuffer_state_.bound_draw_framebuffer.get(),
2812 GetBackbufferServiceId()); 2813 GetBackbufferServiceId());
2813 } else { 2814 } else {
2814 RebindCurrentFramebuffer( 2815 RebindCurrentFramebuffer(
2815 GL_READ_FRAMEBUFFER_EXT, 2816 GL_READ_FRAMEBUFFER_EXT,
2816 state_.bound_read_framebuffer.get(), 2817 framebuffer_state_.bound_read_framebuffer.get(),
2817 GetBackbufferServiceId()); 2818 GetBackbufferServiceId());
2818 RebindCurrentFramebuffer( 2819 RebindCurrentFramebuffer(
2819 GL_DRAW_FRAMEBUFFER_EXT, 2820 GL_DRAW_FRAMEBUFFER_EXT,
2820 state_.bound_draw_framebuffer.get(), 2821 framebuffer_state_.bound_draw_framebuffer.get(),
2821 GetBackbufferServiceId()); 2822 GetBackbufferServiceId());
2822 } 2823 }
2823 OnFboChanged(); 2824 OnFboChanged();
2824 } 2825 }
2825 2826
2826 void GLES2DecoderImpl::RestoreCurrentTexture2DBindings() { 2827 void GLES2DecoderImpl::RestoreCurrentTexture2DBindings() {
2827 TextureUnit& info = state_.texture_units[0]; 2828 TextureUnit& info = state_.texture_units[0];
2828 GLuint last_id; 2829 GLuint last_id;
2829 if (info.bound_texture_2d.get()) { 2830 if (info.bound_texture_2d.get()) {
2830 last_id = info.bound_texture_2d->service_id(); 2831 last_id = info.bound_texture_2d->service_id();
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2895 } 2896 }
2896 2897
2897 // NOTE: At this point we don't know if the framebuffer is complete but 2898 // NOTE: At this point we don't know if the framebuffer is complete but
2898 // we DO know that everything that needs to be cleared has been cleared. 2899 // we DO know that everything that needs to be cleared has been cleared.
2899 return true; 2900 return true;
2900 } 2901 }
2901 2902
2902 bool GLES2DecoderImpl::CheckBoundFramebuffersValid(const char* func_name) { 2903 bool GLES2DecoderImpl::CheckBoundFramebuffersValid(const char* func_name) {
2903 if (!features().chromium_framebuffer_multisample) { 2904 if (!features().chromium_framebuffer_multisample) {
2904 bool valid = CheckFramebufferValid( 2905 bool valid = CheckFramebufferValid(
2905 state_.bound_draw_framebuffer.get(), GL_FRAMEBUFFER_EXT, func_name); 2906 framebuffer_state_.bound_draw_framebuffer.get(), GL_FRAMEBUFFER_EXT,
2907 func_name);
2906 2908
2907 if (valid) 2909 if (valid)
2908 OnUseFramebuffer(); 2910 OnUseFramebuffer();
2909 2911
2910 return valid; 2912 return valid;
2911 } 2913 }
2912 return CheckFramebufferValid(state_.bound_draw_framebuffer.get(), 2914 return CheckFramebufferValid(framebuffer_state_.bound_draw_framebuffer.get(),
2913 GL_DRAW_FRAMEBUFFER_EXT, 2915 GL_DRAW_FRAMEBUFFER_EXT,
2914 func_name) && 2916 func_name) &&
2915 CheckFramebufferValid(state_.bound_read_framebuffer.get(), 2917 CheckFramebufferValid(framebuffer_state_.bound_read_framebuffer.get(),
2916 GL_READ_FRAMEBUFFER_EXT, 2918 GL_READ_FRAMEBUFFER_EXT,
2917 func_name); 2919 func_name);
2918 } 2920 }
2919 2921
2920 gfx::Size GLES2DecoderImpl::GetBoundReadFrameBufferSize() { 2922 gfx::Size GLES2DecoderImpl::GetBoundReadFrameBufferSize() {
2921 Framebuffer* framebuffer = 2923 Framebuffer* framebuffer =
2922 GetFramebufferInfoForTarget(GL_READ_FRAMEBUFFER_EXT); 2924 GetFramebufferInfoForTarget(GL_READ_FRAMEBUFFER_EXT);
2923 if (framebuffer != NULL) { 2925 if (framebuffer != NULL) {
2924 const Framebuffer::Attachment* attachment = 2926 const Framebuffer::Attachment* attachment =
2925 framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0); 2927 framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0);
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
3074 return; 3076 return;
3075 3077
3076 DCHECK(!have_context || context_->IsCurrent(NULL)); 3078 DCHECK(!have_context || context_->IsCurrent(NULL));
3077 3079
3078 // Unbind everything. 3080 // Unbind everything.
3079 state_.vertex_attrib_manager = NULL; 3081 state_.vertex_attrib_manager = NULL;
3080 default_vertex_attrib_manager_ = NULL; 3082 default_vertex_attrib_manager_ = NULL;
3081 state_.texture_units.clear(); 3083 state_.texture_units.clear();
3082 state_.bound_array_buffer = NULL; 3084 state_.bound_array_buffer = NULL;
3083 state_.current_query = NULL; 3085 state_.current_query = NULL;
3084 state_.bound_read_framebuffer = NULL; 3086 framebuffer_state_.bound_read_framebuffer = NULL;
3085 state_.bound_draw_framebuffer = NULL; 3087 framebuffer_state_.bound_draw_framebuffer = NULL;
3086 state_.bound_renderbuffer = NULL; 3088 state_.bound_renderbuffer = NULL;
3087 3089
3088 if (offscreen_saved_color_texture_info_.get()) { 3090 if (offscreen_saved_color_texture_info_.get()) {
3089 DCHECK(offscreen_target_color_texture_); 3091 DCHECK(offscreen_target_color_texture_);
3090 DCHECK_EQ(offscreen_saved_color_texture_info_->service_id(), 3092 DCHECK_EQ(offscreen_saved_color_texture_info_->service_id(),
3091 offscreen_saved_color_texture_->id()); 3093 offscreen_saved_color_texture_->id());
3092 offscreen_saved_color_texture_->Invalidate(); 3094 offscreen_saved_color_texture_->Invalidate();
3093 offscreen_saved_color_texture_info_ = NULL; 3095 offscreen_saved_color_texture_info_ = NULL;
3094 } 3096 }
3095 if (have_context) { 3097 if (have_context) {
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after
3641 TRACE_EVENT1("gpu", "GLES2DecoderImpl::RestoreState", 3643 TRACE_EVENT1("gpu", "GLES2DecoderImpl::RestoreState",
3642 "context", logger_.GetLogPrefix()); 3644 "context", logger_.GetLogPrefix());
3643 // Restore the Framebuffer first because of bugs in Intel drivers. 3645 // Restore the Framebuffer first because of bugs in Intel drivers.
3644 // Intel drivers incorrectly clip the viewport settings to 3646 // Intel drivers incorrectly clip the viewport settings to
3645 // the size of the current framebuffer object. 3647 // the size of the current framebuffer object.
3646 RestoreFramebufferBindings(); 3648 RestoreFramebufferBindings();
3647 state_.RestoreState(); 3649 state_.RestoreState();
3648 } 3650 }
3649 3651
3650 void GLES2DecoderImpl::RestoreFramebufferBindings() const { 3652 void GLES2DecoderImpl::RestoreFramebufferBindings() const {
3651 GLuint service_id = state_.bound_draw_framebuffer.get() 3653 GLuint service_id =
3652 ? state_.bound_draw_framebuffer->service_id() 3654 framebuffer_state_.bound_draw_framebuffer.get()
3653 : GetBackbufferServiceId(); 3655 ? framebuffer_state_.bound_draw_framebuffer->service_id()
3656 : GetBackbufferServiceId();
3654 if (!features().chromium_framebuffer_multisample) { 3657 if (!features().chromium_framebuffer_multisample) {
3655 glBindFramebufferEXT(GL_FRAMEBUFFER, service_id); 3658 glBindFramebufferEXT(GL_FRAMEBUFFER, service_id);
3656 } else { 3659 } else {
3657 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, service_id); 3660 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, service_id);
3658 service_id = state_.bound_read_framebuffer.get() 3661 service_id = framebuffer_state_.bound_read_framebuffer.get()
3659 ? state_.bound_read_framebuffer->service_id() 3662 ? framebuffer_state_.bound_read_framebuffer->service_id()
3660 : GetBackbufferServiceId(); 3663 : GetBackbufferServiceId();
3661 glBindFramebufferEXT(GL_READ_FRAMEBUFFER, service_id); 3664 glBindFramebufferEXT(GL_READ_FRAMEBUFFER, service_id);
3662 } 3665 }
3663 OnFboChanged(); 3666 OnFboChanged();
3664 } 3667 }
3665 3668
3666 void GLES2DecoderImpl::RestoreTextureState(unsigned service_id) const { 3669 void GLES2DecoderImpl::RestoreTextureState(unsigned service_id) const {
3667 Texture* texture = texture_manager()->GetTextureForServiceId(service_id); 3670 Texture* texture = texture_manager()->GetTextureForServiceId(service_id);
3668 if (texture) { 3671 if (texture) {
3669 GLenum target = texture->target(); 3672 GLenum target = texture->target();
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3722 group_->GetIdAllocator(id_namespaces::kFramebuffers); 3725 group_->GetIdAllocator(id_namespaces::kFramebuffers);
3723 id_allocator->MarkAsUsed(client_id); 3726 id_allocator->MarkAsUsed(client_id);
3724 } else { 3727 } else {
3725 service_id = framebuffer->service_id(); 3728 service_id = framebuffer->service_id();
3726 } 3729 }
3727 framebuffer->MarkAsValid(); 3730 framebuffer->MarkAsValid();
3728 } 3731 }
3729 LogClientServiceForInfo(framebuffer, client_id, "glBindFramebuffer"); 3732 LogClientServiceForInfo(framebuffer, client_id, "glBindFramebuffer");
3730 3733
3731 if (target == GL_FRAMEBUFFER || target == GL_DRAW_FRAMEBUFFER_EXT) { 3734 if (target == GL_FRAMEBUFFER || target == GL_DRAW_FRAMEBUFFER_EXT) {
3732 state_.bound_draw_framebuffer = framebuffer; 3735 framebuffer_state_.bound_draw_framebuffer = framebuffer;
3733 } 3736 }
3734 if (target == GL_FRAMEBUFFER || target == GL_READ_FRAMEBUFFER_EXT) { 3737 if (target == GL_FRAMEBUFFER || target == GL_READ_FRAMEBUFFER_EXT) {
3735 state_.bound_read_framebuffer = framebuffer; 3738 framebuffer_state_.bound_read_framebuffer = framebuffer;
3736 } 3739 }
3737 3740
3738 framebuffer_state_.clear_state_dirty = true; 3741 framebuffer_state_.clear_state_dirty = true;
3739 3742
3740 // If we are rendering to the backbuffer get the FBO id for any simulated 3743 // If we are rendering to the backbuffer get the FBO id for any simulated
3741 // backbuffer. 3744 // backbuffer.
3742 if (framebuffer == NULL) { 3745 if (framebuffer == NULL) {
3743 service_id = GetBackbufferServiceId(); 3746 service_id = GetBackbufferServiceId();
3744 } 3747 }
3745 3748
(...skipping 961 matching lines...) Expand 10 before | Expand all | Expand 10 after
4707 } 4710 }
4708 service_id = renderbuffer->service_id(); 4711 service_id = renderbuffer->service_id();
4709 } 4712 }
4710 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glFramebufferRenderbuffer"); 4713 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glFramebufferRenderbuffer");
4711 glFramebufferRenderbufferEXT( 4714 glFramebufferRenderbufferEXT(
4712 target, attachment, renderbuffertarget, service_id); 4715 target, attachment, renderbuffertarget, service_id);
4713 GLenum error = LOCAL_PEEK_GL_ERROR("glFramebufferRenderbuffer"); 4716 GLenum error = LOCAL_PEEK_GL_ERROR("glFramebufferRenderbuffer");
4714 if (error == GL_NO_ERROR) { 4717 if (error == GL_NO_ERROR) {
4715 framebuffer->AttachRenderbuffer(attachment, renderbuffer); 4718 framebuffer->AttachRenderbuffer(attachment, renderbuffer);
4716 } 4719 }
4717 if (framebuffer == state_.bound_draw_framebuffer.get()) { 4720 if (framebuffer == framebuffer_state_.bound_draw_framebuffer.get()) {
4718 framebuffer_state_.clear_state_dirty = true; 4721 framebuffer_state_.clear_state_dirty = true;
4719 } 4722 }
4720 OnFboChanged(); 4723 OnFboChanged();
4721 } 4724 }
4722 4725
4723 void GLES2DecoderImpl::DoDisable(GLenum cap) { 4726 void GLES2DecoderImpl::DoDisable(GLenum cap) {
4724 if (SetCapabilityState(cap, false)) { 4727 if (SetCapabilityState(cap, false)) {
4725 glDisable(cap); 4728 glDisable(cap);
4726 } 4729 }
4727 } 4730 }
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
4891 } else { 4894 } else {
4892 glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, 4895 glFramebufferTexture2DMultisampleEXT(target, attachment, textarget,
4893 service_id, level, samples); 4896 service_id, level, samples);
4894 } 4897 }
4895 } 4898 }
4896 GLenum error = LOCAL_PEEK_GL_ERROR(name); 4899 GLenum error = LOCAL_PEEK_GL_ERROR(name);
4897 if (error == GL_NO_ERROR) { 4900 if (error == GL_NO_ERROR) {
4898 framebuffer->AttachTexture(attachment, texture_ref, textarget, level, 4901 framebuffer->AttachTexture(attachment, texture_ref, textarget, level,
4899 samples); 4902 samples);
4900 } 4903 }
4901 if (framebuffer == state_.bound_draw_framebuffer.get()) { 4904 if (framebuffer == framebuffer_state_.bound_draw_framebuffer.get()) {
4902 framebuffer_state_.clear_state_dirty = true; 4905 framebuffer_state_.clear_state_dirty = true;
4903 } 4906 }
4904 OnFboChanged(); 4907 OnFboChanged();
4905 } 4908 }
4906 4909
4907 void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv( 4910 void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv(
4908 GLenum target, GLenum attachment, GLenum pname, GLint* params) { 4911 GLenum target, GLenum attachment, GLenum pname, GLint* params) {
4909 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); 4912 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target);
4910 if (!framebuffer) { 4913 if (!framebuffer) {
4911 LOCAL_SET_GL_ERROR( 4914 LOCAL_SET_GL_ERROR(
(...skipping 5525 matching lines...) Expand 10 before | Expand all | Expand 10 after
10437 return error::kNoError; 10440 return error::kNoError;
10438 } 10441 }
10439 10442
10440 // Include the auto-generated part of this file. We split this because it means 10443 // Include the auto-generated part of this file. We split this because it means
10441 // we can easily edit the non-auto generated parts right here in this file 10444 // we can easily edit the non-auto generated parts right here in this file
10442 // instead of having to edit some template or the code generator. 10445 // instead of having to edit some template or the code generator.
10443 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 10446 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
10444 10447
10445 } // namespace gles2 10448 } // namespace gles2
10446 } // namespace gpu 10449 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/framebuffer_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698