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

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

Issue 11516014: Track managed memory usage in the command buffer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Resolve against HEAD Created 8 years 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 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 return size_; 371 return size_;
372 } 372 }
373 373
374 size_t estimated_size() const { 374 size_t estimated_size() const {
375 return memory_tracker_.GetMemRepresented(); 375 return memory_tracker_.GetMemRepresented();
376 } 376 }
377 377
378 private: 378 private:
379 GLES2DecoderImpl* decoder_; 379 GLES2DecoderImpl* decoder_;
380 MemoryTypeTracker memory_tracker_; 380 MemoryTypeTracker memory_tracker_;
381 size_t bytes_allocated_;
381 GLuint id_; 382 GLuint id_;
382 gfx::Size size_; 383 gfx::Size size_;
383 DISALLOW_COPY_AND_ASSIGN(Texture); 384 DISALLOW_COPY_AND_ASSIGN(Texture);
384 }; 385 };
385 386
386 // Encapsulates an OpenGL render buffer of any format. 387 // Encapsulates an OpenGL render buffer of any format.
387 class RenderBuffer { 388 class RenderBuffer {
388 public: 389 public:
389 explicit RenderBuffer(GLES2DecoderImpl* decoder); 390 explicit RenderBuffer(GLES2DecoderImpl* decoder);
390 ~RenderBuffer(); 391 ~RenderBuffer();
(...skipping 16 matching lines...) Expand all
407 return id_; 408 return id_;
408 } 409 }
409 410
410 size_t estimated_size() const { 411 size_t estimated_size() const {
411 return memory_tracker_.GetMemRepresented(); 412 return memory_tracker_.GetMemRepresented();
412 } 413 }
413 414
414 private: 415 private:
415 GLES2DecoderImpl* decoder_; 416 GLES2DecoderImpl* decoder_;
416 MemoryTypeTracker memory_tracker_; 417 MemoryTypeTracker memory_tracker_;
418 size_t bytes_allocated_;
417 GLuint id_; 419 GLuint id_;
418 DISALLOW_COPY_AND_ASSIGN(RenderBuffer); 420 DISALLOW_COPY_AND_ASSIGN(RenderBuffer);
419 }; 421 };
420 422
421 // Encapsulates an OpenGL frame buffer. 423 // Encapsulates an OpenGL frame buffer.
422 class FrameBuffer { 424 class FrameBuffer {
423 public: 425 public:
424 explicit FrameBuffer(GLES2DecoderImpl* decoder); 426 explicit FrameBuffer(GLES2DecoderImpl* decoder);
425 ~FrameBuffer(); 427 ~FrameBuffer();
426 428
(...skipping 1356 matching lines...) Expand 10 before | Expand all | Expand 10 after
1783 } 1785 }
1784 1786
1785 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { 1787 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() {
1786 decoder_->texture_upload_count_++; 1788 decoder_->texture_upload_count_++;
1787 decoder_->total_texture_upload_time_ += 1789 decoder_->total_texture_upload_time_ +=
1788 base::TimeTicks::HighResNow() - begin_time_; 1790 base::TimeTicks::HighResNow() - begin_time_;
1789 } 1791 }
1790 1792
1791 Texture::Texture(GLES2DecoderImpl* decoder) 1793 Texture::Texture(GLES2DecoderImpl* decoder)
1792 : decoder_(decoder), 1794 : decoder_(decoder),
1793 memory_tracker_(decoder->GetContextGroup()->memory_tracker()), 1795 memory_tracker_(decoder->GetContextGroup()->memory_tracker(),
1796 MemoryTracker::Unmanaged),
1797 bytes_allocated_(0),
1794 id_(0) { 1798 id_(0) {
1795 } 1799 }
1796 1800
1797 Texture::~Texture() { 1801 Texture::~Texture() {
1798 // This does not destroy the render texture because that would require that 1802 // This does not destroy the render texture because that would require that
1799 // the associated GL context was current. Just check that it was explicitly 1803 // the associated GL context was current. Just check that it was explicitly
1800 // destroyed. 1804 // destroyed.
1801 DCHECK_EQ(id_, 0u); 1805 DCHECK_EQ(id_, 0u);
1802 } 1806 }
1803 1807
1804 void Texture::Create() { 1808 void Texture::Create() {
1805 ScopedGLErrorSuppressor suppressor(decoder_); 1809 ScopedGLErrorSuppressor suppressor(decoder_);
1806 Destroy(); 1810 Destroy();
1807 glGenTextures(1, &id_); 1811 glGenTextures(1, &id_);
1808 ScopedTexture2DBinder binder(decoder_, id_); 1812 ScopedTexture2DBinder binder(decoder_, id_);
1809 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1813 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1810 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1814 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1811 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 1815 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1812 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 1816 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1813 1817
1814 // TODO(apatrick): Attempt to diagnose crbug.com/97775. If SwapBuffers is 1818 // TODO(apatrick): Attempt to diagnose crbug.com/97775. If SwapBuffers is
1815 // never called on an offscreen context, no data will ever be uploaded to the 1819 // never called on an offscreen context, no data will ever be uploaded to the
1816 // saved offscreen color texture (it is deferred until to when SwapBuffers 1820 // saved offscreen color texture (it is deferred until to when SwapBuffers
1817 // is called). My idea is that some nvidia drivers might have a bug where 1821 // is called). My idea is that some nvidia drivers might have a bug where
1818 // deleting a texture that has never been populated might cause a 1822 // deleting a texture that has never been populated might cause a
1819 // crash. 1823 // crash.
1820 glTexImage2D( 1824 glTexImage2D(
1821 GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 1825 GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
1822 memory_tracker_.UpdateMemRepresented(16u * 16u * 4u); 1826
1827 bytes_allocated_ = 16u * 16u * 4u;
1828 memory_tracker_.TrackMemAlloc(bytes_allocated_);
1823 } 1829 }
1824 1830
1825 bool Texture::AllocateStorage(const gfx::Size& size, GLenum format) { 1831 bool Texture::AllocateStorage(const gfx::Size& size, GLenum format) {
1826 DCHECK_NE(id_, 0u); 1832 DCHECK_NE(id_, 0u);
1827 ScopedGLErrorSuppressor suppressor(decoder_); 1833 ScopedGLErrorSuppressor suppressor(decoder_);
1828 ScopedTexture2DBinder binder(decoder_, id_); 1834 ScopedTexture2DBinder binder(decoder_, id_);
1829 1835
1830 WrappedTexImage2D(GL_TEXTURE_2D, 1836 WrappedTexImage2D(GL_TEXTURE_2D,
1831 0, // mip level 1837 0, // mip level
1832 format, 1838 format,
1833 size.width(), 1839 size.width(),
1834 size.height(), 1840 size.height(),
1835 0, // border 1841 0, // border
1836 format, 1842 format,
1837 GL_UNSIGNED_BYTE, 1843 GL_UNSIGNED_BYTE,
1838 NULL); 1844 NULL);
1839 1845
1840 size_ = size; 1846 size_ = size;
1841 1847
1842 bool success = glGetError() == GL_NO_ERROR; 1848 bool success = glGetError() == GL_NO_ERROR;
1843 if (success) { 1849 if (success) {
1844 uint32 image_size = 0; 1850 uint32 image_size = 0;
1845 GLES2Util::ComputeImageDataSizes( 1851 GLES2Util::ComputeImageDataSizes(
1846 size.width(), size.height(), format, GL_UNSIGNED_BYTE, 4, &image_size, 1852 size.width(), size.height(), format, GL_UNSIGNED_BYTE, 4, &image_size,
1847 NULL, NULL); 1853 NULL, NULL);
1848 memory_tracker_.UpdateMemRepresented(image_size); 1854 memory_tracker_.TrackMemFree(bytes_allocated_);
1855 bytes_allocated_ = image_size;
1856 memory_tracker_.TrackMemAlloc(bytes_allocated_);
1849 } 1857 }
1850 return success; 1858 return success;
1851 } 1859 }
1852 1860
1853 void Texture::Copy(const gfx::Size& size, GLenum format) { 1861 void Texture::Copy(const gfx::Size& size, GLenum format) {
1854 DCHECK_NE(id_, 0u); 1862 DCHECK_NE(id_, 0u);
1855 ScopedGLErrorSuppressor suppressor(decoder_); 1863 ScopedGLErrorSuppressor suppressor(decoder_);
1856 ScopedTexture2DBinder binder(decoder_, id_); 1864 ScopedTexture2DBinder binder(decoder_, id_);
1857 glCopyTexImage2D(GL_TEXTURE_2D, 1865 glCopyTexImage2D(GL_TEXTURE_2D,
1858 0, // level 1866 0, // level
1859 format, 1867 format,
1860 0, 0, 1868 0, 0,
1861 size.width(), 1869 size.width(),
1862 size.height(), 1870 size.height(),
1863 0); // border 1871 0); // border
1864 } 1872 }
1865 1873
1866 void Texture::Destroy() { 1874 void Texture::Destroy() {
1867 if (id_ != 0) { 1875 if (id_ != 0) {
1868 ScopedGLErrorSuppressor suppressor(decoder_); 1876 ScopedGLErrorSuppressor suppressor(decoder_);
1869 glDeleteTextures(1, &id_); 1877 glDeleteTextures(1, &id_);
1870 id_ = 0; 1878 id_ = 0;
1871 memory_tracker_.UpdateMemRepresented(0);
1872 } 1879 }
1880 memory_tracker_.TrackMemFree(bytes_allocated_);
1881 bytes_allocated_ = 0;
1873 } 1882 }
1874 1883
1875 void Texture::Invalidate() { 1884 void Texture::Invalidate() {
1876 id_ = 0; 1885 id_ = 0;
1877 } 1886 }
1878 1887
1879 RenderBuffer::RenderBuffer(GLES2DecoderImpl* decoder) 1888 RenderBuffer::RenderBuffer(GLES2DecoderImpl* decoder)
1880 : decoder_(decoder), 1889 : decoder_(decoder),
1881 memory_tracker_(decoder->GetContextGroup()->memory_tracker()), 1890 memory_tracker_(decoder->GetContextGroup()->memory_tracker(),
1891 MemoryTracker::Unmanaged),
1892 bytes_allocated_(0),
1882 id_(0) { 1893 id_(0) {
1883 } 1894 }
1884 1895
1885 RenderBuffer::~RenderBuffer() { 1896 RenderBuffer::~RenderBuffer() {
1886 // This does not destroy the render buffer because that would require that 1897 // This does not destroy the render buffer because that would require that
1887 // 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
1888 // destroyed. 1899 // destroyed.
1889 DCHECK_EQ(id_, 0u); 1900 DCHECK_EQ(id_, 0u);
1890 } 1901 }
1891 1902
(...skipping 22 matching lines...) Expand all
1914 } else { 1925 } else {
1915 glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 1926 glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER,
1916 samples, 1927 samples,
1917 format, 1928 format,
1918 size.width(), 1929 size.width(),
1919 size.height()); 1930 size.height());
1920 } 1931 }
1921 } 1932 }
1922 bool success = glGetError() == GL_NO_ERROR; 1933 bool success = glGetError() == GL_NO_ERROR;
1923 if (success) { 1934 if (success) {
1924 memory_tracker_.UpdateMemRepresented( 1935 memory_tracker_.TrackMemFree(bytes_allocated_);
1936 bytes_allocated_ =
1925 size.width() * size.height() * samples * 1937 size.width() * size.height() * samples *
1926 GLES2Util::RenderbufferBytesPerPixel(format)); 1938 GLES2Util::RenderbufferBytesPerPixel(format);
1939 memory_tracker_.TrackMemAlloc(bytes_allocated_);
1927 } 1940 }
1928 return success; 1941 return success;
1929 } 1942 }
1930 1943
1931 void RenderBuffer::Destroy() { 1944 void RenderBuffer::Destroy() {
1932 if (id_ != 0) { 1945 if (id_ != 0) {
1933 ScopedGLErrorSuppressor suppressor(decoder_); 1946 ScopedGLErrorSuppressor suppressor(decoder_);
1934 glDeleteRenderbuffersEXT(1, &id_); 1947 glDeleteRenderbuffersEXT(1, &id_);
1935 id_ = 0; 1948 id_ = 0;
1936 memory_tracker_.UpdateMemRepresented(0);
1937 } 1949 }
1950 memory_tracker_.TrackMemFree(bytes_allocated_);
1951 bytes_allocated_ = 0;
1938 } 1952 }
1939 1953
1940 void RenderBuffer::Invalidate() { 1954 void RenderBuffer::Invalidate() {
1941 id_ = 0; 1955 id_ = 0;
1942 } 1956 }
1943 1957
1944 FrameBuffer::FrameBuffer(GLES2DecoderImpl* decoder) 1958 FrameBuffer::FrameBuffer(GLES2DecoderImpl* decoder)
1945 : decoder_(decoder), 1959 : decoder_(decoder),
1946 id_(0) { 1960 id_(0) {
1947 } 1961 }
(...skipping 7704 matching lines...) Expand 10 before | Expand all | Expand 10 after
9652 target, level, xoffset, yoffset, width, height, format, type, pixels); 9666 target, level, xoffset, yoffset, width, height, format, type, pixels);
9653 } 9667 }
9654 9668
9655 // Include the auto-generated part of this file. We split this because it means 9669 // Include the auto-generated part of this file. We split this because it means
9656 // we can easily edit the non-auto generated parts right here in this file 9670 // we can easily edit the non-auto generated parts right here in this file
9657 // instead of having to edit some template or the code generator. 9671 // instead of having to edit some template or the code generator.
9658 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 9672 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
9659 9673
9660 } // namespace gles2 9674 } // namespace gles2
9661 } // namespace gpu 9675 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698