Index: gpu/command_buffer/client/gles2_implementation_unittest.cc |
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc |
index 68ae339a78006f9db2cb554d573abfb4d9a15cc1..324d51fdc010d1a7c5d38130747ca3b570e75dc6 100644 |
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc |
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc |
@@ -130,13 +130,14 @@ const int32 GLES2MockCommandBufferHelper::kTransferBufferId; |
namespace gles2 { |
-using testing::Return; |
-using testing::Mock; |
-using testing::Truly; |
-using testing::Sequence; |
+using testing::_; |
using testing::DoAll; |
+using testing::InSequence; |
using testing::Invoke; |
-using testing::_; |
+using testing::Mock; |
+using testing::Sequence; |
+using testing::Truly; |
+using testing::Return; |
ACTION_P(SetMemory, obj) { |
memcpy(arg0, &obj, sizeof(obj)); |
@@ -208,6 +209,7 @@ class GLES2ImplementationTest : public testing::Test { |
static const GLint kMaxVertexUniformVectors = 128; |
static const GLint kNumCompressedTextureFormats = 0; |
static const GLint kNumShaderBinaryFormats = 0; |
+ static const GLuint kStartId = 1024; |
GLES2ImplementationTest() |
: commands_(NULL), |
@@ -216,6 +218,13 @@ class GLES2ImplementationTest : public testing::Test { |
} |
virtual void SetUp() { |
+ Initialize(false, true); |
+ } |
+ |
+ virtual void TearDown() { |
+ } |
+ |
+ void Initialize(bool shared_resources, bool bind_generates_resource) { |
offset_ = GLES2Implementation::kStartingOffset; |
command_buffer_.reset(new MockGLES2CommandBuffer()); |
@@ -249,17 +258,48 @@ class GLES2ImplementationTest : public testing::Test { |
AllocateTransferBuffer(sizeof(state)); // in |
uint32 offset = AllocateTransferBuffer(sizeof(state)); // out |
- EXPECT_CALL(*command_buffer_, OnFlush(_)) |
- .WillOnce(SetMemoryAtOffset(offset, state)) |
- .RetiresOnSaturation(); |
- GetNextToken(); // eat the token that starting up will use. |
- |
- gl_.reset(new GLES2Implementation( |
- helper_.get(), |
- kTransferBufferSize, |
- transfer_buffer_.ptr, |
- kTransferBufferId, |
- false)); |
+ { |
+ InSequence sequence; |
+ |
+ EXPECT_CALL(*command_buffer_, OnFlush(_)) |
+ .WillOnce(SetMemoryAtOffset(offset, state)) |
+ .RetiresOnSaturation(); |
+ GetNextToken(); // eat the token that starting up will use. |
+ |
+ // Must match StrictSharedIdHandler::kNumIdsToGet. |
+ GLuint num_ids = 2048; |
+ scoped_array<GLuint> all_ids(new GLuint[num_ids]); |
+ if (shared_resources) { |
+ if (!bind_generates_resource) { |
+ GLuint start = kStartId; |
+ GLuint max_num_per = MaxTransferBufferSize() / sizeof(GLuint); |
+ GLuint* ids = all_ids.get(); |
+ for (GLuint ii = 0; ii < num_ids; ++ii) { |
+ ids[ii] = start + ii; |
+ } |
+ while (num_ids) { |
+ GLuint num = std::min(num_ids, max_num_per); |
+ size_t size = num * sizeof(ids[0]); |
+ uint32 offset = AllocateTransferBuffer(size); |
+ EXPECT_CALL(*command_buffer_, OnFlush(_)) |
+ .WillOnce(SetMemoryAtOffsetFromArray(offset, ids, size)) |
+ .RetiresOnSaturation(); |
+ GetNextToken(); |
+ start += num; |
+ ids += num; |
+ num_ids -= num; |
+ } |
+ } |
+ } |
+ |
+ gl_.reset(new GLES2Implementation( |
+ helper_.get(), |
+ kTransferBufferSize, |
+ transfer_buffer_.ptr, |
+ kTransferBufferId, |
+ shared_resources, |
+ bind_generates_resource)); |
+ } |
EXPECT_CALL(*command_buffer_, OnFlush(_)) |
.Times(1) |
@@ -271,9 +311,6 @@ class GLES2ImplementationTest : public testing::Test { |
ClearCommands(); |
} |
- virtual void TearDown() { |
- } |
- |
const void* GetPut() { |
return helper_->GetSpace(0); |
} |
@@ -334,6 +371,13 @@ class GLES2ImplementationTest : public testing::Test { |
uint32 offset_; |
}; |
+class GLES2ImplementationStrictSharedTest : public GLES2ImplementationTest { |
+ protected: |
+ virtual void SetUp() { |
+ Initialize(true, false); |
+ } |
+}; |
+ |
// GCC requires these declarations, but MSVC requires they not be present |
#ifndef _MSC_VER |
const int32 GLES2ImplementationTest::kTransferBufferId; |
@@ -1686,6 +1730,78 @@ TEST_F(GLES2ImplementationTest, TexImage2DSubRows) { |
GetTransferAddressFromOffsetAs<uint8>(offset4, part_size))); |
} |
+// Test that GenBuffer does not call GenSharedIds. |
+// This is because with client side arrays on we know the StrictSharedIdHandler |
+// for buffers has already gotten a set of ids |
+TEST_F(GLES2ImplementationStrictSharedTest, GenBuffer) { |
+ // Starts at + 2 because client side arrays take first 2 ids. |
+ GLuint ids[3] = { kStartId + 2, kStartId + 3, kStartId + 4 }; |
+ struct Cmds { |
+ GenBuffersImmediate gen; |
+ GLuint data[3]; |
+ }; |
+ Cmds expected; |
+ expected.gen.Init(arraysize(ids), &ids[0]); |
+ gl_->GenBuffers(arraysize(ids), &ids[0]); |
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
+ EXPECT_NE(0u, ids[0]); |
+ EXPECT_NE(0u, ids[1]); |
+ EXPECT_NE(0u, ids[2]); |
+} |
+ |
+// Binds can not be cached with bind_generates_resource = false because |
+// our id might not be valid. |
+TEST_F(GLES2ImplementationStrictSharedTest, BindsNotCached) { |
+ struct PNameValue { |
+ GLenum pname; |
+ GLint expected; |
+ }; |
+ const PNameValue pairs[] = { |
+ { GL_TEXTURE_BINDING_2D, 1, }, |
+ { GL_TEXTURE_BINDING_CUBE_MAP, 2, }, |
+ { GL_FRAMEBUFFER_BINDING, 3, }, |
+ { GL_RENDERBUFFER_BINDING, 4, }, |
+ { GL_ARRAY_BUFFER_BINDING, 5, }, |
+ { GL_ELEMENT_ARRAY_BUFFER_BINDING, 6, }, |
+ }; |
+ size_t num_pairs = sizeof(pairs) / sizeof(pairs[0]); |
+ for (size_t ii = 0; ii < num_pairs; ++ii) { |
+ const PNameValue& pv = pairs[ii]; |
+ GLint v = -1; |
+ EXPECT_CALL(*command_buffer_, OnFlush(_)) |
+ .WillOnce(SetMemory(SizedResultHelper<GLuint>(pv.expected))) |
+ .RetiresOnSaturation(); |
+ gl_->GetIntegerv(pv.pname, &v); |
+ EXPECT_EQ(pv.expected, v); |
+ } |
+} |
+ |
+TEST_F(GLES2ImplementationStrictSharedTest, CanNotDeleteIdsWeDidNotCreate) { |
+ GLuint id = 0x12345678; |
+ |
+ EXPECT_CALL(*command_buffer_, OnFlush(_)) |
+ .WillOnce(SetMemory(GLuint(GL_NO_ERROR))) |
+ .WillOnce(SetMemory(GLuint(GL_NO_ERROR))) |
+ .WillOnce(SetMemory(GLuint(GL_NO_ERROR))) |
+ .WillOnce(SetMemory(GLuint(GL_NO_ERROR))) |
+ .WillOnce(SetMemory(GLuint(GL_NO_ERROR))) |
+ .WillOnce(SetMemory(GLuint(GL_NO_ERROR))) |
+ .RetiresOnSaturation(); |
+ |
+ gl_->DeleteBuffers(1, &id); |
+ EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); |
+ gl_->DeleteFramebuffers(1, &id); |
+ EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); |
+ gl_->DeleteRenderbuffers(1, &id); |
+ EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); |
+ gl_->DeleteTextures(1, &id); |
+ EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); |
+ gl_->DeleteProgram(id); |
+ EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); |
+ gl_->DeleteShader(id); |
+ EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); |
+} |
+ |
} // namespace gles2 |
} // namespace gpu |