Index: cc/test/test_web_graphics_context_3d.cc |
diff --git a/cc/test/test_web_graphics_context_3d.cc b/cc/test/test_web_graphics_context_3d.cc |
index 2d82f89a71cdd8005f69f41cecde3d8a6061e9f6..8aa392de290b6d7301b9d79d4ed6559d9f5a7f94 100644 |
--- a/cc/test/test_web_graphics_context_3d.cc |
+++ b/cc/test/test_web_graphics_context_3d.cc |
@@ -18,9 +18,6 @@ |
namespace cc { |
-static const GLuint kFramebufferId = 1; |
-static const GLuint kRenderbufferId = 2; |
- |
static unsigned s_context_id = 1; |
const GLuint TestWebGraphicsContext3D::kExternalTextureId = 1337; |
@@ -34,7 +31,8 @@ TestWebGraphicsContext3D::Namespace* |
TestWebGraphicsContext3D::Namespace::Namespace() |
: next_buffer_id(1), |
next_image_id(1), |
- next_texture_id(1) { |
+ next_texture_id(1), |
+ next_renderbuffer_id(1) { |
} |
TestWebGraphicsContext3D::Namespace::~Namespace() { |
@@ -58,6 +56,8 @@ TestWebGraphicsContext3D::TestWebGraphicsContext3D() |
max_used_transfer_buffer_usage_bytes_(0), |
next_program_id_(1000), |
next_shader_id_(2000), |
+ next_framebuffer_id_(1), |
+ current_framebuffer_(0), |
max_texture_size_(2048), |
reshape_called_(false), |
width_(0), |
@@ -162,13 +162,13 @@ void TestWebGraphicsContext3D::genBuffers(GLsizei count, GLuint* ids) { |
void TestWebGraphicsContext3D::genFramebuffers( |
GLsizei count, GLuint* ids) { |
for (int i = 0; i < count; ++i) |
- ids[i] = kFramebufferId | context_id_ << 16; |
+ ids[i] = NextFramebufferId(); |
} |
void TestWebGraphicsContext3D::genRenderbuffers( |
GLsizei count, GLuint* ids) { |
for (int i = 0; i < count; ++i) |
- ids[i] = kRenderbufferId | context_id_ << 16; |
+ ids[i] = NextRenderbufferId(); |
} |
void TestWebGraphicsContext3D::genTextures(GLsizei count, GLuint* ids) { |
@@ -188,14 +188,19 @@ void TestWebGraphicsContext3D::deleteBuffers(GLsizei count, GLuint* ids) { |
void TestWebGraphicsContext3D::deleteFramebuffers( |
GLsizei count, GLuint* ids) { |
- for (int i = 0; i < count; ++i) |
- DCHECK_EQ(kFramebufferId | context_id_ << 16, ids[i]); |
+ for (int i = 0; i < count; ++i) { |
+ if (ids[i]) { |
+ RetireFramebufferId(ids[i]); |
+ if (ids[i] == current_framebuffer_) |
+ current_framebuffer_ = 0; |
+ } |
+ } |
} |
void TestWebGraphicsContext3D::deleteRenderbuffers( |
GLsizei count, GLuint* ids) { |
for (int i = 0; i < count; ++i) |
- DCHECK_EQ(kRenderbufferId | context_id_ << 16, ids[i]); |
+ RetireRenderbufferId(ids[i]); |
} |
void TestWebGraphicsContext3D::deleteTextures(GLsizei count, GLuint* ids) { |
@@ -294,16 +299,31 @@ void TestWebGraphicsContext3D::useProgram(GLuint program) { |
void TestWebGraphicsContext3D::bindFramebuffer( |
GLenum target, GLuint framebuffer) { |
- if (!framebuffer) |
- return; |
- DCHECK_EQ(kFramebufferId | context_id_ << 16, framebuffer); |
+ base::AutoLock lock_for_framebuffer_access(namespace_->lock); |
+ if (framebuffer != 0 && |
+ framebuffer_set_.find(framebuffer) == framebuffer_set_.end()) { |
+ ADD_FAILURE() << "bindFramebuffer called with unknown framebuffer"; |
+ } else if (framebuffer != 0 && (framebuffer >> 16) != context_id_) { |
+ ADD_FAILURE() |
+ << "bindFramebuffer called with framebuffer from other context"; |
+ } else { |
+ current_framebuffer_ = framebuffer; |
+ } |
} |
void TestWebGraphicsContext3D::bindRenderbuffer( |
GLenum target, GLuint renderbuffer) { |
if (!renderbuffer) |
return; |
- DCHECK_EQ(kRenderbufferId | context_id_ << 16, renderbuffer); |
+ base::AutoLock lock_for_renderbuffer_access(namespace_->lock); |
+ if (renderbuffer != 0 && |
+ namespace_->renderbuffer_set.find(renderbuffer) == |
+ namespace_->renderbuffer_set.end()) { |
+ ADD_FAILURE() << "bindRenderbuffer called with unknown renderbuffer"; |
+ } else if ((renderbuffer >> 16) != context_id_) { |
+ ADD_FAILURE() |
+ << "bindRenderbuffer called with renderbuffer from other context"; |
+ } |
} |
void TestWebGraphicsContext3D::bindTexture( |
@@ -370,6 +390,8 @@ void TestWebGraphicsContext3D::getIntegerv( |
*value = GL_TEXTURE0; |
else if (pname == GL_UNPACK_ALIGNMENT) |
*value = unpack_alignment_; |
+ else if (pname == GL_FRAMEBUFFER_BINDING) |
+ *value = current_framebuffer_; |
} |
void TestWebGraphicsContext3D::getProgramiv(GLuint program, |
@@ -674,6 +696,37 @@ void TestWebGraphicsContext3D::RetireImageId(GLuint id) { |
DCHECK_EQ(context_id, context_id_); |
} |
+GLuint TestWebGraphicsContext3D::NextFramebufferId() { |
+ base::AutoLock lock_for_framebuffer_access(namespace_->lock); |
+ GLuint id = next_framebuffer_id_++; |
+ DCHECK(id < (1 << 16)); |
+ id |= context_id_ << 16; |
+ framebuffer_set_.insert(id); |
+ return id; |
+} |
+ |
+void TestWebGraphicsContext3D::RetireFramebufferId(GLuint id) { |
+ base::AutoLock lock_for_framebuffer_access(namespace_->lock); |
+ DCHECK(framebuffer_set_.find(id) != framebuffer_set_.end()); |
+ framebuffer_set_.erase(id); |
+} |
+ |
+GLuint TestWebGraphicsContext3D::NextRenderbufferId() { |
+ base::AutoLock lock_for_renderbuffer_access(namespace_->lock); |
+ GLuint id = namespace_->next_renderbuffer_id++; |
+ DCHECK(id < (1 << 16)); |
+ id |= context_id_ << 16; |
+ namespace_->renderbuffer_set.insert(id); |
+ return id; |
+} |
+ |
+void TestWebGraphicsContext3D::RetireRenderbufferId(GLuint id) { |
+ base::AutoLock lock_for_renderbuffer_access(namespace_->lock); |
+ DCHECK(namespace_->renderbuffer_set.find(id) != |
+ namespace_->renderbuffer_set.end()); |
+ namespace_->renderbuffer_set.erase(id); |
+} |
+ |
void TestWebGraphicsContext3D::SetMaxTransferBufferUsageBytes( |
size_t max_transfer_buffer_usage_bytes) { |
test_capabilities_.max_transfer_buffer_usage_bytes = |