| 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
|
|
|