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

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

Issue 12017032: Add calls to EnsureGPUMemoryAvailable into GLES2DecoderImpl (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 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 641 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 } 652 }
653 653
654 ImageManager* image_manager() { 654 ImageManager* image_manager() {
655 return group_->image_manager(); 655 return group_->image_manager();
656 } 656 }
657 657
658 VertexArrayManager* vertex_array_manager() { 658 VertexArrayManager* vertex_array_manager() {
659 return vertex_array_manager_.get(); 659 return vertex_array_manager_.get();
660 } 660 }
661 661
662 MemoryTracker* memory_tracker() {
663 return group_->memory_tracker();
664 }
665
666 bool EnsureGPUMemoryAvailable(size_t estimated_size) {
667 MemoryTracker* tracker = memory_tracker();
668 if (tracker) {
669 return tracker->EnsureGPUMemoryAvailable(estimated_size);
670 }
671 return true;
672 }
673
662 bool IsOffscreenBufferMultisampled() const { 674 bool IsOffscreenBufferMultisampled() const {
663 return offscreen_target_samples_ > 1; 675 return offscreen_target_samples_ > 1;
664 } 676 }
665 677
666 // Creates a TextureInfo for the given texture. 678 // Creates a TextureInfo for the given texture.
667 TextureManager::TextureInfo* CreateTextureInfo( 679 TextureManager::TextureInfo* CreateTextureInfo(
668 GLuint client_id, GLuint service_id) { 680 GLuint client_id, GLuint service_id) {
669 return texture_manager()->CreateTextureInfo(client_id, service_id); 681 return texture_manager()->CreateTextureInfo(client_id, service_id);
670 } 682 }
671 683
(...skipping 1147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1819 } 1831 }
1820 1832
1821 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { 1833 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() {
1822 decoder_->texture_upload_count_++; 1834 decoder_->texture_upload_count_++;
1823 decoder_->total_texture_upload_time_ += 1835 decoder_->total_texture_upload_time_ +=
1824 base::TimeTicks::HighResNow() - begin_time_; 1836 base::TimeTicks::HighResNow() - begin_time_;
1825 } 1837 }
1826 1838
1827 Texture::Texture(GLES2DecoderImpl* decoder) 1839 Texture::Texture(GLES2DecoderImpl* decoder)
1828 : decoder_(decoder), 1840 : decoder_(decoder),
1829 memory_tracker_(decoder->GetContextGroup()->memory_tracker(), 1841 memory_tracker_(decoder->memory_tracker(), MemoryTracker::kUnmanaged),
1830 MemoryTracker::kUnmanaged),
1831 bytes_allocated_(0), 1842 bytes_allocated_(0),
1832 id_(0) { 1843 id_(0) {
1833 } 1844 }
1834 1845
1835 Texture::~Texture() { 1846 Texture::~Texture() {
1836 // This does not destroy the render texture because that would require that 1847 // This does not destroy the render texture because that would require that
1837 // the associated GL context was current. Just check that it was explicitly 1848 // the associated GL context was current. Just check that it was explicitly
1838 // destroyed. 1849 // destroyed.
1839 DCHECK_EQ(id_, 0u); 1850 DCHECK_EQ(id_, 0u);
1840 } 1851 }
(...skipping 14 matching lines...) Expand all
1855 // is called). My idea is that some nvidia drivers might have a bug where 1866 // is called). My idea is that some nvidia drivers might have a bug where
1856 // deleting a texture that has never been populated might cause a 1867 // deleting a texture that has never been populated might cause a
1857 // crash. 1868 // crash.
1858 glTexImage2D( 1869 glTexImage2D(
1859 GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 1870 GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
1860 1871
1861 bytes_allocated_ = 16u * 16u * 4u; 1872 bytes_allocated_ = 16u * 16u * 4u;
1862 memory_tracker_.TrackMemAlloc(bytes_allocated_); 1873 memory_tracker_.TrackMemAlloc(bytes_allocated_);
1863 } 1874 }
1864 1875
1865 bool Texture::AllocateStorage(const gfx::Size& size, GLenum format, 1876 bool Texture::AllocateStorage(const gfx::Size& size, GLenum format, bool zero) {
1866 bool zero) {
1867 DCHECK_NE(id_, 0u); 1877 DCHECK_NE(id_, 0u);
1868 ScopedGLErrorSuppressor suppressor(decoder_); 1878 ScopedGLErrorSuppressor suppressor(decoder_);
1869 ScopedTexture2DBinder binder(decoder_, id_); 1879 ScopedTexture2DBinder binder(decoder_, id_);
1870 uint32 image_size = 0; 1880 uint32 image_size = 0;
1871 GLES2Util::ComputeImageDataSizes( 1881 GLES2Util::ComputeImageDataSizes(
1872 size.width(), size.height(), format, GL_UNSIGNED_BYTE, 8, &image_size, 1882 size.width(), size.height(), format, GL_UNSIGNED_BYTE, 8, &image_size,
1873 NULL, NULL); 1883 NULL, NULL);
1874 1884
1885 if (!memory_tracker_.EnsureGPUMemoryAvailable(image_size)) {
1886 return false;
1887 }
1888
1875 scoped_array<char> zero_data; 1889 scoped_array<char> zero_data;
1876 if (zero) { 1890 if (zero) {
1877 zero_data.reset(new char[image_size]); 1891 zero_data.reset(new char[image_size]);
1878 memset(zero_data.get(), 0, image_size); 1892 memset(zero_data.get(), 0, image_size);
1879 } 1893 }
1880 1894
1881 WrappedTexImage2D(GL_TEXTURE_2D, 1895 WrappedTexImage2D(GL_TEXTURE_2D,
1882 0, // mip level 1896 0, // mip level
1883 format, 1897 format,
1884 size.width(), 1898 size.width(),
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1921 memory_tracker_.TrackMemFree(bytes_allocated_); 1935 memory_tracker_.TrackMemFree(bytes_allocated_);
1922 bytes_allocated_ = 0; 1936 bytes_allocated_ = 0;
1923 } 1937 }
1924 1938
1925 void Texture::Invalidate() { 1939 void Texture::Invalidate() {
1926 id_ = 0; 1940 id_ = 0;
1927 } 1941 }
1928 1942
1929 RenderBuffer::RenderBuffer(GLES2DecoderImpl* decoder) 1943 RenderBuffer::RenderBuffer(GLES2DecoderImpl* decoder)
1930 : decoder_(decoder), 1944 : decoder_(decoder),
1931 memory_tracker_(decoder->GetContextGroup()->memory_tracker(), 1945 memory_tracker_(decoder->memory_tracker(), MemoryTracker::kUnmanaged),
1932 MemoryTracker::kUnmanaged),
1933 bytes_allocated_(0), 1946 bytes_allocated_(0),
1934 id_(0) { 1947 id_(0) {
1935 } 1948 }
1936 1949
1937 RenderBuffer::~RenderBuffer() { 1950 RenderBuffer::~RenderBuffer() {
1938 // This does not destroy the render buffer because that would require that 1951 // This does not destroy the render buffer because that would require that
1939 // the associated GL context was current. Just check that it was explicitly 1952 // the associated GL context was current. Just check that it was explicitly
1940 // destroyed. 1953 // destroyed.
1941 DCHECK_EQ(id_, 0u); 1954 DCHECK_EQ(id_, 0u);
1942 } 1955 }
1943 1956
1944 void RenderBuffer::Create() { 1957 void RenderBuffer::Create() {
1945 ScopedGLErrorSuppressor suppressor(decoder_); 1958 ScopedGLErrorSuppressor suppressor(decoder_);
1946 Destroy(); 1959 Destroy();
1947 glGenRenderbuffersEXT(1, &id_); 1960 glGenRenderbuffersEXT(1, &id_);
1948 } 1961 }
1949 1962
1950 bool RenderBuffer::AllocateStorage(const gfx::Size& size, GLenum format, 1963 bool RenderBuffer::AllocateStorage(const gfx::Size& size, GLenum format,
1951 GLsizei samples) { 1964 GLsizei samples) {
1952 ScopedGLErrorSuppressor suppressor(decoder_); 1965 ScopedGLErrorSuppressor suppressor(decoder_);
1953 ScopedRenderBufferBinder binder(decoder_, id_); 1966 ScopedRenderBufferBinder binder(decoder_, id_);
1967
1968 uint32 estimated_size = 0;
1969 if (!RenderbufferManager::ComputeEstimatedRenderbufferSize(
1970 size.width(), size.height(), samples, format, &estimated_size)) {
1971 return false;
1972 }
1973
1974 if (!memory_tracker_.EnsureGPUMemoryAvailable(estimated_size)) {
1975 return false;
1976 }
1977
1954 if (samples <= 1) { 1978 if (samples <= 1) {
1955 glRenderbufferStorageEXT(GL_RENDERBUFFER, 1979 glRenderbufferStorageEXT(GL_RENDERBUFFER,
1956 format, 1980 format,
1957 size.width(), 1981 size.width(),
1958 size.height()); 1982 size.height());
1959 } else { 1983 } else {
1960 if (GLES2Decoder::IsAngle()) { 1984 if (GLES2Decoder::IsAngle()) {
1961 glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1985 glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER,
1962 samples, 1986 samples,
1963 format, 1987 format,
1964 size.width(), 1988 size.width(),
1965 size.height()); 1989 size.height());
1966 } else { 1990 } else {
1967 glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 1991 glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER,
1968 samples, 1992 samples,
1969 format, 1993 format,
1970 size.width(), 1994 size.width(),
1971 size.height()); 1995 size.height());
1972 } 1996 }
1973 } 1997 }
1974 bool success = glGetError() == GL_NO_ERROR; 1998 bool success = glGetError() == GL_NO_ERROR;
1975 if (success) { 1999 if (success) {
1976 memory_tracker_.TrackMemFree(bytes_allocated_); 2000 memory_tracker_.TrackMemFree(bytes_allocated_);
1977 bytes_allocated_ = 2001 bytes_allocated_ = estimated_size;
1978 size.width() * size.height() * samples *
1979 GLES2Util::RenderbufferBytesPerPixel(format);
1980 memory_tracker_.TrackMemAlloc(bytes_allocated_); 2002 memory_tracker_.TrackMemAlloc(bytes_allocated_);
1981 } 2003 }
1982 return success; 2004 return success;
1983 } 2005 }
1984 2006
1985 void RenderBuffer::Destroy() { 2007 void RenderBuffer::Destroy() {
1986 if (id_ != 0) { 2008 if (id_ != 0) {
1987 ScopedGLErrorSuppressor suppressor(decoder_); 2009 ScopedGLErrorSuppressor suppressor(decoder_);
1988 glDeleteRenderbuffersEXT(1, &id_); 2010 glDeleteRenderbuffersEXT(1, &id_);
1989 id_ = 0; 2011 id_ = 0;
(...skipping 2785 matching lines...) Expand 10 before | Expand all | Expand 10 after
4775 if (!features().chromium_framebuffer_multisample) { 4797 if (!features().chromium_framebuffer_multisample) {
4776 SetGLError(GL_INVALID_OPERATION, 4798 SetGLError(GL_INVALID_OPERATION,
4777 "glRenderbufferStorageMultisampleEXT", "function not available"); 4799 "glRenderbufferStorageMultisampleEXT", "function not available");
4778 return; 4800 return;
4779 } 4801 }
4780 4802
4781 RenderbufferManager::RenderbufferInfo* renderbuffer = 4803 RenderbufferManager::RenderbufferInfo* renderbuffer =
4782 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); 4804 GetRenderbufferInfoForTarget(GL_RENDERBUFFER);
4783 if (!renderbuffer) { 4805 if (!renderbuffer) {
4784 SetGLError(GL_INVALID_OPERATION, 4806 SetGLError(GL_INVALID_OPERATION,
4785 "glGetRenderbufferStorageMultisample", "no renderbuffer bound"); 4807 "glRenderbufferStorageMultisampleEXT", "no renderbuffer bound");
4786 return; 4808 return;
4787 } 4809 }
4788 4810
4789 if (samples > renderbuffer_manager()->max_samples()) { 4811 if (samples > renderbuffer_manager()->max_samples()) {
4790 SetGLError(GL_INVALID_VALUE, 4812 SetGLError(GL_INVALID_VALUE,
4791 "glGetRenderbufferStorageMultisample", "samples too large"); 4813 "glRenderbufferStorageMultisampleEXT", "samples too large");
4792 return; 4814 return;
4793 } 4815 }
4794 4816
4795 if (width > renderbuffer_manager()->max_renderbuffer_size() || 4817 if (width > renderbuffer_manager()->max_renderbuffer_size() ||
4796 height > renderbuffer_manager()->max_renderbuffer_size()) { 4818 height > renderbuffer_manager()->max_renderbuffer_size()) {
4797 SetGLError(GL_INVALID_VALUE, 4819 SetGLError(GL_INVALID_VALUE,
4798 "glGetRenderbufferStorageMultisample", "size too large"); 4820 "glRenderbufferStorageMultisample", "dimensions too large");
4799 return; 4821 return;
4800 } 4822 }
4801 4823
4802 GLenum impl_format = internalformat; 4824 uint32 estimated_size = 0;
4803 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { 4825 if (!RenderbufferManager::ComputeEstimatedRenderbufferSize(
4804 switch (impl_format) { 4826 width, height, samples, internalformat, &estimated_size)) {
4805 case GL_DEPTH_COMPONENT16: 4827 SetGLError(GL_OUT_OF_MEMORY,
4806 impl_format = GL_DEPTH_COMPONENT; 4828 "glRenderbufferStorageMultsampleEXT", "dimensions too large");
4807 break; 4829 return;
4808 case GL_RGBA4:
4809 case GL_RGB5_A1:
4810 impl_format = GL_RGBA;
4811 break;
4812 case GL_RGB565:
4813 impl_format = GL_RGB;
4814 break;
4815 }
4816 } 4830 }
4817 4831
4832 if (!EnsureGPUMemoryAvailable(estimated_size)) {
4833 SetGLError(GL_OUT_OF_MEMORY,
4834 "glRenderbufferStorageMultsampleEXT", "out of memory");
4835 return;
4836 }
4837
4838 GLenum impl_format = RenderbufferManager::
4839 InternalRenderbufferFormatToImplFormat(internalformat);
4818 CopyRealGLErrorsToWrapper(); 4840 CopyRealGLErrorsToWrapper();
4819 if (IsAngle()) { 4841 if (IsAngle()) {
4820 glRenderbufferStorageMultisampleANGLE( 4842 glRenderbufferStorageMultisampleANGLE(
4821 target, samples, impl_format, width, height); 4843 target, samples, impl_format, width, height);
4822 } else { 4844 } else {
4823 glRenderbufferStorageMultisampleEXT( 4845 glRenderbufferStorageMultisampleEXT(
4824 target, samples, impl_format, width, height); 4846 target, samples, impl_format, width, height);
4825 } 4847 }
4826 GLenum error = PeekGLError(); 4848 GLenum error = PeekGLError();
4827 if (error == GL_NO_ERROR) { 4849 if (error == GL_NO_ERROR) {
4828 // TODO(gman): If renderbuffers tracked which framebuffers they were 4850 // TODO(gman): If renderbuffers tracked which framebuffers they were
4829 // attached to we could just mark those framebuffers as not complete. 4851 // attached to we could just mark those framebuffers as not complete.
4830 framebuffer_manager()->IncFramebufferStateChangeCount(); 4852 framebuffer_manager()->IncFramebufferStateChangeCount();
4831 renderbuffer_manager()->SetInfo( 4853 renderbuffer_manager()->SetInfo(
4832 renderbuffer, samples, internalformat, width, height); 4854 renderbuffer, samples, internalformat, width, height);
4833 } 4855 }
4834 } 4856 }
4835 4857
4836 void GLES2DecoderImpl::DoRenderbufferStorage( 4858 void GLES2DecoderImpl::DoRenderbufferStorage(
4837 GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { 4859 GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {
4838 RenderbufferManager::RenderbufferInfo* renderbuffer = 4860 RenderbufferManager::RenderbufferInfo* renderbuffer =
4839 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); 4861 GetRenderbufferInfoForTarget(GL_RENDERBUFFER);
4840 if (!renderbuffer) { 4862 if (!renderbuffer) {
4841 SetGLError(GL_INVALID_OPERATION, 4863 SetGLError(GL_INVALID_OPERATION,
4842 "glGetRenderbufferStorage", "no renderbuffer bound"); 4864 "glRenderbufferStorage", "no renderbuffer bound");
4843 return; 4865 return;
4844 } 4866 }
4845 4867
4846 if (width > renderbuffer_manager()->max_renderbuffer_size() || 4868 if (width > renderbuffer_manager()->max_renderbuffer_size() ||
4847 height > renderbuffer_manager()->max_renderbuffer_size()) { 4869 height > renderbuffer_manager()->max_renderbuffer_size()) {
4848 SetGLError(GL_INVALID_VALUE, 4870 SetGLError(GL_INVALID_VALUE,
4849 "glGetRenderbufferStorage", "size too large"); 4871 "glRenderbufferStorage", "dimensions too large");
4850 return; 4872 return;
4851 } 4873 }
4852 4874
4853 GLenum impl_format = internalformat; 4875 uint32 estimated_size = 0;
4854 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { 4876 if (!RenderbufferManager::ComputeEstimatedRenderbufferSize(
4855 switch (impl_format) { 4877 width, height, 1, internalformat, &estimated_size)) {
4856 case GL_DEPTH_COMPONENT16: 4878 SetGLError(GL_OUT_OF_MEMORY, "glRenderbufferStorage",
4857 impl_format = GL_DEPTH_COMPONENT; 4879 "dimensions too large");
4858 break; 4880 return;
4859 case GL_RGBA4: 4881 }
4860 case GL_RGB5_A1: 4882
4861 impl_format = GL_RGBA; 4883 if (!EnsureGPUMemoryAvailable(estimated_size)) {
4862 break; 4884 SetGLError(GL_OUT_OF_MEMORY, "glRenderbufferStorage", "out of memory");
4863 case GL_RGB565: 4885 return;
4864 impl_format = GL_RGB;
4865 break;
4866 }
4867 } 4886 }
4868 4887
4869 CopyRealGLErrorsToWrapper(); 4888 CopyRealGLErrorsToWrapper();
4870 glRenderbufferStorageEXT(target, impl_format, width, height); 4889 glRenderbufferStorageEXT(
4890 target, RenderbufferManager::
4891 InternalRenderbufferFormatToImplFormat(internalformat),
4892 width, height);
4871 GLenum error = PeekGLError(); 4893 GLenum error = PeekGLError();
4872 if (error == GL_NO_ERROR) { 4894 if (error == GL_NO_ERROR) {
4873 // TODO(gman): If tetxures tracked which framebuffers they were attached to 4895 // TODO(gman): If tetxures tracked which framebuffers they were attached to
4874 // we could just mark those framebuffers as not complete. 4896 // we could just mark those framebuffers as not complete.
4875 framebuffer_manager()->IncFramebufferStateChangeCount(); 4897 framebuffer_manager()->IncFramebufferStateChangeCount();
4876 renderbuffer_manager()->SetInfo( 4898 renderbuffer_manager()->SetInfo(
4877 renderbuffer, 0, internalformat, width, height); 4899 renderbuffer, 1, internalformat, width, height);
4878 } 4900 }
4879 } 4901 }
4880 4902
4881 void GLES2DecoderImpl::DoLinkProgram(GLuint program) { 4903 void GLES2DecoderImpl::DoLinkProgram(GLuint program) {
4882 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoLinkProgram"); 4904 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoLinkProgram");
4883 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( 4905 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
4884 program, "glLinkProgram"); 4906 program, "glLinkProgram");
4885 if (!info) { 4907 if (!info) {
4886 return; 4908 return;
4887 } 4909 }
(...skipping 2196 matching lines...) Expand 10 before | Expand all | Expand 10 after
7084 } 7106 }
7085 if (size < 0) { 7107 if (size < 0) {
7086 SetGLError(GL_INVALID_VALUE, "glBufferData", "size < 0"); 7108 SetGLError(GL_INVALID_VALUE, "glBufferData", "size < 0");
7087 return; 7109 return;
7088 } 7110 }
7089 BufferManager::BufferInfo* info = GetBufferInfoForTarget(target); 7111 BufferManager::BufferInfo* info = GetBufferInfoForTarget(target);
7090 if (!info) { 7112 if (!info) {
7091 SetGLError(GL_INVALID_VALUE, "glBufferData", "unknown buffer"); 7113 SetGLError(GL_INVALID_VALUE, "glBufferData", "unknown buffer");
7092 return; 7114 return;
7093 } 7115 }
7116
7117 if (!EnsureGPUMemoryAvailable(size)) {
7118 SetGLError(GL_OUT_OF_MEMORY, "glBufferData", "out of memory");
7119 return;
7120 }
7121
7094 // Clear the buffer to 0 if no initial data was passed in. 7122 // Clear the buffer to 0 if no initial data was passed in.
7095 scoped_array<int8> zero; 7123 scoped_array<int8> zero;
7096 if (!data) { 7124 if (!data) {
7097 zero.reset(new int8[size]); 7125 zero.reset(new int8[size]);
7098 memset(zero.get(), 0, size); 7126 memset(zero.get(), 0, size);
7099 data = zero.get(); 7127 data = zero.get();
7100 } 7128 }
7101 7129
7102 CopyRealGLErrorsToWrapper(); 7130 CopyRealGLErrorsToWrapper();
7103 glBufferData(target, size, data, usage); 7131 glBufferData(target, size, data, usage);
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
7435 return error::kNoError; 7463 return error::kNoError;
7436 } 7464 }
7437 7465
7438 if (!ValidateCompressedTexDimensions( 7466 if (!ValidateCompressedTexDimensions(
7439 "glCompressedTexImage2D", level, width, height, internal_format) || 7467 "glCompressedTexImage2D", level, width, height, internal_format) ||
7440 !ValidateCompressedTexFuncData( 7468 !ValidateCompressedTexFuncData(
7441 "glCompressedTexImage2D", width, height, internal_format, image_size)) { 7469 "glCompressedTexImage2D", width, height, internal_format, image_size)) {
7442 return error::kNoError; 7470 return error::kNoError;
7443 } 7471 }
7444 7472
7473 if (!EnsureGPUMemoryAvailable(image_size)) {
7474 SetGLError(GL_OUT_OF_MEMORY, "glCompressedTexImage2D", "out of memory");
7475 return error::kNoError;
7476 }
7477
7445 if (info->IsAttachedToFramebuffer()) { 7478 if (info->IsAttachedToFramebuffer()) {
7446 clear_state_dirty_ = true; 7479 clear_state_dirty_ = true;
7447 // TODO(gman): If textures tracked which framebuffers they were attached to 7480 // TODO(gman): If textures tracked which framebuffers they were attached to
7448 // we could just mark those framebuffers as not complete. 7481 // we could just mark those framebuffers as not complete.
7449 framebuffer_manager()->IncFramebufferStateChangeCount(); 7482 framebuffer_manager()->IncFramebufferStateChangeCount();
7450 } 7483 }
7451 7484
7452 scoped_array<int8> zero; 7485 scoped_array<int8> zero;
7453 if (!data) { 7486 if (!data) {
7454 zero.reset(new int8[image_size]); 7487 zero.reset(new int8[image_size]);
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
7669 GLsizei height, 7702 GLsizei height,
7670 GLint border, 7703 GLint border,
7671 GLenum format, 7704 GLenum format,
7672 GLenum type, 7705 GLenum type,
7673 const void* pixels, 7706 const void* pixels,
7674 uint32 pixels_size) { 7707 uint32 pixels_size) {
7675 if (!ValidateTexImage2D("glTexImage2D", target, level, internal_format, 7708 if (!ValidateTexImage2D("glTexImage2D", target, level, internal_format,
7676 width, height, border, format, type, pixels, pixels_size)) { 7709 width, height, border, format, type, pixels, pixels_size)) {
7677 return; 7710 return;
7678 } 7711 }
7712
7713 if (!EnsureGPUMemoryAvailable(pixels_size)) {
7714 SetGLError(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory");
7715 return;
7716 }
7717
7679 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); 7718 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
7680 GLsizei tex_width = 0; 7719 GLsizei tex_width = 0;
7681 GLsizei tex_height = 0; 7720 GLsizei tex_height = 0;
7682 GLenum tex_type = 0; 7721 GLenum tex_type = 0;
7683 GLenum tex_format = 0; 7722 GLenum tex_format = 0;
7684 bool level_is_same = 7723 bool level_is_same =
7685 info->GetLevelSize(target, level, &tex_width, &tex_height) && 7724 info->GetLevelSize(target, level, &tex_width, &tex_height) &&
7686 info->GetLevelType(target, level, &tex_type, &tex_format) && 7725 info->GetLevelType(target, level, &tex_type, &tex_format) &&
7687 width == tex_width && height == tex_height && 7726 width == tex_width && height == tex_height &&
7688 type == tex_type && format == tex_format; 7727 type == tex_type && format == tex_format;
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
7895 uint32 channels_needed = GLES2Util::GetChannelsForFormat(internal_format); 7934 uint32 channels_needed = GLES2Util::GetChannelsForFormat(internal_format);
7896 7935
7897 if ((channels_needed & channels_exist) != channels_needed) { 7936 if ((channels_needed & channels_exist) != channels_needed) {
7898 SetGLError(GL_INVALID_OPERATION, "glCopyTexImage2D", "incompatible format"); 7937 SetGLError(GL_INVALID_OPERATION, "glCopyTexImage2D", "incompatible format");
7899 return; 7938 return;
7900 } 7939 }
7901 7940
7902 if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { 7941 if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) {
7903 SetGLError( 7942 SetGLError(
7904 GL_INVALID_OPERATION, 7943 GL_INVALID_OPERATION,
7905 "glCopyImage2D", "can not be used with depth or stencil textures"); 7944 "glCopyTexImage2D", "can not be used with depth or stencil textures");
7906 return; 7945 return;
7907 } 7946 }
7908 7947
7948 uint32 estimated_size = 0;
7949 if (!GLES2Util::ComputeImageDataSizes(
7950 width, height, internal_format, GL_UNSIGNED_BYTE, state_.unpack_alignment,
7951 &estimated_size, NULL, NULL)) {
7952 SetGLError(GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too large");
7953 return;
7954 }
7955
7956 if (!EnsureGPUMemoryAvailable(estimated_size)) {
7957 SetGLError(GL_OUT_OF_MEMORY, "glCopyTexImage2D", "out of memory");
7958 return;
7959 }
7960
7909 if (!CheckBoundFramebuffersValid("glCopyTexImage2D")) { 7961 if (!CheckBoundFramebuffersValid("glCopyTexImage2D")) {
7910 return; 7962 return;
7911 } 7963 }
7912 7964
7913 CopyRealGLErrorsToWrapper(); 7965 CopyRealGLErrorsToWrapper();
7914 ScopedResolvedFrameBufferBinder binder(this, false, true); 7966 ScopedResolvedFrameBufferBinder binder(this, false, true);
7915 gfx::Size size = GetBoundReadFrameBufferSize(); 7967 gfx::Size size = GetBoundReadFrameBufferSize();
7916 7968
7917 if (info->IsAttachedToFramebuffer()) { 7969 if (info->IsAttachedToFramebuffer()) {
7918 clear_state_dirty_ = true; 7970 clear_state_dirty_ = true;
(...skipping 1649 matching lines...) Expand 10 before | Expand all | Expand 10 after
9568 return; 9620 return;
9569 } 9621 }
9570 if (info->IsAttachedToFramebuffer()) { 9622 if (info->IsAttachedToFramebuffer()) {
9571 clear_state_dirty_ = true; 9623 clear_state_dirty_ = true;
9572 } 9624 }
9573 if (info->IsImmutable()) { 9625 if (info->IsImmutable()) {
9574 SetGLError(GL_INVALID_OPERATION, 9626 SetGLError(GL_INVALID_OPERATION,
9575 "glTexStorage2DEXT", "texture is immutable"); 9627 "glTexStorage2DEXT", "texture is immutable");
9576 return; 9628 return;
9577 } 9629 }
9630
9631 GLenum format = ExtractFormatFromStorageFormat(internal_format);
9632 GLenum type = ExtractTypeFromStorageFormat(internal_format);
9633
9634 {
9635 GLsizei level_width = width;
9636 GLsizei level_height = height;
9637 uint32 estimated_size = 0;
9638 for (int ii = 0; ii < levels; ++ii) {
9639 uint32 level_size = 0;
9640 if (!GLES2Util::ComputeImageDataSizes(
9641 level_width, level_height, format, type, state_.unpack_alignment,
9642 &estimated_size, NULL, NULL) ||
9643 !SafeAddUint32(estimated_size, level_size, &estimated_size)) {
9644 SetGLError(GL_OUT_OF_MEMORY,
9645 "glTexStorage2DEXT", "dimensions too large");
9646 return;
9647 }
9648 level_width = std::max(1, level_width >> 1);
9649 level_height = std::max(1, level_height >> 1);
9650 }
9651 if (!EnsureGPUMemoryAvailable(estimated_size)) {
9652 SetGLError(GL_OUT_OF_MEMORY, "glTexStorage2DEXT", "out of memory");
9653 return;
9654 }
9655 }
9656
9578 CopyRealGLErrorsToWrapper(); 9657 CopyRealGLErrorsToWrapper();
9579 glTexStorage2DEXT(target, levels, GetTexInternalFormat(internal_format), 9658 glTexStorage2DEXT(target, levels, GetTexInternalFormat(internal_format),
9580 width, height); 9659 width, height);
9581 GLenum error = PeekGLError(); 9660 GLenum error = PeekGLError();
9582 if (error == GL_NO_ERROR) { 9661 if (error == GL_NO_ERROR) {
9583 GLenum format = ExtractFormatFromStorageFormat(internal_format);
9584 GLenum type = ExtractTypeFromStorageFormat(internal_format);
9585 GLsizei level_width = width; 9662 GLsizei level_width = width;
9586 GLsizei level_height = height; 9663 GLsizei level_height = height;
9587 for (int ii = 0; ii < levels; ++ii) { 9664 for (int ii = 0; ii < levels; ++ii) {
9588 texture_manager()->SetLevelInfo( 9665 texture_manager()->SetLevelInfo(
9589 info, target, ii, format, level_width, level_height, 1, 0, format, 9666 info, target, ii, format, level_width, level_height, 1, 0, format,
9590 type, false); 9667 type, false);
9591 level_width = std::max(1, level_width >> 1); 9668 level_width = std::max(1, level_width >> 1);
9592 level_height = std::max(1, level_height >> 1); 9669 level_height = std::max(1, level_height >> 1);
9593 } 9670 }
9594 info->SetImmutable(true); 9671 info->SetImmutable(true);
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
9876 "glAsyncTexImage2DCHROMIUM", info, target, level, pixels)) 9953 "glAsyncTexImage2DCHROMIUM", info, target, level, pixels))
9877 return error::kNoError; 9954 return error::kNoError;
9878 9955
9879 // Don't allow async redefinition of a textures. 9956 // Don't allow async redefinition of a textures.
9880 if (info->IsDefined()) { 9957 if (info->IsDefined()) {
9881 SetGLError(GL_INVALID_OPERATION, 9958 SetGLError(GL_INVALID_OPERATION,
9882 "glAsyncTexImage2DCHROMIUM", "already defined"); 9959 "glAsyncTexImage2DCHROMIUM", "already defined");
9883 return error::kNoError; 9960 return error::kNoError;
9884 } 9961 }
9885 9962
9963 if (!EnsureGPUMemoryAvailable(pixels_size)) {
9964 SetGLError(GL_OUT_OF_MEMORY, "glAsyncTexImage2DCHROMIUM", "out of memory");
9965 return error::kNoError;
9966 }
9967
9886 // We know the memory/size is safe, so get the real shared memory since 9968 // We know the memory/size is safe, so get the real shared memory since
9887 // it might need to be duped to prevent use-after-free of the memory. 9969 // it might need to be duped to prevent use-after-free of the memory.
9888 Buffer buffer = GetSharedMemoryBuffer(c.pixels_shm_id); 9970 Buffer buffer = GetSharedMemoryBuffer(c.pixels_shm_id);
9889 base::SharedMemory* shared_memory = buffer.shared_memory; 9971 base::SharedMemory* shared_memory = buffer.shared_memory;
9890 uint32 shm_size = buffer.size; 9972 uint32 shm_size = buffer.size;
9891 uint32 shm_data_offset = c.pixels_shm_offset; 9973 uint32 shm_data_offset = c.pixels_shm_offset;
9892 uint32 shm_data_size = pixels_size; 9974 uint32 shm_data_size = pixels_size;
9893 9975
9894 // Set up the async state if needed, and make the texture 9976 // Set up the async state if needed, and make the texture
9895 // immutable so the async state stays valid. The level info 9977 // immutable so the async state stays valid. The level info
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
9995 return error::kNoError; 10077 return error::kNoError;
9996 } 10078 }
9997 10079
9998 // Include the auto-generated part of this file. We split this because it means 10080 // Include the auto-generated part of this file. We split this because it means
9999 // we can easily edit the non-auto generated parts right here in this file 10081 // we can easily edit the non-auto generated parts right here in this file
10000 // instead of having to edit some template or the code generator. 10082 // instead of having to edit some template or the code generator.
10001 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 10083 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
10002 10084
10003 } // namespace gles2 10085 } // namespace gles2
10004 } // namespace gpu 10086 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/common/gles2_cmd_utils.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698