| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |