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

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

Issue 7218056: Re-Fixes Texture::Copy (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 5 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 explicit Texture(GLES2DecoderImpl* decoder); 237 explicit Texture(GLES2DecoderImpl* decoder);
238 ~Texture(); 238 ~Texture();
239 239
240 // Create a new render texture. 240 // Create a new render texture.
241 void Create(); 241 void Create();
242 242
243 // Set the initial size and format of a render texture or resize it. 243 // Set the initial size and format of a render texture or resize it.
244 bool AllocateStorage(const gfx::Size& size, GLenum format); 244 bool AllocateStorage(const gfx::Size& size, GLenum format);
245 245
246 // Copy the contents of the currently bound frame buffer. 246 // Copy the contents of the currently bound frame buffer.
247 void Copy(const gfx::Size& size); 247 void Copy(const gfx::Size& size, GLenum format);
248 248
249 // Destroy the render texture. This must be explicitly called before 249 // Destroy the render texture. This must be explicitly called before
250 // destroying this object. 250 // destroying this object.
251 void Destroy(); 251 void Destroy();
252 252
253 // Invalidate the texture. This can be used when a context is lost and it is 253 // Invalidate the texture. This can be used when a context is lost and it is
254 // not possible to make it current in order to free the resource. 254 // not possible to make it current in order to free the resource.
255 void Invalidate(); 255 void Invalidate();
256 256
257 GLuint id() const { 257 GLuint id() const {
258 return id_; 258 return id_;
259 } 259 }
260 260
261 gfx::Size size() const { 261 gfx::Size size() const {
262 return size_; 262 return size_;
263 } 263 }
264 264
265 private: 265 private:
266 GLES2DecoderImpl* decoder_; 266 GLES2DecoderImpl* decoder_;
267 GLuint id_; 267 GLuint id_;
268 GLenum format_;
269 gfx::Size size_; 268 gfx::Size size_;
270 DISALLOW_COPY_AND_ASSIGN(Texture); 269 DISALLOW_COPY_AND_ASSIGN(Texture);
271 }; 270 };
272 271
273 // Encapsulates an OpenGL render buffer of any format. 272 // Encapsulates an OpenGL render buffer of any format.
274 class RenderBuffer { 273 class RenderBuffer {
275 public: 274 public:
276 explicit RenderBuffer(GLES2DecoderImpl* decoder); 275 explicit RenderBuffer(GLES2DecoderImpl* decoder);
277 ~RenderBuffer(); 276 ~RenderBuffer();
278 277
(...skipping 1365 matching lines...) Expand 10 before | Expand all | Expand 10 after
1644 1643
1645 ScopedGLErrorSuppressor suppressor(decoder_); 1644 ScopedGLErrorSuppressor suppressor(decoder_);
1646 decoder_->RestoreCurrentFramebufferBindings(); 1645 decoder_->RestoreCurrentFramebufferBindings();
1647 if (decoder_->enable_scissor_test_) { 1646 if (decoder_->enable_scissor_test_) {
1648 glEnable(GL_SCISSOR_TEST); 1647 glEnable(GL_SCISSOR_TEST);
1649 } 1648 }
1650 } 1649 }
1651 1650
1652 Texture::Texture(GLES2DecoderImpl* decoder) 1651 Texture::Texture(GLES2DecoderImpl* decoder)
1653 : decoder_(decoder), 1652 : decoder_(decoder),
1654 id_(0), 1653 id_(0) {
1655 format_(0) {
1656 } 1654 }
1657 1655
1658 Texture::~Texture() { 1656 Texture::~Texture() {
1659 // This does not destroy the render texture because that would require that 1657 // This does not destroy the render texture because that would require that
1660 // the associated GL context was current. Just check that it was explicitly 1658 // the associated GL context was current. Just check that it was explicitly
1661 // destroyed. 1659 // destroyed.
1662 DCHECK_EQ(id_, 0u); 1660 DCHECK_EQ(id_, 0u);
1663 } 1661 }
1664 1662
1665 void Texture::Create() { 1663 void Texture::Create() {
1666 ScopedGLErrorSuppressor suppressor(decoder_); 1664 ScopedGLErrorSuppressor suppressor(decoder_);
1667 Destroy(); 1665 Destroy();
1668 glGenTextures(1, &id_); 1666 glGenTextures(1, &id_);
1667 ScopedTexture2DBinder binder(decoder_, id_);
1668 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1669 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1670 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1671 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1669 } 1672 }
1670 1673
1671 bool Texture::AllocateStorage(const gfx::Size& size, GLenum format) { 1674 bool Texture::AllocateStorage(const gfx::Size& size, GLenum format) {
1672 DCHECK_NE(id_, 0u); 1675 DCHECK_NE(id_, 0u);
1673 ScopedGLErrorSuppressor suppressor(decoder_); 1676 ScopedGLErrorSuppressor suppressor(decoder_);
1674 ScopedTexture2DBinder binder(decoder_, id_); 1677 ScopedTexture2DBinder binder(decoder_, id_);
1675 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1676 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1677 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1678 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1679 1678
1680 glTexImage2D(GL_TEXTURE_2D, 1679 glTexImage2D(GL_TEXTURE_2D,
1681 0, // mip level 1680 0, // mip level
1682 format, 1681 format,
1683 size.width(), 1682 size.width(),
1684 size.height(), 1683 size.height(),
1685 0, // border 1684 0, // border
1686 format, 1685 format,
1687 GL_UNSIGNED_BYTE, 1686 GL_UNSIGNED_BYTE,
1688 NULL); 1687 NULL);
1689 1688
1690 size_ = size; 1689 size_ = size;
1691 format_ = format;
1692 1690
1693 return glGetError() == GL_NO_ERROR; 1691 return glGetError() == GL_NO_ERROR;
1694 } 1692 }
1695 1693
1696 void Texture::Copy(const gfx::Size& size) { 1694 void Texture::Copy(const gfx::Size& size, GLenum format) {
1697 DCHECK_NE(id_, 0u); 1695 DCHECK_NE(id_, 0u);
1698 ScopedGLErrorSuppressor suppressor(decoder_); 1696 ScopedGLErrorSuppressor suppressor(decoder_);
1699 ScopedTexture2DBinder binder(decoder_, id_); 1697 ScopedTexture2DBinder binder(decoder_, id_);
1700 glCopyTexImage2D(GL_TEXTURE_2D, 1698 glCopyTexImage2D(GL_TEXTURE_2D,
1701 0, // level 1699 0, // level
1702 format_, 1700 format,
1703 0, 0, 1701 0, 0,
1704 size.width(), 1702 size.width(),
1705 size.height(), 1703 size.height(),
1706 0); // border 1704 0); // border
1707 } 1705 }
1708 1706
1709 void Texture::Destroy() { 1707 void Texture::Destroy() {
1710 if (id_ != 0) { 1708 if (id_ != 0) {
1711 ScopedGLErrorSuppressor suppressor(decoder_); 1709 ScopedGLErrorSuppressor suppressor(decoder_);
1712 glDeleteTextures(1, &id_); 1710 glDeleteTextures(1, &id_);
(...skipping 4972 matching lines...) Expand 10 before | Expand all | Expand 10 after
6685 swap_buffers_callback_->Run(); 6683 swap_buffers_callback_->Run();
6686 } 6684 }
6687 return error::kNoError; 6685 return error::kNoError;
6688 } else { 6686 } else {
6689 ScopedFrameBufferBinder binder(this, 6687 ScopedFrameBufferBinder binder(this,
6690 offscreen_target_frame_buffer_->id()); 6688 offscreen_target_frame_buffer_->id());
6691 6689
6692 if (parent_) { 6690 if (parent_) {
6693 // Copy the target frame buffer to the saved offscreen texture. 6691 // Copy the target frame buffer to the saved offscreen texture.
6694 offscreen_saved_color_texture_->Copy( 6692 offscreen_saved_color_texture_->Copy(
6695 offscreen_saved_color_texture_->size()); 6693 offscreen_saved_color_texture_->size(),
6694 offscreen_saved_color_format_);
6696 6695
6697 // Ensure the side effects of the copy are visible to the parent 6696 // Ensure the side effects of the copy are visible to the parent
6698 // context. There is no need to do this for ANGLE because it uses a 6697 // context. There is no need to do this for ANGLE because it uses a
6699 // single D3D device for all contexts. 6698 // single D3D device for all contexts.
6700 if (!IsAngle()) 6699 if (!IsAngle())
6701 glFlush(); 6700 glFlush();
6702 } 6701 }
6703 6702
6704 // Run the callback with |binder| in scope, so that the callback can call 6703 // Run the callback with |binder| in scope, so that the callback can call
6705 // ReadPixels or CopyTexImage2D. 6704 // ReadPixels or CopyTexImage2D.
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
6936 return error::kNoError; 6935 return error::kNoError;
6937 } 6936 }
6938 6937
6939 // Include the auto-generated part of this file. We split this because it means 6938 // Include the auto-generated part of this file. We split this because it means
6940 // we can easily edit the non-auto generated parts right here in this file 6939 // we can easily edit the non-auto generated parts right here in this file
6941 // instead of having to edit some template or the code generator. 6940 // instead of having to edit some template or the code generator.
6942 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 6941 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
6943 6942
6944 } // namespace gles2 6943 } // namespace gles2
6945 } // namespace gpu 6944 } // namespace gpu
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698