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

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

Issue 2134006: Added EGL based GLContext.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 6 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) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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>
11 #include <map> 11 #include <map>
12 #include <string> 12 #include <string>
13 #include <vector> 13 #include <vector>
14 14
15 #include "app/gfx/gl/gl_context.h" 15 #include "app/gfx/gl/gl_context.h"
16 #include "app/gfx/gl/gl_implementation.h"
16 #include "base/callback.h" 17 #include "base/callback.h"
17 #include "base/scoped_ptr.h" 18 #include "base/scoped_ptr.h"
18 #include "base/weak_ptr.h" 19 #include "base/weak_ptr.h"
19 #include "build/build_config.h" 20 #include "build/build_config.h"
20 #define GLES2_GPU_SERVICE 1 21 #define GLES2_GPU_SERVICE 1
21 #include "gpu/command_buffer/common/gles2_cmd_format.h" 22 #include "gpu/command_buffer/common/gles2_cmd_format.h"
22 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 23 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
23 #include "gpu/command_buffer/common/id_allocator.h" 24 #include "gpu/command_buffer/common/id_allocator.h"
24 #include "gpu/command_buffer/service/buffer_manager.h" 25 #include "gpu/command_buffer/service/buffer_manager.h"
25 #include "gpu/command_buffer/service/cmd_buffer_engine.h" 26 #include "gpu/command_buffer/service/cmd_buffer_engine.h"
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 public: 240 public:
240 explicit FrameBuffer(GLES2DecoderImpl* decoder); 241 explicit FrameBuffer(GLES2DecoderImpl* decoder);
241 ~FrameBuffer(); 242 ~FrameBuffer();
242 243
243 // Create a new frame buffer. 244 // Create a new frame buffer.
244 void Create(); 245 void Create();
245 246
246 // Attach a color render buffer to a frame buffer. 247 // Attach a color render buffer to a frame buffer.
247 void AttachRenderTexture(Texture* texture); 248 void AttachRenderTexture(Texture* texture);
248 249
249 // Attach a depth stencil render buffer to a frame buffer. Note that 250 // Attach a render buffer to a frame buffer. Note that this unbinds any
250 // this unbinds any currently bound frame buffer. 251 // currently bound frame buffer.
251 void AttachDepthStencilRenderBuffer(RenderBuffer* render_buffer); 252 void AttachRenderBuffer(GLenum target, RenderBuffer* render_buffer);
252 253
253 // Clear the given attached buffers. 254 // Clear the given attached buffers.
254 void Clear(GLbitfield buffers); 255 void Clear(GLbitfield buffers);
255 256
256 // Destroy the frame buffer. This must be explicitly called before destroying 257 // Destroy the frame buffer. This must be explicitly called before destroying
257 // this object. 258 // this object.
258 void Destroy(); 259 void Destroy();
259 260
260 // See glCheckFramebufferStatusEXT. 261 // See glCheckFramebufferStatusEXT.
261 GLenum CheckStatus(); 262 GLenum CheckStatus();
(...skipping 857 matching lines...) Expand 10 before | Expand all | Expand 10 after
1119 ProgramManager::ProgramInfo::Ref current_program_; 1120 ProgramManager::ProgramInfo::Ref current_program_;
1120 1121
1121 // The currently bound framebuffer 1122 // The currently bound framebuffer
1122 FramebufferManager::FramebufferInfo::Ref bound_framebuffer_; 1123 FramebufferManager::FramebufferInfo::Ref bound_framebuffer_;
1123 1124
1124 // The currently bound renderbuffer 1125 // The currently bound renderbuffer
1125 RenderbufferManager::RenderbufferInfo::Ref bound_renderbuffer_; 1126 RenderbufferManager::RenderbufferInfo::Ref bound_renderbuffer_;
1126 1127
1127 bool anti_aliased_; 1128 bool anti_aliased_;
1128 1129
1129 // The offscreen frame buffer that the client renders to. 1130 // The offscreen frame buffer that the client renders to. With EGL, the
1131 // depth and stencil buffers are separate. With regular GL there is a single
1132 // packed depth stencil buffer in offscreen_target_depth_render_buffer_.
1133 // offscreen_target_stencil_render_buffer_ is unused.
1130 scoped_ptr<FrameBuffer> offscreen_target_frame_buffer_; 1134 scoped_ptr<FrameBuffer> offscreen_target_frame_buffer_;
1131 scoped_ptr<Texture> offscreen_target_color_texture_; 1135 scoped_ptr<Texture> offscreen_target_color_texture_;
1132 scoped_ptr<RenderBuffer> offscreen_target_depth_stencil_render_buffer_; 1136 scoped_ptr<RenderBuffer> offscreen_target_depth_render_buffer_;
1137 scoped_ptr<RenderBuffer> offscreen_target_stencil_render_buffer_;
1133 1138
1134 // The copy that is saved when SwapBuffers is called. 1139 // The copy that is saved when SwapBuffers is called.
1135 scoped_ptr<Texture> offscreen_saved_color_texture_; 1140 scoped_ptr<Texture> offscreen_saved_color_texture_;
1136 1141
1137 scoped_ptr<Callback0::Type> swap_buffers_callback_; 1142 scoped_ptr<Callback0::Type> swap_buffers_callback_;
1138 1143
1139 // The last error message set. 1144 // The last error message set.
1140 std::string last_error_; 1145 std::string last_error_;
1141 1146
1142 bool use_shader_translator_; 1147 bool use_shader_translator_;
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1242 1247
1243 bool Texture::AllocateStorage(const gfx::Size& size) { 1248 bool Texture::AllocateStorage(const gfx::Size& size) {
1244 DCHECK_NE(id_, 0u); 1249 DCHECK_NE(id_, 0u);
1245 ScopedGLErrorSuppressor suppressor(decoder_); 1250 ScopedGLErrorSuppressor suppressor(decoder_);
1246 ScopedTexture2DBinder binder(decoder_, id_); 1251 ScopedTexture2DBinder binder(decoder_, id_);
1247 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1252 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1248 glTexParameteri( 1253 glTexParameteri(
1249 GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1254 GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1250 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 1255 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1251 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 1256 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1252 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
1253 1257
1254 glTexImage2D(GL_TEXTURE_2D, 1258 glTexImage2D(GL_TEXTURE_2D,
1255 0, // mip level 1259 0, // mip level
1256 GL_RGBA, 1260 GL_RGBA,
1257 size.width(), 1261 size.width(),
1258 size.height(), 1262 size.height(),
1259 0, // border 1263 0, // border
1260 GL_RGBA, 1264 GL_RGBA,
1261 GL_UNSIGNED_BYTE, 1265 GL_UNSIGNED_BYTE,
1262 NULL); 1266 NULL);
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1346 ScopedGLErrorSuppressor suppressor(decoder_); 1350 ScopedGLErrorSuppressor suppressor(decoder_);
1347 ScopedFrameBufferBinder binder(decoder_, id_); 1351 ScopedFrameBufferBinder binder(decoder_, id_);
1348 GLuint attach_id = texture ? texture->id() : 0; 1352 GLuint attach_id = texture ? texture->id() : 0;
1349 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, 1353 glFramebufferTexture2DEXT(GL_FRAMEBUFFER,
1350 GL_COLOR_ATTACHMENT0, 1354 GL_COLOR_ATTACHMENT0,
1351 GL_TEXTURE_2D, 1355 GL_TEXTURE_2D,
1352 attach_id, 1356 attach_id,
1353 0); 1357 0);
1354 } 1358 }
1355 1359
1356 void FrameBuffer::AttachDepthStencilRenderBuffer(RenderBuffer* render_buffer) { 1360 void FrameBuffer::AttachRenderBuffer(GLenum target,
1361 RenderBuffer* render_buffer) {
1357 DCHECK_NE(id_, 0u); 1362 DCHECK_NE(id_, 0u);
1358 ScopedGLErrorSuppressor suppressor(decoder_); 1363 ScopedGLErrorSuppressor suppressor(decoder_);
1359 ScopedFrameBufferBinder binder(decoder_, id_); 1364 ScopedFrameBufferBinder binder(decoder_, id_);
1360 GLuint attach_id = render_buffer ? render_buffer->id() : 0; 1365 GLuint attach_id = render_buffer ? render_buffer->id() : 0;
1361 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER, 1366 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER,
1362 GL_DEPTH_ATTACHMENT, 1367 target,
1363 GL_RENDERBUFFER,
1364 attach_id);
1365 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER,
1366 GL_STENCIL_ATTACHMENT,
1367 GL_RENDERBUFFER, 1368 GL_RENDERBUFFER,
1368 attach_id); 1369 attach_id);
1369 } 1370 }
1370 1371
1371 void FrameBuffer::Clear(GLbitfield buffers) { 1372 void FrameBuffer::Clear(GLbitfield buffers) {
1372 ScopedGLErrorSuppressor suppressor(decoder_); 1373 ScopedGLErrorSuppressor suppressor(decoder_);
1373 ScopedFrameBufferBinder binder(decoder_, id_); 1374 ScopedFrameBufferBinder binder(decoder_, id_);
1374 glClear(buffers); 1375 glClear(buffers);
1375 } 1376 }
1376 1377
(...skipping 27 matching lines...) Expand all
1404 attrib_0_size_(0), 1405 attrib_0_size_(0),
1405 active_texture_unit_(0), 1406 active_texture_unit_(0),
1406 black_2d_texture_id_(0), 1407 black_2d_texture_id_(0),
1407 black_cube_texture_id_(0), 1408 black_cube_texture_id_(0),
1408 anti_aliased_(false), 1409 anti_aliased_(false),
1409 use_shader_translator_(true) { 1410 use_shader_translator_(true) {
1410 attrib_0_value_.v[0] = 0.0f; 1411 attrib_0_value_.v[0] = 0.0f;
1411 attrib_0_value_.v[1] = 0.0f; 1412 attrib_0_value_.v[1] = 0.0f;
1412 attrib_0_value_.v[2] = 0.0f; 1413 attrib_0_value_.v[2] = 0.0f;
1413 attrib_0_value_.v[3] = 1.0f; 1414 attrib_0_value_.v[3] = 1.0f;
1415
1416 // The shader translator is not needed for EGL because it already uses the
1417 // GLSL ES syntax. It is translated for the unit tests because
1418 // GLES2DecoderWithShaderTest.GetShaderInfoLogValidArgs passes the empty
1419 // string to CompileShader and this is not a valid shader. TODO(apatrick):
1420 // fix this test.
1421 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 ||
1422 gfx::GetGLImplementation() == gfx::kGLImplementationMockGL) {
1423 use_shader_translator_ = false;
1424 }
1414 } 1425 }
1415 1426
1416 bool GLES2DecoderImpl::Initialize(gfx::GLContext* context, 1427 bool GLES2DecoderImpl::Initialize(gfx::GLContext* context,
1417 const gfx::Size& size, 1428 const gfx::Size& size,
1418 GLES2Decoder* parent, 1429 GLES2Decoder* parent,
1419 uint32 parent_client_texture_id) { 1430 uint32 parent_client_texture_id) {
1420 DCHECK(context); 1431 DCHECK(context);
1421 DCHECK(!context_); 1432 DCHECK(!context_);
1422 context_ = context; 1433 context_ = context;
1423 1434
1424 // Create a GL context that is kept in a default state and shares a namespace 1435 // Create a GL context that is kept in a default state and shares a namespace
1425 // with the main GL context. 1436 // with the main GL context.
1426 default_context_.reset(gfx::GLContext::CreateOffscreenGLContext( 1437 default_context_.reset(gfx::GLContext::CreateOffscreenGLContext(context_));
1427 context_->GetHandle()));
1428 if (!default_context_.get()) { 1438 if (!default_context_.get()) {
1429 Destroy(); 1439 Destroy();
1430 return false; 1440 return false;
1431 } 1441 }
1432 1442
1433 // Keep only a weak pointer to the parent so we don't unmap its client 1443 // Keep only a weak pointer to the parent so we don't unmap its client
1434 // frame buffer after it has been destroyed. 1444 // frame buffer after it has been destroyed.
1435 if (parent) 1445 if (parent)
1436 parent_ = static_cast<GLES2DecoderImpl*>(parent)->AsWeakPtr(); 1446 parent_ = static_cast<GLES2DecoderImpl*>(parent)->AsWeakPtr();
1437 1447
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1476 GL_UNSIGNED_BYTE, black); 1486 GL_UNSIGNED_BYTE, black);
1477 glBindTexture(GL_TEXTURE_2D, 0); 1487 glBindTexture(GL_TEXTURE_2D, 0);
1478 glBindTexture(GL_TEXTURE_CUBE_MAP, black_cube_texture_id_); 1488 glBindTexture(GL_TEXTURE_CUBE_MAP, black_cube_texture_id_);
1479 for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) { 1489 for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) {
1480 glTexImage2D(GLES2Util::IndexToGLFaceTarget(ii), 0, GL_RGBA, 1, 1, 0, 1490 glTexImage2D(GLES2Util::IndexToGLFaceTarget(ii), 0, GL_RGBA, 1, 1, 0,
1481 GL_RGBA, GL_UNSIGNED_BYTE, black); 1491 GL_RGBA, GL_UNSIGNED_BYTE, black);
1482 } 1492 }
1483 glBindTexture(GL_TEXTURE_CUBE_MAP, 0); 1493 glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
1484 CHECK_GL_ERROR(); 1494 CHECK_GL_ERROR();
1485 1495
1486 #if !defined(UNIT_TEST)
1487 if (context_->IsOffscreen()) { 1496 if (context_->IsOffscreen()) {
1488 // Create the target frame buffer. This is the one that the client renders 1497 // Create the target frame buffer. This is the one that the client renders
1489 // directly to. 1498 // directly to.
1490 offscreen_target_frame_buffer_.reset(new FrameBuffer(this)); 1499 offscreen_target_frame_buffer_.reset(new FrameBuffer(this));
1491 offscreen_target_frame_buffer_->Create(); 1500 offscreen_target_frame_buffer_->Create();
1492 offscreen_target_color_texture_.reset(new Texture(this)); 1501 offscreen_target_color_texture_.reset(new Texture(this));
1493 offscreen_target_color_texture_->Create(); 1502 offscreen_target_color_texture_->Create();
1494 offscreen_target_depth_stencil_render_buffer_.reset( 1503 offscreen_target_depth_render_buffer_.reset(
1495 new RenderBuffer(this)); 1504 new RenderBuffer(this));
1496 offscreen_target_depth_stencil_render_buffer_->Create(); 1505 offscreen_target_depth_render_buffer_->Create();
1506 offscreen_target_stencil_render_buffer_.reset(
1507 new RenderBuffer(this));
1508 offscreen_target_stencil_render_buffer_->Create();
1497 1509
1498 // Create the saved offscreen texture. The target frame buffer is copied 1510 // Create the saved offscreen texture. The target frame buffer is copied
1499 // here when SwapBuffers is called. 1511 // here when SwapBuffers is called.
1500 offscreen_saved_color_texture_.reset(new Texture(this)); 1512 offscreen_saved_color_texture_.reset(new Texture(this));
1501 offscreen_saved_color_texture_->Create(); 1513 offscreen_saved_color_texture_->Create();
1502 1514
1503 // Map the ID of the saved offscreen texture into the parent so that 1515 // Map the ID of the saved offscreen texture into the parent so that
1504 // it can reference it. 1516 // it can reference it.
1505 if (parent_) { 1517 if (parent_) {
1506 GLuint service_id = offscreen_saved_color_texture_->id(); 1518 GLuint service_id = offscreen_saved_color_texture_->id();
1507 TextureManager::TextureInfo* info = 1519 TextureManager::TextureInfo* info =
1508 parent_->CreateTextureInfo(parent_client_texture_id, service_id); 1520 parent_->CreateTextureInfo(parent_client_texture_id, service_id);
1509 parent_->texture_manager()->SetInfoTarget(info, GL_TEXTURE_2D); 1521 parent_->texture_manager()->SetInfoTarget(info, GL_TEXTURE_2D);
1510 } 1522 }
1511 1523
1512 // Allocate the render buffers at their initial size and check the status 1524 // Allocate the render buffers at their initial size and check the status
1513 // of the frame buffers is okay. 1525 // of the frame buffers is okay.
1514 pending_offscreen_size_ = size; 1526 pending_offscreen_size_ = size;
1515 if (!UpdateOffscreenFrameBufferSize()) { 1527 if (!UpdateOffscreenFrameBufferSize()) {
1516 DLOG(ERROR) << "Could not allocate offscreen buffer storage."; 1528 DLOG(ERROR) << "Could not allocate offscreen buffer storage.";
1517 Destroy(); 1529 Destroy();
1518 return false; 1530 return false;
1519 } 1531 }
1520 1532
1521 // Bind to the new default frame buffer (the offscreen target frame buffer). 1533 // Bind to the new default frame buffer (the offscreen target frame buffer).
1522 // This should now be associated with ID zero. 1534 // This should now be associated with ID zero.
1523 DoBindFramebuffer(GL_FRAMEBUFFER, 0); 1535 DoBindFramebuffer(GL_FRAMEBUFFER, 0);
1524 } 1536 }
1525 #endif // UNIT_TEST
1526 1537
1527 #if !defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2)
1528 // OpenGL ES 2.0 implicitly enables the desktop GL capability 1538 // OpenGL ES 2.0 implicitly enables the desktop GL capability
1529 // VERTEX_PROGRAM_POINT_SIZE and doesn't expose this enum. This fact 1539 // VERTEX_PROGRAM_POINT_SIZE and doesn't expose this enum. This fact
1530 // isn't well documented; it was discovered in the Khronos OpenGL ES 1540 // isn't well documented; it was discovered in the Khronos OpenGL ES
1531 // mailing list archives. 1541 // mailing list archives.
1532 glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); 1542 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) {
1543 glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
1544 }
1533 1545
1534 #if defined(GLES2_GPU_SERVICE_TRANSLATE_SHADER) && !defined(UNIT_TEST) 1546 #if defined(GLES2_GPU_SERVICE_TRANSLATE_SHADER)
1535 // Initialize GLSL ES to GLSL translator. 1547 // Initialize GLSL ES to GLSL translator.
1536 if (!ShInitialize()) { 1548 static bool glsl_translator_initialized = false;
1537 DLOG(ERROR) << "Could not initialize GLSL translator."; 1549 if (!glsl_translator_initialized) {
1538 Destroy(); 1550 if (!ShInitialize()) {
1539 return false; 1551 DLOG(ERROR) << "Could not initialize GLSL translator.";
1552 Destroy();
1553 return false;
1554 }
1555 glsl_translator_initialized = true;
1540 } 1556 }
1541 #endif // GLES2_GPU_SERVICE_TRANSLATE_SHADER 1557 #endif // GLES2_GPU_SERVICE_TRANSLATE_SHADER
1542 #endif // GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2
1543 1558
1544 return true; 1559 return true;
1545 } 1560 }
1546 1561
1547 bool GLES2DecoderImpl::GenBuffersHelper(GLsizei n, const GLuint* client_ids) { 1562 bool GLES2DecoderImpl::GenBuffersHelper(GLsizei n, const GLuint* client_ids) {
1548 for (GLsizei ii = 0; ii < n; ++ii) { 1563 for (GLsizei ii = 0; ii < n; ++ii) {
1549 if (GetBufferInfo(client_ids[ii])) { 1564 if (GetBufferInfo(client_ids[ii])) {
1550 return false; 1565 return false;
1551 } 1566 }
1552 } 1567 }
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1648 GLuint service_id = info->service_id(); 1663 GLuint service_id = info->service_id();
1649 glDeleteTextures(1, &service_id); 1664 glDeleteTextures(1, &service_id);
1650 RemoveTextureInfo(client_ids[ii]); 1665 RemoveTextureInfo(client_ids[ii]);
1651 } 1666 }
1652 } 1667 }
1653 } 1668 }
1654 1669
1655 // } // anonymous namespace 1670 // } // anonymous namespace
1656 1671
1657 bool GLES2DecoderImpl::MakeCurrent() { 1672 bool GLES2DecoderImpl::MakeCurrent() {
1658 #if defined(UNIT_TEST)
1659 return true;
1660 #else
1661 return context_->MakeCurrent(); 1673 return context_->MakeCurrent();
1662 #endif
1663 } 1674 }
1664 1675
1665 gfx::Size GLES2DecoderImpl::GetBoundFrameBufferSize() { 1676 gfx::Size GLES2DecoderImpl::GetBoundFrameBufferSize() {
1666 if (bound_framebuffer_ != 0) { 1677 if (bound_framebuffer_ != 0) {
1667 int width = 0; 1678 int width = 0;
1668 int height = 0; 1679 int height = 0;
1669 1680
1670 // Assume we have to have COLOR_ATTACHMENT0. Should we check for depth and 1681 // Assume we have to have COLOR_ATTACHMENT0. Should we check for depth and
1671 // stencil. 1682 // stencil.
1672 GLint fb_type = 0; 1683 GLint fb_type = 0;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1731 } 1742 }
1732 default: 1743 default:
1733 // unknown so assume width and height are zero. 1744 // unknown so assume width and height are zero.
1734 break; 1745 break;
1735 } 1746 }
1736 1747
1737 return gfx::Size(width, height); 1748 return gfx::Size(width, height);
1738 } else if (offscreen_target_color_texture_.get()) { 1749 } else if (offscreen_target_color_texture_.get()) {
1739 return offscreen_target_color_texture_->size(); 1750 return offscreen_target_color_texture_->size();
1740 } else { 1751 } else {
1741 #if defined(UNIT_TEST)
1742 return gfx::Size(INT_MAX, INT_MAX);
1743 #else
1744 return context_->GetSize(); 1752 return context_->GetSize();
1745 #endif
1746 } 1753 }
1747 } 1754 }
1748 1755
1749 bool GLES2DecoderImpl::UpdateOffscreenFrameBufferSize() { 1756 bool GLES2DecoderImpl::UpdateOffscreenFrameBufferSize() {
1750 if (offscreen_target_color_texture_->size() == pending_offscreen_size_) 1757 if (offscreen_target_color_texture_->size() == pending_offscreen_size_)
1751 return true; 1758 return true;
1752 1759
1753 if (parent_) { 1760 if (parent_) {
1754 // Create the saved offscreen color texture (only accessible to parent). 1761 // Create the saved offscreen color texture (only accessible to parent).
1755 offscreen_saved_color_texture_->AllocateStorage(pending_offscreen_size_); 1762 offscreen_saved_color_texture_->AllocateStorage(pending_offscreen_size_);
1756 1763
1757 // Attach the saved offscreen color texture to a frame buffer so we can 1764 // Attach the saved offscreen color texture to a frame buffer so we can
1758 // clear it with glClear. 1765 // clear it with glClear.
1759 offscreen_target_frame_buffer_->AttachRenderTexture( 1766 offscreen_target_frame_buffer_->AttachRenderTexture(
1760 offscreen_saved_color_texture_.get()); 1767 offscreen_saved_color_texture_.get());
1761 if (offscreen_target_frame_buffer_->CheckStatus() != 1768 if (offscreen_target_frame_buffer_->CheckStatus() !=
1762 GL_FRAMEBUFFER_COMPLETE) { 1769 GL_FRAMEBUFFER_COMPLETE) {
1763 return false; 1770 return false;
1764 } 1771 }
1765 1772
1766 #if !defined(UNIT_TEST) 1773 // TODO(apatrick): Fix this once ANGLE supports shared contexts.
1767 // Clear the saved offscreen color texture. Use default GL context 1774 // Clear the saved offscreen color texture. Use default GL context
1768 // to ensure clear is not affected by client set state. 1775 // to ensure clear is not affected by client set state.
1769 { // NOLINT 1776 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) {
1770 ScopedDefaultGLContext scoped_context(this); 1777 ScopedDefaultGLContext scoped_context(this);
1771 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 1778 glBindFramebufferEXT(GL_FRAMEBUFFER,
1772 offscreen_target_frame_buffer_->id()); 1779 offscreen_target_frame_buffer_->id());
1773 glClear(GL_COLOR_BUFFER_BIT); 1780 glClear(GL_COLOR_BUFFER_BIT);
1774 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 1781 glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
1775 1782
1776 if (glGetError() != GL_NO_ERROR) 1783 if (glGetError() != GL_NO_ERROR)
1777 return false; 1784 return false;
1778 } 1785 }
1779 #endif
1780 } 1786 }
1781 1787
1782 // Reallocate the offscreen target buffers. 1788 // Reallocate the offscreen target buffers.
1783 if (!offscreen_target_color_texture_->AllocateStorage( 1789 if (!offscreen_target_color_texture_->AllocateStorage(
1784 pending_offscreen_size_)) { 1790 pending_offscreen_size_)) {
1785 return false; 1791 return false;
1786 } 1792 }
1787 1793
1788 if (!offscreen_target_depth_stencil_render_buffer_->AllocateStorage( 1794 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) {
1789 pending_offscreen_size_, GL_DEPTH24_STENCIL8)) { 1795 // ANGLE only allows 16-bit depth buffers to be requested. As it happens,
1790 return false; 1796 // it creates a 24-bit depth buffer behind the scenes.
1797 // TODO(apatrick): Attempt to use a packed 24/8 depth stencil buffer here if
1798 // the extension is available.
1799 if (!offscreen_target_depth_render_buffer_->AllocateStorage(
1800 pending_offscreen_size_, GL_DEPTH_COMPONENT16)) {
1801 return false;
1802 }
1803
1804 if (!offscreen_target_stencil_render_buffer_->AllocateStorage(
1805 pending_offscreen_size_, GL_STENCIL_INDEX8)) {
1806 return false;
1807 }
1808 } else {
1809 if (!offscreen_target_depth_render_buffer_->AllocateStorage(
1810 pending_offscreen_size_, GL_DEPTH24_STENCIL8)) {
1811 return false;
1812 }
1791 } 1813 }
1792 1814
1793 // Attach the offscreen target buffers to the target frame buffer. 1815 // Attach the offscreen target buffers to the target frame buffer.
1794 offscreen_target_frame_buffer_->AttachRenderTexture( 1816 offscreen_target_frame_buffer_->AttachRenderTexture(
1795 offscreen_target_color_texture_.get()); 1817 offscreen_target_color_texture_.get());
1796 offscreen_target_frame_buffer_->AttachDepthStencilRenderBuffer( 1818 offscreen_target_frame_buffer_->AttachRenderBuffer(
1797 offscreen_target_depth_stencil_render_buffer_.get()); 1819 GL_DEPTH_ATTACHMENT,
1820 offscreen_target_depth_render_buffer_.get());
1821 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) {
1822 offscreen_target_frame_buffer_->AttachRenderBuffer(
1823 GL_STENCIL_ATTACHMENT,
1824 offscreen_target_stencil_render_buffer_.get());
1825 } else {
1826 offscreen_target_frame_buffer_->AttachRenderBuffer(
1827 GL_STENCIL_ATTACHMENT,
1828 offscreen_target_depth_render_buffer_.get());
1829 }
1798 if (offscreen_target_frame_buffer_->CheckStatus() != 1830 if (offscreen_target_frame_buffer_->CheckStatus() !=
1799 GL_FRAMEBUFFER_COMPLETE) { 1831 GL_FRAMEBUFFER_COMPLETE) {
1800 return false; 1832 return false;
1801 } 1833 }
1802 1834
1803 #if !defined(UNIT_TEST) 1835 // TODO(apatrick): Fix this once ANGLE supports shared contexts.
1804 // Clear offscreen frame buffer to its initial state. Use default GL context 1836 // Clear offscreen frame buffer to its initial state. Use default GL context
1805 // to ensure clear is not affected by client set state. 1837 // to ensure clear is not affected by client set state.
1806 { // NOLINT 1838 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) {
1807 ScopedDefaultGLContext scoped_context(this); 1839 ScopedDefaultGLContext scoped_context(this);
1808 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 1840 glBindFramebufferEXT(GL_FRAMEBUFFER,
1809 offscreen_target_frame_buffer_->id()); 1841 offscreen_target_frame_buffer_->id());
1810 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 1842 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1811 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 1843 glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
1812 1844
1813 if (glGetError() != GL_NO_ERROR) 1845 if (glGetError() != GL_NO_ERROR)
1814 return false; 1846 return false;
1815 } 1847 }
1816 #endif
1817 1848
1818 if (parent_) { 1849 if (parent_) {
1819 // Create the saved offscreen color texture (only accessible to parent). 1850 // Create the saved offscreen color texture (only accessible to parent).
1820 offscreen_saved_color_texture_->AllocateStorage(pending_offscreen_size_); 1851 offscreen_saved_color_texture_->AllocateStorage(pending_offscreen_size_);
1821 1852
1822 // Update the info about the offscreen saved color texture in the parent. 1853 // Update the info about the offscreen saved color texture in the parent.
1823 // The reference to the parent is a weak pointer and will become null if the 1854 // The reference to the parent is a weak pointer and will become null if the
1824 // parent is later destroyed. 1855 // parent is later destroyed.
1825 GLuint service_id = offscreen_saved_color_texture_->id(); 1856 GLuint service_id = offscreen_saved_color_texture_->id();
1826 1857
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1878 if (offscreen_target_frame_buffer_.get()) { 1909 if (offscreen_target_frame_buffer_.get()) {
1879 offscreen_target_frame_buffer_->Destroy(); 1910 offscreen_target_frame_buffer_->Destroy();
1880 offscreen_target_frame_buffer_.reset(); 1911 offscreen_target_frame_buffer_.reset();
1881 } 1912 }
1882 1913
1883 if (offscreen_target_color_texture_.get()) { 1914 if (offscreen_target_color_texture_.get()) {
1884 offscreen_target_color_texture_->Destroy(); 1915 offscreen_target_color_texture_->Destroy();
1885 offscreen_target_color_texture_.reset(); 1916 offscreen_target_color_texture_.reset();
1886 } 1917 }
1887 1918
1888 if (offscreen_target_depth_stencil_render_buffer_.get()) { 1919 if (offscreen_target_depth_render_buffer_.get()) {
1889 offscreen_target_depth_stencil_render_buffer_->Destroy(); 1920 offscreen_target_depth_render_buffer_->Destroy();
1890 offscreen_target_depth_stencil_render_buffer_.reset(); 1921 offscreen_target_depth_render_buffer_.reset();
1922 }
1923
1924 if (offscreen_target_stencil_render_buffer_.get()) {
1925 offscreen_target_stencil_render_buffer_->Destroy();
1926 offscreen_target_stencil_render_buffer_.reset();
1891 } 1927 }
1892 1928
1893 if (offscreen_saved_color_texture_.get()) { 1929 if (offscreen_saved_color_texture_.get()) {
1894 offscreen_saved_color_texture_->Destroy(); 1930 offscreen_saved_color_texture_->Destroy();
1895 offscreen_saved_color_texture_.reset(); 1931 offscreen_saved_color_texture_.reset();
1896 } 1932 }
1897 } 1933 }
1898 1934
1899 if (default_context_.get()) { 1935 if (default_context_.get()) {
1900 default_context_->Destroy(); 1936 default_context_->Destroy();
1901 default_context_.reset(); 1937 default_context_.reset();
1902 } 1938 }
1903
1904 #if !defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2) && !defined(UNIT_TEST)
1905 #if defined(GLES2_GPU_SERVICE_TRANSLATE_SHADER)
1906 // Terminate GLSL translator.
1907 ShFinalize();
1908 #endif // GLES2_GPU_SERVICE_TRANSLATE_SHADER
1909 #endif // GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2
1910 } 1939 }
1911 1940
1912 void GLES2DecoderImpl::ResizeOffscreenFrameBuffer(const gfx::Size& size) { 1941 void GLES2DecoderImpl::ResizeOffscreenFrameBuffer(const gfx::Size& size) {
1913 // We can't resize the render buffers immediately because there might be a 1942 // We can't resize the render buffers immediately because there might be a
1914 // partial frame rendered into them and we don't want the tail end of that 1943 // partial frame rendered into them and we don't want the tail end of that
1915 // rendered into the reallocated storage. Defer until the next SwapBuffers. 1944 // rendered into the reallocated storage. Defer until the next SwapBuffers.
1916 pending_offscreen_size_ = size; 1945 pending_offscreen_size_ = size;
1917 } 1946 }
1918 1947
1919 const char* GLES2DecoderImpl::GetCommandName(unsigned int command_id) const { 1948 const char* GLES2DecoderImpl::GetCommandName(unsigned int command_id) const {
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
2169 SetGLError(GL_INVALID_OPERATION, 2198 SetGLError(GL_INVALID_OPERATION,
2170 "glGenerateMipmaps: Can not generate mips for npot textures"); 2199 "glGenerateMipmaps: Can not generate mips for npot textures");
2171 return; 2200 return;
2172 } 2201 }
2173 glGenerateMipmapEXT(target); 2202 glGenerateMipmapEXT(target);
2174 } 2203 }
2175 2204
2176 bool GLES2DecoderImpl::GetHelper( 2205 bool GLES2DecoderImpl::GetHelper(
2177 GLenum pname, GLint* params, GLsizei* num_written) { 2206 GLenum pname, GLint* params, GLsizei* num_written) {
2178 DCHECK(num_written); 2207 DCHECK(num_written);
2179 switch (pname) { 2208 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) {
2180 #if !defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2) 2209 switch (pname) {
2181 case GL_IMPLEMENTATION_COLOR_READ_FORMAT: 2210 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
2182 *num_written = 1; 2211 *num_written = 1;
2183 if (params) { 2212 if (params) {
2184 *params = GL_RGBA; // TODO(gman): get correct format. 2213 *params = GL_RGBA; // TODO(gman): get correct format.
2185 } 2214 }
2186 return true; 2215 return true;
2187 case GL_IMPLEMENTATION_COLOR_READ_TYPE: 2216 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
2188 *num_written = 1; 2217 *num_written = 1;
2189 if (params) { 2218 if (params) {
2190 *params = GL_UNSIGNED_BYTE; // TODO(gman): get correct type. 2219 *params = GL_UNSIGNED_BYTE; // TODO(gman): get correct type.
(...skipping 10 matching lines...) Expand all
2201 if (params) { 2230 if (params) {
2202 *params = group_->max_varying_vectors(); 2231 *params = group_->max_varying_vectors();
2203 } 2232 }
2204 return true; 2233 return true;
2205 case GL_MAX_VERTEX_UNIFORM_VECTORS: 2234 case GL_MAX_VERTEX_UNIFORM_VECTORS:
2206 *num_written = 1; 2235 *num_written = 1;
2207 if (params) { 2236 if (params) {
2208 *params = group_->max_vertex_uniform_vectors(); 2237 *params = group_->max_vertex_uniform_vectors();
2209 } 2238 }
2210 return true; 2239 return true;
2211 #endif 2240 }
2241 }
2242 switch (pname) {
2212 case GL_COMPRESSED_TEXTURE_FORMATS: 2243 case GL_COMPRESSED_TEXTURE_FORMATS:
2213 *num_written = 0; 2244 *num_written = 0;
2214 // We don't support compressed textures. 2245 // We don't support compressed textures.
2215 return true; 2246 return true;
2216 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: 2247 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
2217 *num_written = 1; 2248 *num_written = 1;
2218 if (params) { 2249 if (params) {
2219 *params = 0; // We don't support compressed textures. 2250 *params = 0; // We don't support compressed textures.
2220 } 2251 }
2221 return true; 2252 return true;
(...skipping 1003 matching lines...) Expand 10 before | Expand all | Expand 10 after
3225 3256
3226 void GLES2DecoderImpl::DoCompileShader(GLuint client_id) { 3257 void GLES2DecoderImpl::DoCompileShader(GLuint client_id) {
3227 ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram( 3258 ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram(
3228 client_id, "glCompileShader"); 3259 client_id, "glCompileShader");
3229 if (!info) { 3260 if (!info) {
3230 return; 3261 return;
3231 } 3262 }
3232 // Translate GL ES 2.0 shader to Desktop GL shader and pass that to 3263 // Translate GL ES 2.0 shader to Desktop GL shader and pass that to
3233 // glShaderSource and then glCompileShader. 3264 // glShaderSource and then glCompileShader.
3234 const char* shader_src = info->source().c_str(); 3265 const char* shader_src = info->source().c_str();
3235 #if !defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2) && !defined(UNIT_TEST)
3236 #if defined(GLES2_GPU_SERVICE_TRANSLATE_SHADER) 3266 #if defined(GLES2_GPU_SERVICE_TRANSLATE_SHADER)
3237 ShHandle compiler = 0; 3267 ShHandle compiler = 0;
3238 if (use_shader_translator_) { 3268 if (use_shader_translator_) {
3239 int dbg_options = 0; 3269 int dbg_options = 0;
3240 EShLanguage language = info->shader_type() == GL_VERTEX_SHADER ? 3270 EShLanguage language = info->shader_type() == GL_VERTEX_SHADER ?
3241 EShLangVertex : EShLangFragment; 3271 EShLangVertex : EShLangFragment;
3242 TBuiltInResource resources; 3272 TBuiltInResource resources;
3243 resources.maxVertexAttribs = group_->max_vertex_attribs(); 3273 resources.maxVertexAttribs = group_->max_vertex_attribs();
3244 resources.maxVertexUniformVectors = 3274 resources.maxVertexUniformVectors =
3245 group_->max_vertex_uniform_vectors(); 3275 group_->max_vertex_uniform_vectors();
3246 resources.maxVaryingVectors = group_->max_varying_vectors(); 3276 resources.maxVaryingVectors = group_->max_varying_vectors();
3247 resources.maxVertexTextureImageUnits = 3277 resources.maxVertexTextureImageUnits =
3248 group_->max_vertex_texture_image_units(); 3278 group_->max_vertex_texture_image_units();
3249 resources.maxCombinedTextureImageUnits = group_->max_texture_units(); 3279 resources.maxCombinedTextureImageUnits = group_->max_texture_units();
3250 resources.maxTextureImageUnits = group_->max_texture_image_units(); 3280 resources.maxTextureImageUnits = group_->max_texture_image_units();
3251 resources.maxFragmentUniformVectors = 3281 resources.maxFragmentUniformVectors =
3252 group_->max_fragment_uniform_vectors(); 3282 group_->max_fragment_uniform_vectors();
3253 resources.maxDrawBuffers = 1; 3283 resources.maxDrawBuffers = 1;
3254 compiler = ShConstructCompiler(language, dbg_options); 3284 compiler = ShConstructCompiler(language, dbg_options);
3255 if (!ShCompile(compiler, &shader_src, 1, EShOptNone, &resources, 3285 if (!ShCompile(compiler, &shader_src, 1, EShOptNone, &resources,
3256 dbg_options)) { 3286 dbg_options)) {
3257 info->SetTranslationStatus(false, ShGetInfoLog(compiler)); 3287 info->SetTranslationStatus(false, ShGetInfoLog(compiler));
3258 ShDestruct(compiler); 3288 ShDestruct(compiler);
3259 return; 3289 return;
3260 } 3290 }
3291
3261 info->SetTranslationStatus(true, ""); 3292 info->SetTranslationStatus(true, "");
3262 shader_src = ShGetObjectCode(compiler); 3293 shader_src = ShGetObjectCode(compiler);
3263 } 3294 }
3264 #endif // GLES2_GPU_SERVICE_TRANSLATE_SHADER 3295 #endif // GLES2_GPU_SERVICE_TRANSLATE_SHADER
3265 #endif // GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2
3266 3296
3267 glShaderSource(info->service_id(), 1, &shader_src, NULL); 3297 glShaderSource(info->service_id(), 1, &shader_src, NULL);
3268 glCompileShader(info->service_id()); 3298 glCompileShader(info->service_id());
3269 #if !defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2) && !defined(UNIT_TEST)
3270 #ifdef GLES2_GPU_SERVICE_TRANSLATE_SHADER 3299 #ifdef GLES2_GPU_SERVICE_TRANSLATE_SHADER
3271 if (use_shader_translator_) { 3300 if (use_shader_translator_) {
3272 ShDestruct(compiler); 3301 ShDestruct(compiler);
3273 } 3302 }
3274 #endif // GLES2_GPU_SERVICE_TRANSLATE_SHADER 3303 #endif // GLES2_GPU_SERVICE_TRANSLATE_SHADER
3275 #endif // GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2
3276 }; 3304 };
3277 3305
3278 void GLES2DecoderImpl::DoGetShaderiv( 3306 void GLES2DecoderImpl::DoGetShaderiv(
3279 GLuint shader, GLenum pname, GLint* params) { 3307 GLuint shader, GLenum pname, GLint* params) {
3280 ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram( 3308 ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram(
3281 shader, "glGetShaderiv"); 3309 shader, "glGetShaderiv");
3282 if (!info) { 3310 if (!info) {
3283 return; 3311 return;
3284 } 3312 }
3285 switch (pname) { 3313 switch (pname) {
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after
4002 default: 4030 default:
4003 str = gl_str; 4031 str = gl_str;
4004 break; 4032 break;
4005 } 4033 }
4006 Bucket* bucket = CreateBucket(c.bucket_id); 4034 Bucket* bucket = CreateBucket(c.bucket_id);
4007 bucket->SetFromString(str); 4035 bucket->SetFromString(str);
4008 return error::kNoError; 4036 return error::kNoError;
4009 } 4037 }
4010 4038
4011 void GLES2DecoderImpl::DoBufferData( 4039 void GLES2DecoderImpl::DoBufferData(
4012 GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage) { 4040 GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage) {
4013 if (!ValidateGLenumBufferTarget(target)) { 4041 if (!ValidateGLenumBufferTarget(target)) {
4014 SetGLError(GL_INVALID_ENUM, "glBufferData: target GL_INVALID_ENUM"); 4042 SetGLError(GL_INVALID_ENUM, "glBufferData: target GL_INVALID_ENUM");
4015 return; 4043 return;
4016 } 4044 }
4017 if (!ValidateGLenumBufferUsage(usage)) { 4045 if (!ValidateGLenumBufferUsage(usage)) {
4018 SetGLError(GL_INVALID_ENUM, "glBufferData: usage GL_INVALID_ENUM"); 4046 SetGLError(GL_INVALID_ENUM, "glBufferData: usage GL_INVALID_ENUM");
4019 return; 4047 return;
4020 } 4048 }
4021 if (size < 0) { 4049 if (size < 0) {
4022 SetGLError(GL_INVALID_VALUE, "glBufferData: size < 0"); 4050 SetGLError(GL_INVALID_VALUE, "glBufferData: size < 0");
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after
4667 4695
4668 // First check to see if a deferred offscreen render buffer resize is 4696 // First check to see if a deferred offscreen render buffer resize is
4669 // pending. 4697 // pending.
4670 if (!UpdateOffscreenFrameBufferSize()) 4698 if (!UpdateOffscreenFrameBufferSize())
4671 return error::kLostContext; 4699 return error::kLostContext;
4672 4700
4673 ScopedFrameBufferBinder binder(this, offscreen_target_frame_buffer_->id()); 4701 ScopedFrameBufferBinder binder(this, offscreen_target_frame_buffer_->id());
4674 offscreen_saved_color_texture_->Copy( 4702 offscreen_saved_color_texture_->Copy(
4675 offscreen_saved_color_texture_->size()); 4703 offscreen_saved_color_texture_->size());
4676 } else { 4704 } else {
4677 #if !defined(UNIT_TEST)
4678 context_->SwapBuffers(); 4705 context_->SwapBuffers();
4679 #endif
4680 } 4706 }
4681 4707
4682 // TODO(kbr): when the back buffer is multisampled, then at least on Mac 4708 // TODO(kbr): when the back buffer is multisampled, then at least on Mac
4683 // OS X (and probably on all platforms, for best semantics), we will need 4709 // OS X (and probably on all platforms, for best semantics), we will need
4684 // to perform the resolve step and bind the offscreen_saved_color_texture_ 4710 // to perform the resolve step and bind the offscreen_saved_color_texture_
4685 // as the color attachment before calling the swap buffers callback, which 4711 // as the color attachment before calling the swap buffers callback, which
4686 // expects a normal (non-multisampled) frame buffer for glCopyTexImage2D / 4712 // expects a normal (non-multisampled) frame buffer for glCopyTexImage2D /
4687 // glReadPixels. After the callback runs, the multisampled frame buffer 4713 // glReadPixels. After the callback runs, the multisampled frame buffer
4688 // needs to be bound again. 4714 // needs to be bound again.
4689 4715
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
4725 return error::kNoError; 4751 return error::kNoError;
4726 } 4752 }
4727 4753
4728 // Include the auto-generated part of this file. We split this because it means 4754 // Include the auto-generated part of this file. We split this because it means
4729 // we can easily edit the non-auto generated parts right here in this file 4755 // we can easily edit the non-auto generated parts right here in this file
4730 // instead of having to edit some template or the code generator. 4756 // instead of having to edit some template or the code generator.
4731 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 4757 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
4732 4758
4733 } // namespace gles2 4759 } // namespace gles2
4734 } // namespace gpu 4760 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gl_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