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

Unified Diff: gpu/command_buffer/service/gles2_cmd_decoder_unittest_buffers.cc

Issue 1001833005: Update from https://crrev.com/320343 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Supress Created 5 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: gpu/command_buffer/service/gles2_cmd_decoder_unittest_buffers.cc
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_buffers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_buffers.cc
new file mode 100644
index 0000000000000000000000000000000000000000..389c78fe1dcd1241c86435d27b7dd19fa41dd7c1
--- /dev/null
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_buffers.cc
@@ -0,0 +1,471 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
+#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h"
+
+using ::gfx::MockGLInterface;
+using ::testing::_;
+using ::testing::Return;
+using ::testing::SetArgPointee;
+
+namespace gpu {
+namespace gles2 {
+
+using namespace cmds;
+
+namespace {
+
+} // namespace anonymous
+
+TEST_P(GLES2DecoderTest, MapBufferRangeUnmapBufferReadSucceeds) {
+ const GLenum kTarget = GL_ARRAY_BUFFER;
+ const GLintptr kOffset = 10;
+ const GLsizeiptr kSize = 64;
+ const GLbitfield kAccess = GL_MAP_READ_BIT;
+
+ uint32_t result_shm_id = kSharedMemoryId;
+ uint32_t result_shm_offset = kSharedMemoryOffset;
+ uint32_t data_shm_id = kSharedMemoryId;
+ // uint32_t is Result for both MapBufferRange and UnmapBuffer commands.
+ uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t);
+
+ DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId);
+
+ std::vector<int8_t> data(kSize);
+ for (GLsizeiptr ii = 0; ii < kSize; ++ii) {
+ data[ii] = static_cast<int8_t>(ii % 255);
+ }
+
+ { // MapBufferRange
+ EXPECT_CALL(*gl_,
+ MapBufferRange(kTarget, kOffset, kSize, kAccess))
+ .WillOnce(Return(&data[0]))
+ .RetiresOnSaturation();
+
+ typedef MapBufferRange::Result Result;
+ Result* result = GetSharedMemoryAs<Result*>();
+
+ MapBufferRange cmd;
+ cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset,
+ result_shm_id, result_shm_offset);
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ *result = 0;
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+ EXPECT_EQ(0u, *result);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ *result = 0;
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ int8_t* mem = reinterpret_cast<int8_t*>(&result[1]);
+ EXPECT_EQ(0, memcmp(&data[0], mem, kSize));
+ EXPECT_EQ(1u, *result);
+ }
+
+ { // UnmapBuffer
+ EXPECT_CALL(*gl_, UnmapBuffer(kTarget))
+ .WillOnce(Return(GL_TRUE))
+ .RetiresOnSaturation();
+
+ UnmapBuffer cmd;
+ cmd.Init(kTarget);
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ }
+
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+}
+
+TEST_P(GLES2DecoderTest, MapBufferRangeUnmapBufferWriteSucceeds) {
+ const GLenum kTarget = GL_ARRAY_BUFFER;
+ const GLintptr kOffset = 10;
+ const GLsizeiptr kSize = 64;
+ const GLbitfield kAccess = GL_MAP_WRITE_BIT;
+ const GLbitfield kMappedAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT;
+
+ uint32_t result_shm_id = kSharedMemoryId;
+ uint32_t result_shm_offset = kSharedMemoryOffset;
+ uint32_t data_shm_id = kSharedMemoryId;
+ // uint32_t is Result for both MapBufferRange and UnmapBuffer commands.
+ uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t);
+
+ DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId);
+
+ std::vector<int8_t> data(kSize);
+ for (GLsizeiptr ii = 0; ii < kSize; ++ii) {
+ data[ii] = static_cast<int8_t>(ii % 255);
+ }
+
+ { // MapBufferRange succeeds
+ EXPECT_CALL(*gl_,
+ MapBufferRange(kTarget, kOffset, kSize, kMappedAccess))
+ .WillOnce(Return(&data[0]))
+ .RetiresOnSaturation();
+
+ typedef MapBufferRange::Result Result;
+ Result* result = GetSharedMemoryAs<Result*>();
+
+ MapBufferRange cmd;
+ cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset,
+ result_shm_id, result_shm_offset);
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ *result = 0;
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+ EXPECT_EQ(0u, *result);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ *result = 0;
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ int8_t* mem = reinterpret_cast<int8_t*>(&result[1]);
+ EXPECT_EQ(0, memcmp(&data[0], mem, kSize));
+ EXPECT_EQ(1u, *result);
+ }
+
+ { // UnmapBuffer succeeds
+ EXPECT_CALL(*gl_, UnmapBuffer(kTarget))
+ .WillOnce(Return(GL_TRUE))
+ .RetiresOnSaturation();
+
+ UnmapBuffer cmd;
+ cmd.Init(kTarget);
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ }
+
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+}
+
+TEST_P(GLES2DecoderTest, MapBufferRangeNotInitFails) {
+ const GLenum kTarget = GL_ARRAY_BUFFER;
+ const GLintptr kOffset = 10;
+ const GLsizeiptr kSize = 64;
+ const GLbitfield kAccess = GL_MAP_READ_BIT;
+ std::vector<int8_t> data(kSize);
+
+ typedef MapBufferRange::Result Result;
+ Result* result = GetSharedMemoryAs<Result*>();
+ *result = 1; // Any value other than 0.
+ uint32_t result_shm_id = kSharedMemoryId;
+ uint32_t result_shm_offset = kSharedMemoryOffset;
+ uint32_t data_shm_id = kSharedMemoryId;
+ uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result);
+
+ MapBufferRange cmd;
+ cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset,
+ result_shm_id, result_shm_offset);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderTest, MapBufferRangeWriteInvalidateRangeSucceeds) {
+ const GLenum kTarget = GL_ARRAY_BUFFER;
+ const GLintptr kOffset = 10;
+ const GLsizeiptr kSize = 64;
+ // With MAP_INVALIDATE_RANGE_BIT, no need to append MAP_READ_BIT.
+ const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT;
+
+ DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId);
+
+ std::vector<int8_t> data(kSize);
+ for (GLsizeiptr ii = 0; ii < kSize; ++ii) {
+ data[ii] = static_cast<int8_t>(ii % 255);
+ }
+ EXPECT_CALL(*gl_,
+ MapBufferRange(kTarget, kOffset, kSize, kAccess))
+ .WillOnce(Return(&data[0]))
+ .RetiresOnSaturation();
+
+ typedef MapBufferRange::Result Result;
+ Result* result = GetSharedMemoryAs<Result*>();
+ *result = 0;
+ uint32_t result_shm_id = kSharedMemoryId;
+ uint32_t result_shm_offset = kSharedMemoryOffset;
+ uint32_t data_shm_id = kSharedMemoryId;
+ uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result);
+
+ int8_t* mem = reinterpret_cast<int8_t*>(&result[1]);
+ memset(mem, 72, kSize); // Init to a random value other than 0.
+
+ MapBufferRange cmd;
+ cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset,
+ result_shm_id, result_shm_offset);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderTest, MapBufferRangeWriteInvalidateBufferSucceeds) {
+ // Test INVALIDATE_BUFFER_BIT is mapped to INVALIDATE_RANGE_BIT.
+ const GLenum kTarget = GL_ARRAY_BUFFER;
+ const GLintptr kOffset = 10;
+ const GLsizeiptr kSize = 64;
+ const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT;
+ // With MAP_INVALIDATE_BUFFER_BIT, no need to append MAP_READ_BIT.
+ const GLbitfield kFilteredAccess =
+ GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT;
+
+ DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId);
+
+ std::vector<int8_t> data(kSize);
+ for (GLsizeiptr ii = 0; ii < kSize; ++ii) {
+ data[ii] = static_cast<int8_t>(ii % 255);
+ }
+ EXPECT_CALL(*gl_,
+ MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess))
+ .WillOnce(Return(&data[0]))
+ .RetiresOnSaturation();
+
+ typedef MapBufferRange::Result Result;
+ Result* result = GetSharedMemoryAs<Result*>();
+ *result = 0;
+ uint32_t result_shm_id = kSharedMemoryId;
+ uint32_t result_shm_offset = kSharedMemoryOffset;
+ uint32_t data_shm_id = kSharedMemoryId;
+ uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result);
+
+ int8_t* mem = reinterpret_cast<int8_t*>(&result[1]);
+ memset(mem, 72, kSize); // Init to a random value other than 0.
+
+ MapBufferRange cmd;
+ cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset,
+ result_shm_id, result_shm_offset);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderTest, MapBufferRangeWriteUnsynchronizedBit) {
+ // Test UNSYNCHRONIZED_BIT is filtered out.
+ const GLenum kTarget = GL_ARRAY_BUFFER;
+ const GLintptr kOffset = 10;
+ const GLsizeiptr kSize = 64;
+ const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT;
+ const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT;
+
+ DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId);
+
+ std::vector<int8_t> data(kSize);
+ for (GLsizeiptr ii = 0; ii < kSize; ++ii) {
+ data[ii] = static_cast<int8_t>(ii % 255);
+ }
+ EXPECT_CALL(*gl_,
+ MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess))
+ .WillOnce(Return(&data[0]))
+ .RetiresOnSaturation();
+
+ typedef MapBufferRange::Result Result;
+ Result* result = GetSharedMemoryAs<Result*>();
+ *result = 0;
+ uint32_t result_shm_id = kSharedMemoryId;
+ uint32_t result_shm_offset = kSharedMemoryOffset;
+ uint32_t data_shm_id = kSharedMemoryId;
+ uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result);
+
+ int8_t* mem = reinterpret_cast<int8_t*>(&result[1]);
+ memset(mem, 72, kSize); // Init to a random value other than 0.
+
+ MapBufferRange cmd;
+ cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset,
+ result_shm_id, result_shm_offset);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(0, memcmp(&data[0], mem, kSize));
+}
+
+TEST_P(GLES2DecoderTest, MapBufferRangeWithError) {
+ const GLenum kTarget = GL_ARRAY_BUFFER;
+ const GLintptr kOffset = 10;
+ const GLsizeiptr kSize = 64;
+ const GLbitfield kAccess = GL_MAP_READ_BIT;
+ std::vector<int8_t> data(kSize);
+ for (GLsizeiptr ii = 0; ii < kSize; ++ii) {
+ data[ii] = static_cast<int8_t>(ii % 255);
+ }
+ EXPECT_CALL(*gl_,
+ MapBufferRange(kTarget, kOffset, kSize, kAccess))
+ .WillOnce(Return(nullptr)) // Return nullptr to indicate a GL error.
+ .RetiresOnSaturation();
+
+ typedef MapBufferRange::Result Result;
+ Result* result = GetSharedMemoryAs<Result*>();
+ *result = 0;
+ uint32_t result_shm_id = kSharedMemoryId;
+ uint32_t result_shm_offset = kSharedMemoryOffset;
+ uint32_t data_shm_id = kSharedMemoryId;
+ uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result);
+
+ int8_t* mem = reinterpret_cast<int8_t*>(&result[1]);
+ memset(mem, 72, kSize); // Init to a random value other than 0.
+
+ MapBufferRange cmd;
+ cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset,
+ result_shm_id, result_shm_offset);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ memset(&data[0], 72, kSize);
+ // Mem is untouched.
+ EXPECT_EQ(0, memcmp(&data[0], mem, kSize));
+ EXPECT_EQ(0u, *result);
+}
+
+TEST_P(GLES2DecoderTest, MapBufferRangeBadSharedMemoryFails) {
+ const GLenum kTarget = GL_ARRAY_BUFFER;
+ const GLintptr kOffset = 10;
+ const GLsizeiptr kSize = 64;
+ const GLbitfield kAccess = GL_MAP_READ_BIT;
+ std::vector<int8_t> data(kSize);
+ for (GLsizeiptr ii = 0; ii < kSize; ++ii) {
+ data[ii] = static_cast<int8_t>(ii % 255);
+ }
+
+ typedef MapBufferRange::Result Result;
+ Result* result = GetSharedMemoryAs<Result*>();
+ *result = 0;
+ uint32_t result_shm_id = kSharedMemoryId;
+ uint32_t result_shm_offset = kSharedMemoryOffset;
+ uint32_t data_shm_id = kSharedMemoryId;
+ uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result);
+
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ MapBufferRange cmd;
+ cmd.Init(kTarget, kOffset, kSize, kAccess,
+ kInvalidSharedMemoryId, data_shm_offset,
+ result_shm_id, result_shm_offset);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+ cmd.Init(kTarget, kOffset, kSize, kAccess,
+ data_shm_id, data_shm_offset,
+ kInvalidSharedMemoryId, result_shm_offset);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+ cmd.Init(kTarget, kOffset, kSize, kAccess,
+ data_shm_id, kInvalidSharedMemoryOffset,
+ result_shm_id, result_shm_offset);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+ cmd.Init(kTarget, kOffset, kSize, kAccess,
+ data_shm_id, data_shm_offset,
+ result_shm_id, kInvalidSharedMemoryOffset);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+}
+
+TEST_P(GLES2DecoderTest, UnmapBufferWriteNotMappedFails) {
+ const GLenum kTarget = GL_ARRAY_BUFFER;
+
+ DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId);
+
+ UnmapBuffer cmd;
+ cmd.Init(kTarget);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
+}
+
+TEST_P(GLES2DecoderTest, UnmapBufferWriteNoBoundBufferFails) {
+ const GLenum kTarget = GL_ARRAY_BUFFER;
+
+ UnmapBuffer cmd;
+ cmd.Init(kTarget);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
+}
+
+TEST_P(GLES2DecoderTest, BufferDataDestroysDataStore) {
+ const GLenum kTarget = GL_ARRAY_BUFFER;
+ const GLintptr kOffset = 10;
+ const GLsizeiptr kSize = 64;
+ const GLbitfield kAccess = GL_MAP_WRITE_BIT;
+ const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT;
+
+ uint32_t result_shm_id = kSharedMemoryId;
+ uint32_t result_shm_offset = kSharedMemoryOffset;
+ uint32_t data_shm_id = kSharedMemoryId;
+ // uint32_t is Result for both MapBufferRange and UnmapBuffer commands.
+ uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t);
+
+ DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId);
+
+ std::vector<int8_t> data(kSize);
+
+ decoder_->set_unsafe_es3_apis_enabled(true);
+
+ { // MapBufferRange succeeds
+ EXPECT_CALL(*gl_,
+ MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess))
+ .WillOnce(Return(&data[0]))
+ .RetiresOnSaturation();
+
+ typedef MapBufferRange::Result Result;
+ Result* result = GetSharedMemoryAs<Result*>();
+
+ MapBufferRange cmd;
+ cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset,
+ result_shm_id, result_shm_offset);
+ *result = 0;
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(1u, *result);
+ }
+
+ { // BufferData unmaps the data store.
+ DoBufferData(kTarget, kSize * 2);
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ }
+
+ { // UnmapBuffer fails.
+ UnmapBuffer cmd;
+ cmd.Init(kTarget);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
+ }
+}
+
+TEST_P(GLES2DecoderTest, DeleteBuffersDestroysDataStore) {
+ const GLenum kTarget = GL_ARRAY_BUFFER;
+ const GLintptr kOffset = 10;
+ const GLsizeiptr kSize = 64;
+ const GLbitfield kAccess = GL_MAP_WRITE_BIT;
+ const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT;
+
+ uint32_t result_shm_id = kSharedMemoryId;
+ uint32_t result_shm_offset = kSharedMemoryOffset;
+ uint32_t data_shm_id = kSharedMemoryId;
+ // uint32_t is Result for both MapBufferRange and UnmapBuffer commands.
+ uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t);
+
+ DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId);
+
+ std::vector<int8_t> data(kSize);
+
+ decoder_->set_unsafe_es3_apis_enabled(true);
+
+ { // MapBufferRange succeeds
+ EXPECT_CALL(*gl_,
+ MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess))
+ .WillOnce(Return(&data[0]))
+ .RetiresOnSaturation();
+
+ typedef MapBufferRange::Result Result;
+ Result* result = GetSharedMemoryAs<Result*>();
+
+ MapBufferRange cmd;
+ cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset,
+ result_shm_id, result_shm_offset);
+ *result = 0;
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(1u, *result);
+ }
+
+ { // DeleteBuffers unmaps the data store.
+ DoDeleteBuffer(client_buffer_id_, kServiceBufferId);
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ }
+
+ { // UnmapBuffer fails.
+ UnmapBuffer cmd;
+ cmd.Init(kTarget);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
+ }
+}
+
+} // namespace gles2
+} // namespace gpu
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h ('k') | gpu/command_buffer/service/gles2_cmd_validation.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698