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

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

Issue 22824009: Remove StreamTextureManager (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address comments Created 7 years, 4 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 | Annotate | Revision Log
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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 #include "gpu/command_buffer/service/gpu_tracer.h" 46 #include "gpu/command_buffer/service/gpu_tracer.h"
47 #include "gpu/command_buffer/service/image_manager.h" 47 #include "gpu/command_buffer/service/image_manager.h"
48 #include "gpu/command_buffer/service/mailbox_manager.h" 48 #include "gpu/command_buffer/service/mailbox_manager.h"
49 #include "gpu/command_buffer/service/memory_tracking.h" 49 #include "gpu/command_buffer/service/memory_tracking.h"
50 #include "gpu/command_buffer/service/program_manager.h" 50 #include "gpu/command_buffer/service/program_manager.h"
51 #include "gpu/command_buffer/service/query_manager.h" 51 #include "gpu/command_buffer/service/query_manager.h"
52 #include "gpu/command_buffer/service/renderbuffer_manager.h" 52 #include "gpu/command_buffer/service/renderbuffer_manager.h"
53 #include "gpu/command_buffer/service/shader_manager.h" 53 #include "gpu/command_buffer/service/shader_manager.h"
54 #include "gpu/command_buffer/service/shader_translator.h" 54 #include "gpu/command_buffer/service/shader_translator.h"
55 #include "gpu/command_buffer/service/shader_translator_cache.h" 55 #include "gpu/command_buffer/service/shader_translator_cache.h"
56 #include "gpu/command_buffer/service/stream_texture.h"
57 #include "gpu/command_buffer/service/stream_texture_manager.h"
58 #include "gpu/command_buffer/service/texture_manager.h" 56 #include "gpu/command_buffer/service/texture_manager.h"
59 #include "gpu/command_buffer/service/vertex_array_manager.h" 57 #include "gpu/command_buffer/service/vertex_array_manager.h"
60 #include "gpu/command_buffer/service/vertex_attrib_manager.h" 58 #include "gpu/command_buffer/service/vertex_attrib_manager.h"
61 #include "ui/gl/gl_bindings.h" 59 #include "ui/gl/gl_bindings.h"
62 #include "ui/gl/gl_fence.h" 60 #include "ui/gl/gl_fence.h"
63 #include "ui/gl/gl_image.h" 61 #include "ui/gl/gl_image.h"
64 #include "ui/gl/gl_implementation.h" 62 #include "ui/gl/gl_implementation.h"
65 #include "ui/gl/gl_surface.h" 63 #include "ui/gl/gl_surface.h"
66 64
67 #if defined(OS_MACOSX) 65 #if defined(OS_MACOSX)
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 public: 286 public:
289 explicit ScopedGLErrorSuppressor( 287 explicit ScopedGLErrorSuppressor(
290 const char* function_name, GLES2DecoderImpl* decoder); 288 const char* function_name, GLES2DecoderImpl* decoder);
291 ~ScopedGLErrorSuppressor(); 289 ~ScopedGLErrorSuppressor();
292 private: 290 private:
293 const char* function_name_; 291 const char* function_name_;
294 GLES2DecoderImpl* decoder_; 292 GLES2DecoderImpl* decoder_;
295 DISALLOW_COPY_AND_ASSIGN(ScopedGLErrorSuppressor); 293 DISALLOW_COPY_AND_ASSIGN(ScopedGLErrorSuppressor);
296 }; 294 };
297 295
298 // Temporarily changes a decoder's bound 2D texture and restore it when this 296 // Temporarily changes a decoder's bound texture and restore it when this
299 // object goes out of scope. Also temporarily switches to using active texture 297 // object goes out of scope. Also temporarily switches to using active texture
300 // unit zero in case the client has changed that to something invalid. 298 // unit zero in case the client has changed that to something invalid.
301 class ScopedTexture2DBinder { 299 class ScopedTextureBinder {
302 public: 300 public:
303 ScopedTexture2DBinder(GLES2DecoderImpl* decoder, GLuint id); 301 ScopedTextureBinder(GLES2DecoderImpl* decoder, GLenum target, GLuint id);
304 ~ScopedTexture2DBinder(); 302 ~ScopedTextureBinder();
305 303
306 private: 304 private:
307 GLES2DecoderImpl* decoder_; 305 GLES2DecoderImpl* decoder_;
308 DISALLOW_COPY_AND_ASSIGN(ScopedTexture2DBinder); 306 DISALLOW_COPY_AND_ASSIGN(ScopedTextureBinder);
309 }; 307 };
310 308
311 // Temporarily changes a decoder's bound render buffer and restore it when this 309 // Temporarily changes a decoder's bound render buffer and restore it when this
312 // object goes out of scope. 310 // object goes out of scope.
313 class ScopedRenderBufferBinder { 311 class ScopedRenderBufferBinder {
314 public: 312 public:
315 ScopedRenderBufferBinder(GLES2DecoderImpl* decoder, GLuint id); 313 ScopedRenderBufferBinder(GLES2DecoderImpl* decoder, GLuint id);
316 ~ScopedRenderBufferBinder(); 314 ~ScopedRenderBufferBinder();
317 315
318 private: 316 private:
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 uint32* service_texture_id) OVERRIDE; 623 uint32* service_texture_id) OVERRIDE;
626 624
627 virtual uint32 GetTextureUploadCount() OVERRIDE; 625 virtual uint32 GetTextureUploadCount() OVERRIDE;
628 virtual base::TimeDelta GetTotalTextureUploadTime() OVERRIDE; 626 virtual base::TimeDelta GetTotalTextureUploadTime() OVERRIDE;
629 virtual base::TimeDelta GetTotalProcessingCommandsTime() OVERRIDE; 627 virtual base::TimeDelta GetTotalProcessingCommandsTime() OVERRIDE;
630 virtual void AddProcessingCommandsTime(base::TimeDelta) OVERRIDE; 628 virtual void AddProcessingCommandsTime(base::TimeDelta) OVERRIDE;
631 629
632 // Restores the current state to the user's settings. 630 // Restores the current state to the user's settings.
633 void RestoreCurrentFramebufferBindings(); 631 void RestoreCurrentFramebufferBindings();
634 void RestoreCurrentRenderbufferBindings(); 632 void RestoreCurrentRenderbufferBindings();
635 void RestoreCurrentTexture2DBindings(); 633 void RestoreCurrentTextureBindings(GLenum target);
636 634
637 // Sets DEPTH_TEST, STENCIL_TEST and color mask for the current framebuffer. 635 // Sets DEPTH_TEST, STENCIL_TEST and color mask for the current framebuffer.
638 void ApplyDirtyState(); 636 void ApplyDirtyState();
639 637
640 // These check the state of the currently bound framebuffer or the 638 // These check the state of the currently bound framebuffer or the
641 // backbuffer if no framebuffer is bound. 639 // backbuffer if no framebuffer is bound.
642 // If all_draw_buffers is false, only check with COLOR_ATTACHMENT0, otherwise 640 // If all_draw_buffers is false, only check with COLOR_ATTACHMENT0, otherwise
643 // check with all attached and enabled color attachments. 641 // check with all attached and enabled color attachments.
644 bool BoundFramebufferHasColorAttachmentWithAlpha(bool all_draw_buffers); 642 bool BoundFramebufferHasColorAttachmentWithAlpha(bool all_draw_buffers);
645 bool BoundFramebufferHasDepthAttachment(); 643 bool BoundFramebufferHasDepthAttachment();
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 } 715 }
718 716
719 VertexArrayManager* vertex_array_manager() { 717 VertexArrayManager* vertex_array_manager() {
720 return vertex_array_manager_.get(); 718 return vertex_array_manager_.get();
721 } 719 }
722 720
723 MemoryTracker* memory_tracker() { 721 MemoryTracker* memory_tracker() {
724 return group_->memory_tracker(); 722 return group_->memory_tracker();
725 } 723 }
726 724
727 StreamTextureManager* stream_texture_manager() const {
728 return group_->stream_texture_manager();
729 }
730
731 bool EnsureGPUMemoryAvailable(size_t estimated_size) { 725 bool EnsureGPUMemoryAvailable(size_t estimated_size) {
732 MemoryTracker* tracker = memory_tracker(); 726 MemoryTracker* tracker = memory_tracker();
733 if (tracker) { 727 if (tracker) {
734 return tracker->EnsureGPUMemoryAvailable(estimated_size); 728 return tracker->EnsureGPUMemoryAvailable(estimated_size);
735 } 729 }
736 return true; 730 return true;
737 } 731 }
738 732
739 bool IsOffscreenBufferMultisampled() const { 733 bool IsOffscreenBufferMultisampled() const {
740 return offscreen_target_samples_ > 1; 734 return offscreen_target_samples_ > 1;
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after
1395 // Checks if the current program and vertex attributes are valid for drawing. 1389 // Checks if the current program and vertex attributes are valid for drawing.
1396 bool IsDrawValid( 1390 bool IsDrawValid(
1397 const char* function_name, GLuint max_vertex_accessed, GLsizei primcount); 1391 const char* function_name, GLuint max_vertex_accessed, GLsizei primcount);
1398 1392
1399 // Returns true if successful, simulated will be true if attrib0 was 1393 // Returns true if successful, simulated will be true if attrib0 was
1400 // simulated. 1394 // simulated.
1401 bool SimulateAttrib0( 1395 bool SimulateAttrib0(
1402 const char* function_name, GLuint max_vertex_accessed, bool* simulated); 1396 const char* function_name, GLuint max_vertex_accessed, bool* simulated);
1403 void RestoreStateForAttrib(GLuint attrib); 1397 void RestoreStateForAttrib(GLuint attrib);
1404 1398
1405 // If texture is a stream texture, this will update the stream to the newest
1406 // buffer.
1407 void UpdateStreamTextureIfNeeded(Texture* texture);
1408
1409 // Returns false if unrenderable textures were replaced. 1399 // Returns false if unrenderable textures were replaced.
1410 bool PrepareTexturesForRender(); 1400 bool PrepareTexturesForRender();
1411 void RestoreStateForNonRenderableTextures(); 1401 void RestoreStateForNonRenderableTextures();
1412 1402
1413 // Returns true if GL_FIXED attribs were simulated. 1403 // Returns true if GL_FIXED attribs were simulated.
1414 bool SimulateFixedAttribs( 1404 bool SimulateFixedAttribs(
1415 const char* function_name, 1405 const char* function_name,
1416 GLuint max_vertex_accessed, bool* simulated, GLsizei primcount); 1406 GLuint max_vertex_accessed, bool* simulated, GLsizei primcount);
1417 void RestoreStateForSimulatedFixedAttribs(); 1407 void RestoreStateForSimulatedFixedAttribs();
1418 1408
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
1762 : function_name_(function_name), 1752 : function_name_(function_name),
1763 decoder_(decoder) { 1753 decoder_(decoder) {
1764 ERRORSTATE_COPY_REAL_GL_ERRORS_TO_WRAPPER(decoder_->GetErrorState(), 1754 ERRORSTATE_COPY_REAL_GL_ERRORS_TO_WRAPPER(decoder_->GetErrorState(),
1765 function_name_); 1755 function_name_);
1766 } 1756 }
1767 1757
1768 ScopedGLErrorSuppressor::~ScopedGLErrorSuppressor() { 1758 ScopedGLErrorSuppressor::~ScopedGLErrorSuppressor() {
1769 ERRORSTATE_CLEAR_REAL_GL_ERRORS(decoder_->GetErrorState(), function_name_); 1759 ERRORSTATE_CLEAR_REAL_GL_ERRORS(decoder_->GetErrorState(), function_name_);
1770 } 1760 }
1771 1761
1772 ScopedTexture2DBinder::ScopedTexture2DBinder(GLES2DecoderImpl* decoder, 1762 ScopedTextureBinder::ScopedTextureBinder(GLES2DecoderImpl* decoder,
1773 GLuint id) 1763 GLenum target,
1774 : decoder_(decoder) { 1764 GLuint id)
1765 : decoder_(decoder),
1766 target_(target) {
1775 ScopedGLErrorSuppressor suppressor( 1767 ScopedGLErrorSuppressor suppressor(
1776 "ScopedTexture2DBinder::ctor", decoder_); 1768 "ScopedTextureBinder::ctor", decoder_);
1777 1769
1778 // TODO(apatrick): Check if there are any other states that need to be reset 1770 // TODO(apatrick): Check if there are any other states that need to be reset
1779 // before binding a new texture. 1771 // before binding a new texture.
1780 glActiveTexture(GL_TEXTURE0); 1772 glActiveTexture(GL_TEXTURE0);
1781 glBindTexture(GL_TEXTURE_2D, id); 1773 glBindTexture(target, id);
1782 } 1774 }
1783 1775
1784 ScopedTexture2DBinder::~ScopedTexture2DBinder() { 1776 ScopedTextureBinder::~ScopedTextureBinder() {
1785 ScopedGLErrorSuppressor suppressor( 1777 ScopedGLErrorSuppressor suppressor(
1786 "ScopedTexture2DBinder::dtor", decoder_); 1778 "ScopedTextureBinder::dtor", decoder_);
1787 decoder_->RestoreCurrentTexture2DBindings(); 1779 decoder_->RestoreCurrentTextureBindings(target_);
1788 } 1780 }
1789 1781
1790 ScopedRenderBufferBinder::ScopedRenderBufferBinder(GLES2DecoderImpl* decoder, 1782 ScopedRenderBufferBinder::ScopedRenderBufferBinder(GLES2DecoderImpl* decoder,
1791 GLuint id) 1783 GLuint id)
1792 : decoder_(decoder) { 1784 : decoder_(decoder) {
1793 ScopedGLErrorSuppressor suppressor( 1785 ScopedGLErrorSuppressor suppressor(
1794 "ScopedRenderBufferBinder::ctor", decoder_); 1786 "ScopedRenderBufferBinder::ctor", decoder_);
1795 glBindRenderbufferEXT(GL_RENDERBUFFER, id); 1787 glBindRenderbufferEXT(GL_RENDERBUFFER, id);
1796 } 1788 }
1797 1789
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1905 // This does not destroy the render texture because that would require that 1897 // This does not destroy the render texture because that would require that
1906 // the associated GL context was current. Just check that it was explicitly 1898 // the associated GL context was current. Just check that it was explicitly
1907 // destroyed. 1899 // destroyed.
1908 DCHECK_EQ(id_, 0u); 1900 DCHECK_EQ(id_, 0u);
1909 } 1901 }
1910 1902
1911 void BackTexture::Create() { 1903 void BackTexture::Create() {
1912 ScopedGLErrorSuppressor suppressor("BackTexture::Create", decoder_); 1904 ScopedGLErrorSuppressor suppressor("BackTexture::Create", decoder_);
1913 Destroy(); 1905 Destroy();
1914 glGenTextures(1, &id_); 1906 glGenTextures(1, &id_);
1915 ScopedTexture2DBinder binder(decoder_, id_); 1907 ScopedTextureBinder binder(decoder_, GL_TEXTURE_2D, id_);
1916 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1908 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1917 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1909 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1918 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 1910 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1919 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 1911 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1920 1912
1921 // TODO(apatrick): Attempt to diagnose crbug.com/97775. If SwapBuffers is 1913 // TODO(apatrick): Attempt to diagnose crbug.com/97775. If SwapBuffers is
1922 // never called on an offscreen context, no data will ever be uploaded to the 1914 // never called on an offscreen context, no data will ever be uploaded to the
1923 // saved offscreen color texture (it is deferred until to when SwapBuffers 1915 // saved offscreen color texture (it is deferred until to when SwapBuffers
1924 // is called). My idea is that some nvidia drivers might have a bug where 1916 // is called). My idea is that some nvidia drivers might have a bug where
1925 // deleting a texture that has never been populated might cause a 1917 // deleting a texture that has never been populated might cause a
1926 // crash. 1918 // crash.
1927 glTexImage2D( 1919 glTexImage2D(
1928 GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 1920 GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
1929 1921
1930 bytes_allocated_ = 16u * 16u * 4u; 1922 bytes_allocated_ = 16u * 16u * 4u;
1931 memory_tracker_.TrackMemAlloc(bytes_allocated_); 1923 memory_tracker_.TrackMemAlloc(bytes_allocated_);
1932 } 1924 }
1933 1925
1934 bool BackTexture::AllocateStorage( 1926 bool BackTexture::AllocateStorage(
1935 const gfx::Size& size, GLenum format, bool zero) { 1927 const gfx::Size& size, GLenum format, bool zero) {
1936 DCHECK_NE(id_, 0u); 1928 DCHECK_NE(id_, 0u);
1937 ScopedGLErrorSuppressor suppressor("BackTexture::AllocateStorage", decoder_); 1929 ScopedGLErrorSuppressor suppressor("BackTexture::AllocateStorage", decoder_);
1938 ScopedTexture2DBinder binder(decoder_, id_); 1930 ScopedTextureBinder binder(decoder_, GL_TEXTURE_2D, id_);
1939 uint32 image_size = 0; 1931 uint32 image_size = 0;
1940 GLES2Util::ComputeImageDataSizes( 1932 GLES2Util::ComputeImageDataSizes(
1941 size.width(), size.height(), format, GL_UNSIGNED_BYTE, 8, &image_size, 1933 size.width(), size.height(), format, GL_UNSIGNED_BYTE, 8, &image_size,
1942 NULL, NULL); 1934 NULL, NULL);
1943 1935
1944 if (!memory_tracker_.EnsureGPUMemoryAvailable(image_size)) { 1936 if (!memory_tracker_.EnsureGPUMemoryAvailable(image_size)) {
1945 return false; 1937 return false;
1946 } 1938 }
1947 1939
1948 scoped_ptr<char[]> zero_data; 1940 scoped_ptr<char[]> zero_data;
(...skipping 19 matching lines...) Expand all
1968 memory_tracker_.TrackMemFree(bytes_allocated_); 1960 memory_tracker_.TrackMemFree(bytes_allocated_);
1969 bytes_allocated_ = image_size; 1961 bytes_allocated_ = image_size;
1970 memory_tracker_.TrackMemAlloc(bytes_allocated_); 1962 memory_tracker_.TrackMemAlloc(bytes_allocated_);
1971 } 1963 }
1972 return success; 1964 return success;
1973 } 1965 }
1974 1966
1975 void BackTexture::Copy(const gfx::Size& size, GLenum format) { 1967 void BackTexture::Copy(const gfx::Size& size, GLenum format) {
1976 DCHECK_NE(id_, 0u); 1968 DCHECK_NE(id_, 0u);
1977 ScopedGLErrorSuppressor suppressor("BackTexture::Copy", decoder_); 1969 ScopedGLErrorSuppressor suppressor("BackTexture::Copy", decoder_);
1978 ScopedTexture2DBinder binder(decoder_, id_); 1970 ScopedTextureBinder binder(decoder_, GL_TEXTURE_2D, id_);
1979 glCopyTexImage2D(GL_TEXTURE_2D, 1971 glCopyTexImage2D(GL_TEXTURE_2D,
1980 0, // level 1972 0, // level
1981 format, 1973 format,
1982 0, 0, 1974 0, 0,
1983 size.width(), 1975 size.width(),
1984 size.height(), 1976 size.height(),
1985 0); // border 1977 0); // border
1986 } 1978 }
1987 1979
1988 void BackTexture::Destroy() { 1980 void BackTexture::Destroy() {
(...skipping 905 matching lines...) Expand 10 before | Expand all | Expand 10 after
2894 state_.bound_read_framebuffer.get(), 2886 state_.bound_read_framebuffer.get(),
2895 GetBackbufferServiceId()); 2887 GetBackbufferServiceId());
2896 RebindCurrentFramebuffer( 2888 RebindCurrentFramebuffer(
2897 GL_DRAW_FRAMEBUFFER_EXT, 2889 GL_DRAW_FRAMEBUFFER_EXT,
2898 state_.bound_draw_framebuffer.get(), 2890 state_.bound_draw_framebuffer.get(),
2899 GetBackbufferServiceId()); 2891 GetBackbufferServiceId());
2900 } 2892 }
2901 OnFboChanged(); 2893 OnFboChanged();
2902 } 2894 }
2903 2895
2904 void GLES2DecoderImpl::RestoreCurrentTexture2DBindings() { 2896 void GLES2DecoderImpl::RestoreCurrentTextureBindings(GLenum target) {
2905 TextureUnit& info = state_.texture_units[0]; 2897 TextureUnit& info = state_.texture_units[0];
2906 GLuint last_id; 2898 GLuint last_id;
2907 if (info.bound_texture_2d.get()) { 2899 scoped_refptr<TextureRef> texture_ref;
2908 last_id = info.bound_texture_2d->service_id(); 2900 switch (target) {
2901 case GL_TEXTURE_2D:
2902 texture_ref = info.bound_texture_2d;
2903 break;
2904 case GL_TEXTURE_CUBE_MAP:
2905 texture_ref = info.bound_texture_cube_map;
2906 break;
2907 case GL_TEXTURE_EXTERNAL_OES:
2908 texture_ref = info.bound_texture_external_oes;
2909 break;
2910 case GL_TEXTURE_RECTANGLE_ARB:
2911 texture_ref = info.bound_texture_rectangle_arb;
2912 break;
2913 default:
2914 NOTREACHED();
2915 break;
2916 }
2917 if (texture_ref.get()) {
2918 last_id = texture_ref->service_id();
2909 } else { 2919 } else {
2910 last_id = 0; 2920 last_id = 0;
2911 } 2921 }
2912 2922
2913 glBindTexture(GL_TEXTURE_2D, last_id); 2923 glBindTexture(target, last_id);
2914 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit); 2924 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit);
2915 } 2925 }
2916 2926
2917 bool GLES2DecoderImpl::CheckFramebufferValid( 2927 bool GLES2DecoderImpl::CheckFramebufferValid(
2918 Framebuffer* framebuffer, 2928 Framebuffer* framebuffer,
2919 GLenum target, const char* func_name) { 2929 GLenum target, const char* func_name) {
2920 if (!framebuffer) { 2930 if (!framebuffer) {
2921 if (backbuffer_needs_clear_bits_) { 2931 if (backbuffer_needs_clear_bits_) {
2922 glClearColor(0, 0, 0, (GLES2Util::GetChannelsForFormat( 2932 glClearColor(0, 0, 0, (GLES2Util::GetChannelsForFormat(
2923 offscreen_target_color_format_) & 0x0008) != 0 ? 0 : 1); 2933 offscreen_target_color_format_) & 0x0008) != 0 ? 0 : 1);
(...skipping 951 matching lines...) Expand 10 before | Expand all | Expand 10 after
3875 Texture* texture = texture_ref->texture(); 3885 Texture* texture = texture_ref->texture();
3876 3886
3877 // Check the texture exists 3887 // Check the texture exists
3878 // Check that we are not trying to bind it to a different target. 3888 // Check that we are not trying to bind it to a different target.
3879 if (texture->target() != 0 && texture->target() != target) { 3889 if (texture->target() != 0 && texture->target() != target) {
3880 LOCAL_SET_GL_ERROR( 3890 LOCAL_SET_GL_ERROR(
3881 GL_INVALID_OPERATION, 3891 GL_INVALID_OPERATION,
3882 "glBindTexture", "texture bound to more than 1 target."); 3892 "glBindTexture", "texture bound to more than 1 target.");
3883 return; 3893 return;
3884 } 3894 }
3885 if (texture->IsStreamTexture() && target != GL_TEXTURE_EXTERNAL_OES) {
3886 LOCAL_SET_GL_ERROR(
3887 GL_INVALID_OPERATION,
3888 "glBindTexture", "illegal target for stream texture.");
3889 return;
3890 }
3891 LogClientServiceForInfo(texture, client_id, "glBindTexture"); 3895 LogClientServiceForInfo(texture, client_id, "glBindTexture");
3892 if (texture->target() == 0) { 3896 if (texture->target() == 0) {
3893 texture_manager()->SetTarget(texture_ref, target); 3897 texture_manager()->SetTarget(texture_ref, target);
3894 } 3898 }
3895 glBindTexture(target, texture->service_id()); 3899 glBindTexture(target, texture->service_id());
3896 3900
3897 TextureUnit& unit = state_.texture_units[state_.active_texture_unit]; 3901 TextureUnit& unit = state_.texture_units[state_.active_texture_unit];
3898 unit.bind_target = target; 3902 unit.bind_target = target;
3899 switch (target) { 3903 switch (target) {
3900 case GL_TEXTURE_2D: 3904 case GL_TEXTURE_2D:
(...skipping 1761 matching lines...) Expand 10 before | Expand all | Expand 10 after
5662 } 5666 }
5663 // We know there will be no errors, because we only defer compilation on 5667 // We know there will be no errors, because we only defer compilation on
5664 // shaders that were previously compiled successfully. 5668 // shaders that were previously compiled successfully.
5665 program_manager()->ForceCompileShader(shader->deferred_compilation_source(), 5669 program_manager()->ForceCompileShader(shader->deferred_compilation_source(),
5666 shader, 5670 shader,
5667 translator, 5671 translator,
5668 feature_info_.get()); 5672 feature_info_.get());
5669 } 5673 }
5670 } 5674 }
5671 5675
5672 void GLES2DecoderImpl::UpdateStreamTextureIfNeeded(Texture* texture) {
5673 if (texture && texture->IsStreamTexture()) {
5674 DCHECK(stream_texture_manager());
5675 StreamTexture* stream_tex =
5676 stream_texture_manager()->LookupStreamTexture(texture->service_id());
5677 if (stream_tex)
5678 stream_tex->Update();
5679 }
5680 }
5681
5682 bool GLES2DecoderImpl::PrepareTexturesForRender() { 5676 bool GLES2DecoderImpl::PrepareTexturesForRender() {
5683 DCHECK(state_.current_program.get()); 5677 DCHECK(state_.current_program.get());
5684 bool have_unrenderable_textures = 5678 bool have_unrenderable_textures =
5685 texture_manager()->HaveUnrenderableTextures(); 5679 texture_manager()->HaveUnrenderableTextures();
5686 if (!have_unrenderable_textures && !features().oes_egl_image_external) { 5680 if (!have_unrenderable_textures && !features().oes_egl_image_external) {
5687 return true; 5681 return true;
5688 } 5682 }
5689 5683
5690 bool textures_set = false; 5684 bool textures_set = false;
5691 const Program::SamplerIndices& sampler_indices = 5685 const Program::SamplerIndices& sampler_indices =
5692 state_.current_program->sampler_indices(); 5686 state_.current_program->sampler_indices();
5693 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { 5687 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) {
5694 const Program::UniformInfo* uniform_info = 5688 const Program::UniformInfo* uniform_info =
5695 state_.current_program->GetUniformInfo(sampler_indices[ii]); 5689 state_.current_program->GetUniformInfo(sampler_indices[ii]);
5696 DCHECK(uniform_info); 5690 DCHECK(uniform_info);
5697 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { 5691 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) {
5698 GLuint texture_unit_index = uniform_info->texture_units[jj]; 5692 GLuint texture_unit_index = uniform_info->texture_units[jj];
5699 if (texture_unit_index < state_.texture_units.size()) { 5693 if (texture_unit_index < state_.texture_units.size()) {
5700 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; 5694 TextureUnit& texture_unit = state_.texture_units[texture_unit_index];
5701 TextureRef* texture = 5695 TextureRef* texture =
5702 texture_unit.GetInfoForSamplerType(uniform_info->type).get(); 5696 texture_unit.GetInfoForSamplerType(uniform_info->type).get();
5703 if (texture) 5697 if (texture && texture->texture()) {
5704 UpdateStreamTextureIfNeeded(texture->texture()); 5698 scoped_refptr<gfx::GLImage> image = texture->texture()->GetLevelImage(
5699 texture->texture()->target(), 0);
5700 if (image.get())
5701 image->WillUseTexImage();
5702 }
5705 if (have_unrenderable_textures && 5703 if (have_unrenderable_textures &&
5706 (!texture || !texture_manager()->CanRender(texture))) { 5704 (!texture || !texture_manager()->CanRender(texture))) {
5707 textures_set = true; 5705 textures_set = true;
5708 glActiveTexture(GL_TEXTURE0 + texture_unit_index); 5706 glActiveTexture(GL_TEXTURE0 + texture_unit_index);
5709 glBindTexture( 5707 glBindTexture(
5710 GetBindTargetForSamplerType(uniform_info->type), 5708 GetBindTargetForSamplerType(uniform_info->type),
5711 texture_manager()->black_texture_id(uniform_info->type)); 5709 texture_manager()->black_texture_id(uniform_info->type));
5712 LOCAL_RENDER_WARNING( 5710 LOCAL_RENDER_WARNING(
5713 std::string("texture bound to texture unit ") + 5711 std::string("texture bound to texture unit ") +
5714 base::IntToString(texture_unit_index) + 5712 base::IntToString(texture_unit_index) +
(...skipping 3764 matching lines...) Expand 10 before | Expand all | Expand 10 after
9479 *result = GL_ZERO; 9477 *result = GL_ZERO;
9480 TextureRef* texture_ref = texture_manager()->GetTexture(client_id); 9478 TextureRef* texture_ref = texture_manager()->GetTexture(client_id);
9481 if (!texture_ref) { 9479 if (!texture_ref) {
9482 LOCAL_SET_GL_ERROR( 9480 LOCAL_SET_GL_ERROR(
9483 GL_INVALID_VALUE, 9481 GL_INVALID_VALUE,
9484 "glCreateStreamTextureCHROMIUM", "bad texture id."); 9482 "glCreateStreamTextureCHROMIUM", "bad texture id.");
9485 return error::kNoError; 9483 return error::kNoError;
9486 } 9484 }
9487 9485
9488 Texture* texture = texture_ref->texture(); 9486 Texture* texture = texture_ref->texture();
9489 if (texture->IsStreamTexture()) {
9490 LOCAL_SET_GL_ERROR(
9491 GL_INVALID_OPERATION,
9492 "glCreateStreamTextureCHROMIUM", "is already a stream texture.");
9493 return error::kNoError;
9494 }
9495
9496 if (texture->target() && texture->target() != GL_TEXTURE_EXTERNAL_OES) { 9487 if (texture->target() && texture->target() != GL_TEXTURE_EXTERNAL_OES) {
9497 LOCAL_SET_GL_ERROR( 9488 LOCAL_SET_GL_ERROR(
9498 GL_INVALID_OPERATION, 9489 GL_INVALID_OPERATION,
9499 "glCreateStreamTextureCHROMIUM", 9490 "glCreateStreamTextureCHROMIUM",
9500 "is already bound to incompatible target."); 9491 "is already bound to incompatible target.");
9501 return error::kNoError; 9492 return error::kNoError;
9493 } else if (!texture->target()) {
9494 texture_manager()->SetTarget(texture_ref, GL_TEXTURE_EXTERNAL_OES);
9502 } 9495 }
9503 9496
9504 if (!stream_texture_manager()) 9497 scoped_refptr<gfx::GLImage> image =
9505 return error::kInvalidArguments; 9498 gfx::GLImage::CreateGLImageForStreamTexture();
9506 9499
9507 GLuint object_id = stream_texture_manager()->CreateStreamTexture( 9500 {
9508 texture->service_id(), client_id); 9501 ScopedTextureBinder binder(
9502 this, GL_TEXTURE_EXTERNAL_OES, texture->service_id());
9503 if (!image->BindTexImage())
9504 image = NULL;
9505 }
9509 9506
9510 if (object_id) { 9507 uint32 image_id = 0;
9511 texture_manager()->SetStreamTexture(texture_ref, true); 9508 if (image) {
9509 image_id = group_->GetIdAllocator(id_namespaces::kImages)->AllocateID();
9510 image_manager()->AddImage(image, image_id);
9511 texture_manager()->SetLevelInfo(texture_ref,
9512 GL_TEXTURE_EXTERNAL_OES,
9513 0,
9514 GL_RGBA,
9515 0,
9516 0,
9517 1,
9518 0,
9519 GL_RGBA,
9520 GL_UNSIGNED_BYTE,
9521 true);
9522 texture_manager()->SetLevelImage(
9523 texture_ref, GL_TEXTURE_EXTERNAL_OES, 0, image);
9512 } else { 9524 } else {
9513 LOCAL_SET_GL_ERROR( 9525 LOCAL_SET_GL_ERROR(
9514 GL_OUT_OF_MEMORY, 9526 GL_OUT_OF_MEMORY,
9515 "glCreateStreamTextureCHROMIUM", "failed to create platform texture."); 9527 "glCreateStreamTextureCHROMIUM", "failed to create platform texture.");
9516 } 9528 }
9517 9529
9518 *result = object_id; 9530 *result = image_id;
9519 return error::kNoError; 9531 return error::kNoError;
9520 } 9532 }
9521 9533
9522 error::Error GLES2DecoderImpl::HandleDestroyStreamTextureCHROMIUM( 9534 error::Error GLES2DecoderImpl::HandleDestroyStreamTextureCHROMIUM(
9523 uint32 immediate_data_size, 9535 uint32 immediate_data_size,
9524 const cmds::DestroyStreamTextureCHROMIUM& c) { 9536 const cmds::DestroyStreamTextureCHROMIUM& c) {
9525 GLuint client_id = c.texture; 9537 GLuint image_id = c.texture;
9526 TextureRef* texture_ref = texture_manager()->GetTexture(client_id); 9538 if (image_id && image_manager()->LookupImage(image_id)) {
9527 if (texture_ref && texture_manager()->IsStreamTextureOwner(texture_ref)) { 9539 image_manager()->RemoveImage(image_id);
9528 if (!stream_texture_manager()) 9540 group_->GetIdAllocator(id_namespaces::kImages)->FreeID(image_id);
9529 return error::kInvalidArguments;
9530
9531 stream_texture_manager()->DestroyStreamTexture(texture_ref->service_id());
9532 texture_manager()->SetStreamTexture(texture_ref, false);
9533 } else { 9541 } else {
9534 LOCAL_SET_GL_ERROR( 9542 LOCAL_SET_GL_ERROR(
9535 GL_INVALID_VALUE, 9543 GL_INVALID_VALUE,
9536 "glDestroyStreamTextureCHROMIUM", "bad texture id."); 9544 "glDestroyStreamTextureCHROMIUM", "bad texture id.");
9537 } 9545 }
9538 9546
9539 return error::kNoError; 9547 return error::kNoError;
9540 } 9548 }
9541 9549
9542 #if defined(OS_MACOSX) 9550 #if defined(OS_MACOSX)
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
9733 if (!texture_manager()->ValidForTarget(GL_TEXTURE_2D, level, source_width, 9741 if (!texture_manager()->ValidForTarget(GL_TEXTURE_2D, level, source_width,
9734 source_height, 1)) { 9742 source_height, 1)) {
9735 LOCAL_SET_GL_ERROR( 9743 LOCAL_SET_GL_ERROR(
9736 GL_INVALID_VALUE, 9744 GL_INVALID_VALUE,
9737 "glCopyTextureCHROMIUM", "Bad dimensions"); 9745 "glCopyTextureCHROMIUM", "Bad dimensions");
9738 return; 9746 return;
9739 } 9747 }
9740 } 9748 }
9741 9749
9742 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { 9750 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) {
9743 UpdateStreamTextureIfNeeded(source_texture); 9751 scoped_refptr<gfx::GLImage> image =
9744 DCHECK(stream_texture_manager()); 9752 source_texture->GetLevelImage(GL_TEXTURE_EXTERNAL_OES, 0);
9745 StreamTexture* stream_tex = 9753 if (!image) {
9746 stream_texture_manager()->LookupStreamTexture(
9747 source_texture->service_id());
9748 if (!stream_tex) {
9749 LOCAL_SET_GL_ERROR( 9754 LOCAL_SET_GL_ERROR(
9750 GL_INVALID_VALUE, 9755 GL_INVALID_VALUE,
9751 "glCopyTextureChromium", "Stream texture lookup failed"); 9756 "glCopyTextureChromium", "Stream texture lookup failed");
9752 return; 9757 return;
9753 } 9758 }
9754 gfx::Size size = stream_tex->GetSize(); 9759 image->WillUseTexImage();
9760 gfx::Size size = image->GetSize();
9755 source_width = size.width(); 9761 source_width = size.width();
9756 source_height = size.height(); 9762 source_height = size.height();
9757 if (source_width <= 0 || source_height <= 0) { 9763 if (source_width <= 0 || source_height <= 0) {
9758 LOCAL_SET_GL_ERROR( 9764 LOCAL_SET_GL_ERROR(
9759 GL_INVALID_VALUE, 9765 GL_INVALID_VALUE,
9760 "glCopyTextureChromium", "invalid streamtexture size"); 9766 "glCopyTextureChromium", "invalid streamtexture size");
9761 return; 9767 return;
9762 } 9768 }
9763 } 9769 }
9764 9770
(...skipping 24 matching lines...) Expand all
9789 dest_internal_format != internal_format || 9795 dest_internal_format != internal_format ||
9790 dest_type_previous != dest_type) { 9796 dest_type_previous != dest_type) {
9791 // Ensure that the glTexImage2D succeeds. 9797 // Ensure that the glTexImage2D succeeds.
9792 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTextureCHROMIUM"); 9798 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTextureCHROMIUM");
9793 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); 9799 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id());
9794 glTexImage2D( 9800 glTexImage2D(
9795 GL_TEXTURE_2D, level, internal_format, source_width, source_height, 9801 GL_TEXTURE_2D, level, internal_format, source_width, source_height,
9796 0, internal_format, dest_type, NULL); 9802 0, internal_format, dest_type, NULL);
9797 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM"); 9803 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM");
9798 if (error != GL_NO_ERROR) { 9804 if (error != GL_NO_ERROR) {
9799 RestoreCurrentTexture2DBindings(); 9805 RestoreCurrentTextureBindings(GL_TEXTURE_2D);
9800 return; 9806 return;
9801 } 9807 }
9802 9808
9803 texture_manager()->SetLevelInfo( 9809 texture_manager()->SetLevelInfo(
9804 dest_texture_ref, GL_TEXTURE_2D, level, internal_format, source_width, 9810 dest_texture_ref, GL_TEXTURE_2D, level, internal_format, source_width,
9805 source_height, 1, 0, internal_format, dest_type, true); 9811 source_height, 1, 0, internal_format, dest_type, true);
9806 } else { 9812 } else {
9807 texture_manager()->SetLevelCleared( 9813 texture_manager()->SetLevelCleared(
9808 dest_texture_ref, GL_TEXTURE_2D, level, true); 9814 dest_texture_ref, GL_TEXTURE_2D, level, true);
9809 } 9815 }
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after
10503 return error::kNoError; 10509 return error::kNoError;
10504 } 10510 }
10505 10511
10506 // Include the auto-generated part of this file. We split this because it means 10512 // Include the auto-generated part of this file. We split this because it means
10507 // we can easily edit the non-auto generated parts right here in this file 10513 // we can easily edit the non-auto generated parts right here in this file
10508 // instead of having to edit some template or the code generator. 10514 // instead of having to edit some template or the code generator.
10509 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 10515 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
10510 10516
10511 } // namespace gles2 10517 } // namespace gles2
10512 } // namespace gpu 10518 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_mock.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698