| Index: gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
|
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
|
| index e0bfc2c1125c90934bb84b2398157e1c9cff6f1a..9ada48633867d4ea002c96c6a342a70c636b60cc 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
|
| @@ -2,7 +2,7 @@
|
| // 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"
|
|
|
| #include "base/command_line.h"
|
| #include "base/strings/string_number_conversions.h"
|
| @@ -16,7 +16,7 @@
|
| #include "gpu/command_buffer/service/context_group.h"
|
| #include "gpu/command_buffer/service/context_state.h"
|
| #include "gpu/command_buffer/service/gl_surface_mock.h"
|
| -#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h"
|
| +#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
|
| #include "gpu/command_buffer/service/gpu_switches.h"
|
| #include "gpu/command_buffer/service/image_manager.h"
|
| #include "gpu/command_buffer/service/mailbox_manager.h"
|
| @@ -39,6 +39,7 @@ using ::testing::DoAll;
|
| using ::testing::InSequence;
|
| using ::testing::Invoke;
|
| using ::testing::MatcherCast;
|
| +using ::testing::Mock;
|
| using ::testing::Pointee;
|
| using ::testing::Return;
|
| using ::testing::SaveArg;
|
| @@ -53,9531 +54,1142 @@ namespace gles2 {
|
|
|
| using namespace cmds;
|
|
|
| -class GLES2DecoderTest : public GLES2DecoderTestBase {
|
| - public:
|
| - GLES2DecoderTest() { }
|
| -
|
| - protected:
|
| - void CheckReadPixelsOutOfRange(
|
| - GLint in_read_x, GLint in_read_y,
|
| - GLsizei in_read_width, GLsizei in_read_height,
|
| - bool init);
|
| -};
|
| -
|
| -class GLES2DecoderTestWithExtensionsOnGLES2
|
| - : public GLES2DecoderTest,
|
| - public ::testing::WithParamInterface<const char*> {
|
| - public:
|
| - GLES2DecoderTestWithExtensionsOnGLES2() {}
|
| -
|
| - virtual void SetUp() {
|
| - InitState init;
|
| - init.extensions = GetParam();
|
| - init.gl_version = "opengl es 2.0";
|
| - init.has_alpha = true;
|
| - init.has_depth = true;
|
| - init.request_alpha = true;
|
| - init.request_depth = true;
|
| - InitDecoder(init);
|
| - }
|
| -};
|
| -
|
| -class GLES2DecoderWithShaderTest : public GLES2DecoderWithShaderTestBase {
|
| - public:
|
| - GLES2DecoderWithShaderTest()
|
| - : GLES2DecoderWithShaderTestBase() {
|
| - }
|
| -
|
| - void CheckTextureChangesMarkFBOAsNotComplete(bool bound_fbo);
|
| - void CheckRenderbufferChangesMarkFBOAsNotComplete(bool bound_fbo);
|
| -};
|
| -
|
| -class GLES2DecoderGeometryInstancingTest : public GLES2DecoderWithShaderTest {
|
| - public:
|
| - GLES2DecoderGeometryInstancingTest()
|
| - : GLES2DecoderWithShaderTest() {
|
| - }
|
| -
|
| - virtual void SetUp() {
|
| - InitState init;
|
| - init.extensions = "GL_ANGLE_instanced_arrays";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.has_alpha = true;
|
| - init.has_depth = true;
|
| - init.request_alpha = true;
|
| - init.request_depth = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - SetupDefaultProgram();
|
| - }
|
| -};
|
| -
|
| -class GLES2DecoderRGBBackbufferTest : public GLES2DecoderWithShaderTest {
|
| - public:
|
| - GLES2DecoderRGBBackbufferTest() { }
|
| -
|
| - virtual void SetUp() {
|
| - // Test codepath with workaround clear_alpha_in_readpixels because
|
| - // ReadPixelsEmulator emulates the incorrect driver behavior.
|
| - CommandLine command_line(0, NULL);
|
| - command_line.AppendSwitchASCII(
|
| - switches::kGpuDriverBugWorkarounds,
|
| - base::IntToString(gpu::CLEAR_ALPHA_IN_READPIXELS));
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoderWithCommandLine(init, &command_line);
|
| - SetupDefaultProgram();
|
| - }
|
| -};
|
| -
|
| -class GLES2DecoderManualInitTest : public GLES2DecoderWithShaderTest {
|
| - public:
|
| - GLES2DecoderManualInitTest() { }
|
| -
|
| - // Override default setup so nothing gets setup.
|
| - virtual void SetUp() {
|
| - }
|
| -};
|
| -
|
| -class GLES2DecoderCompressedFormatsTest : public GLES2DecoderManualInitTest {
|
| - public:
|
| - GLES2DecoderCompressedFormatsTest() { }
|
| -
|
| - static bool ValueInArray(GLint value, GLint* array, GLint count) {
|
| - for (GLint ii = 0; ii < count; ++ii) {
|
| - if (array[ii] == value) {
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - void CheckFormats(const char* extension, const GLenum* formats, int count) {
|
| - InitState init;
|
| - init.extensions = extension;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| -
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - GetIntegerv cmd;
|
| - result->size = 0;
|
| - EXPECT_CALL(*gl_, GetIntegerv(_, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - cmd.Init(
|
| - GL_NUM_COMPRESSED_TEXTURE_FORMATS,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(1, result->GetNumResults());
|
| - GLint num_formats = result->GetData()[0];
|
| - EXPECT_EQ(count, num_formats);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - result->size = 0;
|
| - cmd.Init(
|
| - GL_COMPRESSED_TEXTURE_FORMATS,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(num_formats, result->GetNumResults());
|
| -
|
| - for (int i = 0; i < count; ++i) {
|
| - EXPECT_TRUE(ValueInArray(
|
| - formats[i],
|
| - result->GetData(), result->GetNumResults()));
|
| - }
|
| -
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - }
|
| -};
|
| -
|
| -class GLES2DecoderRestoreStateTest : public GLES2DecoderManualInitTest {
|
| - public:
|
| - GLES2DecoderRestoreStateTest() { }
|
| -
|
| - protected:
|
| - void AddExpectationsForActiveTexture(GLenum unit);
|
| - void AddExpectationsForBindTexture(GLenum target, GLuint id);
|
| - void InitializeContextState(
|
| - ContextState* state, uint32 non_default_unit, uint32 active_unit);
|
| -};
|
| -
|
| -void GLES2DecoderRestoreStateTest::AddExpectationsForActiveTexture(
|
| - GLenum unit) {
|
| - EXPECT_CALL(*gl_, ActiveTexture(unit))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -}
|
| -
|
| -void GLES2DecoderRestoreStateTest::AddExpectationsForBindTexture(GLenum target,
|
| - GLuint id) {
|
| - EXPECT_CALL(*gl_, BindTexture(target, id))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -}
|
| -
|
| -void GLES2DecoderRestoreStateTest::InitializeContextState(
|
| - ContextState* state, uint32 non_default_unit, uint32 active_unit) {
|
| - state->texture_units.resize(group().max_texture_units());
|
| - for (uint32 tt = 0; tt < state->texture_units.size(); ++tt) {
|
| - TextureRef* ref_cube_map =
|
| - group().texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP);
|
| - state->texture_units[tt].bound_texture_cube_map = ref_cube_map;
|
| - TextureRef* ref_2d =
|
| - (tt == non_default_unit)
|
| - ? group().texture_manager()->GetTexture(client_texture_id_)
|
| - : group().texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D);
|
| - state->texture_units[tt].bound_texture_2d = ref_2d;
|
| - }
|
| - state->active_texture_unit = active_unit;
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawArraysNoAttributesSucceeds) {
|
| - SetupTexture();
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -// Tests when the math overflows (0x40000000 * sizeof GLfloat)
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0OverflowFails) {
|
| - const GLsizei kLargeCount = 0x40000000;
|
| - SetupTexture();
|
| - EXPECT_CALL(*gl_, DrawArrays(_, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kLargeCount);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| - EXPECT_FALSE(GetDecoder()->WasContextLost());
|
| -}
|
| -
|
| -// Tests when the math overflows (0x7FFFFFFF + 1 = 0x8000000 verts)
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0PosToNegFails) {
|
| - const GLsizei kLargeCount = 0x7FFFFFFF;
|
| - SetupTexture();
|
| - EXPECT_CALL(*gl_, DrawArrays(_, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kLargeCount);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| - EXPECT_FALSE(GetDecoder()->WasContextLost());
|
| -}
|
| -
|
| -// Tests when the driver returns an error
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0OOMFails) {
|
| - const GLsizei kFakeLargeCount = 0x1234;
|
| - SetupTexture();
|
| - AddExpectationsForSimulatedAttrib0WithError(
|
| - kFakeLargeCount, 0, GL_OUT_OF_MEMORY);
|
| - EXPECT_CALL(*gl_, DrawArrays(_, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kFakeLargeCount);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| - EXPECT_FALSE(GetDecoder()->WasContextLost());
|
| -}
|
| -
|
| -// Test that we lose context.
|
| -TEST_F(GLES2DecoderManualInitTest, LoseContextWhenOOM) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.has_alpha = true;
|
| - init.has_depth = true;
|
| - init.request_alpha = true;
|
| - init.request_depth = true;
|
| - init.bind_generates_resource = true;
|
| - init.lose_context_when_out_of_memory = true;
|
| - InitDecoder(init);
|
| - SetupDefaultProgram();
|
| -
|
| - const GLsizei kFakeLargeCount = 0x1234;
|
| - SetupTexture();
|
| - AddExpectationsForSimulatedAttrib0WithError(
|
| - kFakeLargeCount, 0, GL_OUT_OF_MEMORY);
|
| - EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0).RetiresOnSaturation();
|
| - // Other contexts in the group should be lost also.
|
| - EXPECT_CALL(*mock_decoder_, LoseContext(GL_UNKNOWN_CONTEXT_RESET_ARB))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kFakeLargeCount);
|
| - // This context should be lost.
|
| - EXPECT_EQ(error::kLostContext, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| - EXPECT_TRUE(decoder_->WasContextLost());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawArraysBadTextureUsesBlack) {
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - // This is an NPOT texture. As the default filtering requires mips
|
| - // this should trigger replacing with black textures before rendering.
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - {
|
| - InSequence sequence;
|
| - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, BindTexture(
|
| - GL_TEXTURE_2D, TestHelper::kServiceBlackTexture2dId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - }
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawArraysMissingAttributesFails) {
|
| - DoEnableVertexAttribArray(1);
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(_, _, _))
|
| - .Times(0);
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest,
|
| - DrawArraysMissingAttributesZeroCountSucceeds) {
|
| - DoEnableVertexAttribArray(1);
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(_, _, _))
|
| - .Times(0);
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, 0);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawArraysValidAttributesSucceeds) {
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - DoEnableVertexAttribArray(1);
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -// Same as DrawArraysValidAttributesSucceeds, but with workaround
|
| -// |init_vertex_attributes|.
|
| -TEST_F(GLES2DecoderManualInitTest, InitVertexAttributes) {
|
| +void GLES2DecoderRGBBackbufferTest::SetUp() {
|
| + // Test codepath with workaround clear_alpha_in_readpixels because
|
| + // ReadPixelsEmulator emulates the incorrect driver behavior.
|
| CommandLine command_line(0, NULL);
|
| command_line.AppendSwitchASCII(
|
| switches::kGpuDriverBugWorkarounds,
|
| - base::IntToString(gpu::INIT_VERTEX_ATTRIBUTES));
|
| + base::IntToString(gpu::CLEAR_ALPHA_IN_READPIXELS));
|
| InitState init;
|
| init.gl_version = "3.0";
|
| - init.has_alpha = true;
|
| - init.has_depth = true;
|
| - init.request_alpha = true;
|
| - init.request_depth = true;
|
| init.bind_generates_resource = true;
|
| InitDecoderWithCommandLine(init, &command_line);
|
| SetupDefaultProgram();
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - DoEnableVertexAttribArray(1);
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawArraysDeletedBufferFails) {
|
| - SetupVertexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| - DeleteVertexBuffer();
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(_, _, _))
|
| - .Times(0);
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| }
|
|
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawArraysDeletedProgramSucceeds) {
|
| - SetupTexture();
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - DoDeleteProgram(client_program_id_, kServiceProgramId);
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(_, _, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId))
|
| - .Times(1);
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +// Override default setup so nothing gets setup.
|
| +void GLES2DecoderManualInitTest::SetUp() {
|
| }
|
|
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawArraysWithInvalidModeFails) {
|
| - SetupVertexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(_, _, _))
|
| - .Times(0);
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_QUADS, 0, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| - cmd.Init(GL_POLYGON, 0, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| +TEST_F(GLES2DecoderTest, GetIntegervCached) {
|
| + struct TestInfo {
|
| + GLenum pname;
|
| + GLint expected;
|
| + };
|
| + TestInfo tests[] = {
|
| + {
|
| + GL_MAX_TEXTURE_SIZE, TestHelper::kMaxTextureSize,
|
| + },
|
| + {
|
| + GL_MAX_CUBE_MAP_TEXTURE_SIZE, TestHelper::kMaxCubeMapTextureSize,
|
| + },
|
| + {
|
| + GL_MAX_RENDERBUFFER_SIZE, TestHelper::kMaxRenderbufferSize,
|
| + },
|
| + };
|
| + typedef GetIntegerv::Result Result;
|
| + for (size_t ii = 0; ii < sizeof(tests) / sizeof(tests[0]); ++ii) {
|
| + const TestInfo& test = tests[ii];
|
| + Result* result = static_cast<Result*>(shared_memory_address_);
|
| + EXPECT_CALL(*gl_, GetError())
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, GetIntegerv(test.pname, _)).Times(0);
|
| + result->size = 0;
|
| + GetIntegerv cmd2;
|
| + cmd2.Init(test.pname, shared_memory_id_, shared_memory_offset_);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(test.pname),
|
| + result->GetNumResults());
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(test.expected, result->GetData()[0]);
|
| + }
|
| }
|
|
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawArraysInvalidCountFails) {
|
| - SetupVertexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| +TEST_F(GLES2DecoderWithShaderTest, GetMaxValueInBufferCHROMIUM) {
|
| + SetupIndexBuffer();
|
| + GetMaxValueInBufferCHROMIUM::Result* result =
|
| + static_cast<GetMaxValueInBufferCHROMIUM::Result*>(shared_memory_address_);
|
| + *result = 0;
|
|
|
| - // Try start > 0
|
| - EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0);
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 1, kNumVertices);
|
| + GetMaxValueInBufferCHROMIUM cmd;
|
| + cmd.Init(client_element_buffer_id_,
|
| + kValidIndexRangeCount,
|
| + GL_UNSIGNED_SHORT,
|
| + kValidIndexRangeStart * 2,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| + EXPECT_EQ(7u, *result);
|
| EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Try with count > size
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices + 1);
|
| + cmd.Init(client_element_buffer_id_,
|
| + kValidIndexRangeCount + 1,
|
| + GL_UNSIGNED_SHORT,
|
| + kValidIndexRangeStart * 2,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| + EXPECT_EQ(100u, *result);
|
| EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
|
|
| - // Try with attrib offset > 0
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 4);
|
| + cmd.Init(kInvalidClientId,
|
| + kValidIndexRangeCount,
|
| + GL_UNSIGNED_SHORT,
|
| + kValidIndexRangeStart * 2,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Try with size > 2 (ie, vec3 instead of vec2)
|
| - DoVertexAttribPointer(1, 3, GL_FLOAT, 0, 0);
|
| + EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| + cmd.Init(client_element_buffer_id_,
|
| + kOutOfRangeIndexRangeEnd,
|
| + GL_UNSIGNED_SHORT,
|
| + kValidIndexRangeStart * 2,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Try with stride > 8 (vec2 + vec2 byte)
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, sizeof(GLfloat) * 3, 0);
|
| + cmd.Init(client_element_buffer_id_,
|
| + kValidIndexRangeCount + 1,
|
| + GL_UNSIGNED_SHORT,
|
| + kOutOfRangeIndexRangeEnd * 2,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawArraysInstancedANGLEFails) {
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - DoEnableVertexAttribArray(1);
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DrawArraysInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1);
|
| + cmd.Init(client_element_buffer_id_,
|
| + kValidIndexRangeCount + 1,
|
| + GL_UNSIGNED_SHORT,
|
| + kValidIndexRangeStart * 2,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawArraysInstancedANGLENoAttributesFails) {
|
| - SetupTexture();
|
| -
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DrawArraysInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1);
|
| + cmd.Init(client_buffer_id_,
|
| + kValidIndexRangeCount + 1,
|
| + GL_UNSIGNED_SHORT,
|
| + kValidIndexRangeStart * 2,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| + cmd.Init(client_element_buffer_id_,
|
| + kValidIndexRangeCount + 1,
|
| + GL_UNSIGNED_SHORT,
|
| + kValidIndexRangeStart * 2,
|
| + kInvalidSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| + cmd.Init(client_element_buffer_id_,
|
| + kValidIndexRangeCount + 1,
|
| + GL_UNSIGNED_SHORT,
|
| + kValidIndexRangeStart * 2,
|
| + kSharedMemoryId,
|
| + kInvalidSharedMemoryOffset);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| }
|
|
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawArraysInstancedANGLESimulatedAttrib0) {
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| +TEST_F(GLES2DecoderTest, SharedIds) {
|
| + GenSharedIdsCHROMIUM gen_cmd;
|
| + RegisterSharedIdsCHROMIUM reg_cmd;
|
| + DeleteSharedIdsCHROMIUM del_cmd;
|
|
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| + const GLuint kNamespaceId = id_namespaces::kTextures;
|
| + const GLuint kExpectedId1 = 1;
|
| + const GLuint kExpectedId2 = 2;
|
| + const GLuint kExpectedId3 = 4;
|
| + const GLuint kRegisterId = 3;
|
| + GLuint* ids = GetSharedMemoryAs<GLuint*>();
|
| + gen_cmd.Init(kNamespaceId, 0, 2, kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(gen_cmd));
|
| + IdAllocatorInterface* id_allocator = GetIdAllocator(kNamespaceId);
|
| + ASSERT_TRUE(id_allocator != NULL);
|
| + // This check is implementation dependant but it's kind of hard to check
|
| + // otherwise.
|
| + EXPECT_EQ(kExpectedId1, ids[0]);
|
| + EXPECT_EQ(kExpectedId2, ids[1]);
|
| + EXPECT_TRUE(id_allocator->InUse(kExpectedId1));
|
| + EXPECT_TRUE(id_allocator->InUse(kExpectedId2));
|
| + EXPECT_FALSE(id_allocator->InUse(kRegisterId));
|
| + EXPECT_FALSE(id_allocator->InUse(kExpectedId3));
|
|
|
| - DoVertexAttribDivisorANGLE(0, 1);
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, 3))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 1))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArraysInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices, 3);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| + ClearSharedMemory();
|
| + ids[0] = kRegisterId;
|
| + reg_cmd.Init(kNamespaceId, 1, kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(reg_cmd));
|
| + EXPECT_TRUE(id_allocator->InUse(kExpectedId1));
|
| + EXPECT_TRUE(id_allocator->InUse(kExpectedId2));
|
| + EXPECT_TRUE(id_allocator->InUse(kRegisterId));
|
| + EXPECT_FALSE(id_allocator->InUse(kExpectedId3));
|
|
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawArraysInstancedANGLEMissingAttributesFails) {
|
| - DoEnableVertexAttribArray(1);
|
| + ClearSharedMemory();
|
| + gen_cmd.Init(kNamespaceId, 0, 1, kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(gen_cmd));
|
| + EXPECT_EQ(kExpectedId3, ids[0]);
|
| + EXPECT_TRUE(id_allocator->InUse(kExpectedId1));
|
| + EXPECT_TRUE(id_allocator->InUse(kExpectedId2));
|
| + EXPECT_TRUE(id_allocator->InUse(kRegisterId));
|
| + EXPECT_TRUE(id_allocator->InUse(kExpectedId3));
|
|
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
|
| - .Times(0);
|
| - DrawArraysInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| + ClearSharedMemory();
|
| + ids[0] = kExpectedId1;
|
| + ids[1] = kRegisterId;
|
| + del_cmd.Init(kNamespaceId, 2, kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(del_cmd));
|
| + EXPECT_FALSE(id_allocator->InUse(kExpectedId1));
|
| + EXPECT_TRUE(id_allocator->InUse(kExpectedId2));
|
| + EXPECT_FALSE(id_allocator->InUse(kRegisterId));
|
| + EXPECT_TRUE(id_allocator->InUse(kExpectedId3));
|
|
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawArraysInstancedANGLEMissingAttributesZeroCountSucceeds) {
|
| - DoEnableVertexAttribArray(1);
|
| + ClearSharedMemory();
|
| + ids[0] = kExpectedId3;
|
| + ids[1] = kExpectedId2;
|
| + del_cmd.Init(kNamespaceId, 2, kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(del_cmd));
|
| + EXPECT_FALSE(id_allocator->InUse(kExpectedId1));
|
| + EXPECT_FALSE(id_allocator->InUse(kExpectedId2));
|
| + EXPECT_FALSE(id_allocator->InUse(kRegisterId));
|
| + EXPECT_FALSE(id_allocator->InUse(kExpectedId3));
|
|
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
|
| - .Times(0);
|
| - DrawArraysInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, 0, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + // Check passing in an id_offset.
|
| + ClearSharedMemory();
|
| + const GLuint kOffset = 0xABCDEF;
|
| + gen_cmd.Init(kNamespaceId, kOffset, 2, kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(gen_cmd));
|
| + EXPECT_EQ(kOffset, ids[0]);
|
| + EXPECT_EQ(kOffset + 1, ids[1]);
|
| }
|
|
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawArraysInstancedANGLEValidAttributesSucceeds) {
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - DoEnableVertexAttribArray(1);
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| -
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, 1))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArraysInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +TEST_F(GLES2DecoderTest, GenSharedIdsCHROMIUMBadArgs) {
|
| + const GLuint kNamespaceId = id_namespaces::kTextures;
|
| + GenSharedIdsCHROMIUM cmd;
|
| + cmd.Init(kNamespaceId, 0, -1, kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| + cmd.Init(kNamespaceId, 0, 1, kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| + cmd.Init(kNamespaceId, 0, 1, kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| }
|
|
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawArraysInstancedANGLEWithInvalidModeFails) {
|
| - SetupVertexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
|
| - .Times(0);
|
| - DrawArraysInstancedANGLE cmd;
|
| - cmd.Init(GL_QUADS, 0, 1, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| - cmd.Init(GL_POLYGON, 0, 1, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| +TEST_F(GLES2DecoderTest, RegisterSharedIdsCHROMIUMBadArgs) {
|
| + const GLuint kNamespaceId = id_namespaces::kTextures;
|
| + RegisterSharedIdsCHROMIUM cmd;
|
| + cmd.Init(kNamespaceId, -1, kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| + cmd.Init(kNamespaceId, 1, kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| + cmd.Init(kNamespaceId, 1, kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| }
|
|
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawArraysInstancedANGLEInvalidPrimcountFails) {
|
| - SetupVertexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
|
| - .Times(0);
|
| - DrawArraysInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, 1, -1);
|
| +TEST_F(GLES2DecoderTest, RegisterSharedIdsCHROMIUMDuplicateIds) {
|
| + const GLuint kNamespaceId = id_namespaces::kTextures;
|
| + const GLuint kRegisterId = 3;
|
| + RegisterSharedIdsCHROMIUM cmd;
|
| + GLuint* ids = GetSharedMemoryAs<GLuint*>();
|
| + ids[0] = kRegisterId;
|
| + cmd.Init(kNamespaceId, 1, kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + cmd.Init(kNamespaceId, 1, kSharedMemoryId, kSharedMemoryOffset);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| }
|
|
|
| -// Per-instance data is twice as large, but number of instances is half
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawArraysInstancedANGLELargeInstanceSucceeds) {
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - DoEnableVertexAttribArray(0);
|
| - DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0);
|
| - DoVertexAttribDivisorANGLE(0, 1);
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices,
|
| - kNumVertices / 2))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArraysInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices / 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +TEST_F(GLES2DecoderTest, DeleteSharedIdsCHROMIUMBadArgs) {
|
| + const GLuint kNamespaceId = id_namespaces::kTextures;
|
| + DeleteSharedIdsCHROMIUM cmd;
|
| + cmd.Init(kNamespaceId, -1, kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| + cmd.Init(kNamespaceId, 1, kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| + cmd.Init(kNamespaceId, 1, kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| }
|
|
|
| -// Per-instance data is twice as large, but divisor is twice
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawArraysInstancedANGLELargeDivisorSucceeds) {
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - DoEnableVertexAttribArray(0);
|
| - DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0);
|
| - DoVertexAttribDivisorANGLE(0, 2);
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices,
|
| - kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArraysInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +TEST_F(GLES2DecoderTest, IsBuffer) {
|
| + EXPECT_FALSE(DoIsBuffer(client_buffer_id_));
|
| + DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
|
| + EXPECT_TRUE(DoIsBuffer(client_buffer_id_));
|
| + DoDeleteBuffer(client_buffer_id_, kServiceBufferId);
|
| + EXPECT_FALSE(DoIsBuffer(client_buffer_id_));
|
| }
|
|
|
| -TEST_F(GLES2DecoderGeometryInstancingTest, DrawArraysInstancedANGLELargeFails) {
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - DoEnableVertexAttribArray(0);
|
| - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
|
| - DoVertexAttribDivisorANGLE(0, 1);
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DrawArraysInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices + 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices + 1, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +TEST_F(GLES2DecoderTest, IsFramebuffer) {
|
| + EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_));
|
| + DoBindFramebuffer(
|
| + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| + EXPECT_TRUE(DoIsFramebuffer(client_framebuffer_id_));
|
| + DoDeleteFramebuffer(client_framebuffer_id_,
|
| + kServiceFramebufferId,
|
| + true,
|
| + GL_FRAMEBUFFER,
|
| + 0,
|
| + true,
|
| + GL_FRAMEBUFFER,
|
| + 0);
|
| + EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_));
|
| }
|
|
|
| -// Per-index data is twice as large, but number of indices is half
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawArraysInstancedANGLELargeIndexSucceeds) {
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - DoVertexAttribPointer(1, 4, GL_FLOAT, 0, 0);
|
| -
|
| - DoEnableVertexAttribArray(0);
|
| - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
|
| - DoVertexAttribDivisorANGLE(0, 1);
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices / 2,
|
| - kNumVertices))
|
| +TEST_F(GLES2DecoderTest, IsProgram) {
|
| + // IsProgram is true as soon as the program is created.
|
| + EXPECT_TRUE(DoIsProgram(client_program_id_));
|
| + EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId))
|
| .Times(1)
|
| .RetiresOnSaturation();
|
| - DrawArraysInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices / 2, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + DoDeleteProgram(client_program_id_, kServiceProgramId);
|
| + EXPECT_FALSE(DoIsProgram(client_program_id_));
|
| }
|
|
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawArraysInstancedANGLENoDivisor0Fails) {
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - DoEnableVertexAttribArray(0);
|
| - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
|
| - DoVertexAttribDivisorANGLE(0, 1);
|
| - DoVertexAttribDivisorANGLE(1, 1);
|
| - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DrawArraysInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +TEST_F(GLES2DecoderTest, IsRenderbuffer) {
|
| + EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_));
|
| + DoBindRenderbuffer(
|
| + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId);
|
| + EXPECT_TRUE(DoIsRenderbuffer(client_renderbuffer_id_));
|
| + DoDeleteRenderbuffer(client_renderbuffer_id_, kServiceRenderbufferId);
|
| + EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_));
|
| }
|
|
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawElementsNoAttributesSucceeds) {
|
| - SetupTexture();
|
| - SetupIndexBuffer();
|
| - AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount,
|
| - GL_UNSIGNED_SHORT,
|
| - BufferOffset(kValidIndexRangeStart * 2)))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawElements cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +TEST_F(GLES2DecoderTest, IsShader) {
|
| + // IsShader is true as soon as the program is created.
|
| + EXPECT_TRUE(DoIsShader(client_shader_id_));
|
| + DoDeleteShader(client_shader_id_, kServiceShaderId);
|
| + EXPECT_FALSE(DoIsShader(client_shader_id_));
|
| }
|
|
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawElementsMissingAttributesFails) {
|
| - SetupIndexBuffer();
|
| - DoEnableVertexAttribArray(1);
|
| -
|
| - EXPECT_CALL(*gl_, DrawElements(_, _, _, _))
|
| - .Times(0);
|
| - DrawElements cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| +TEST_F(GLES2DecoderTest, IsTexture) {
|
| + EXPECT_FALSE(DoIsTexture(client_texture_id_));
|
| + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| + EXPECT_TRUE(DoIsTexture(client_texture_id_));
|
| + DoDeleteTexture(client_texture_id_, kServiceTextureId);
|
| + EXPECT_FALSE(DoIsTexture(client_texture_id_));
|
| }
|
|
|
| -TEST_F(GLES2DecoderWithShaderTest,
|
| - DrawElementsMissingAttributesZeroCountSucceeds) {
|
| - SetupIndexBuffer();
|
| - DoEnableVertexAttribArray(1);
|
| -
|
| - EXPECT_CALL(*gl_, DrawElements(_, _, _, _))
|
| - .Times(0);
|
| - DrawElements cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| +TEST_F(GLES2DecoderTest, GetMultipleIntegervCHROMIUMValidArgs) {
|
| + const GLsizei kCount = 3;
|
| + GLenum* pnames = GetSharedMemoryAs<GLenum*>();
|
| + pnames[0] = GL_DEPTH_WRITEMASK;
|
| + pnames[1] = GL_COLOR_WRITEMASK;
|
| + pnames[2] = GL_STENCIL_WRITEMASK;
|
| + GLint* results =
|
| + GetSharedMemoryAsWithOffset<GLint*>(sizeof(*pnames) * kCount);
|
|
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawElementsExtraAttributesFails) {
|
| - SetupIndexBuffer();
|
| - DoEnableVertexAttribArray(6);
|
| + GLsizei num_results = 0;
|
| + for (GLsizei ii = 0; ii < kCount; ++ii) {
|
| + num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]);
|
| + }
|
| + const GLsizei result_size = num_results * sizeof(*results);
|
| + memset(results, 0, result_size);
|
|
|
| - EXPECT_CALL(*gl_, DrawElements(_, _, _, _))
|
| - .Times(0);
|
| - DrawElements cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| + const GLint kSentinel = 0x12345678;
|
| + results[num_results] = kSentinel;
|
|
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawElementsValidAttributesSucceeds) {
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - SetupIndexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| - AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| + GetMultipleIntegervCHROMIUM cmd;
|
| + cmd.Init(kSharedMemoryId,
|
| + kSharedMemoryOffset,
|
| + kCount,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset + sizeof(*pnames) * kCount,
|
| + result_size);
|
|
|
| - EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount,
|
| - GL_UNSIGNED_SHORT,
|
| - BufferOffset(kValidIndexRangeStart * 2)))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawElements cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(1, results[0]); // Depth writemask
|
| + EXPECT_EQ(1, results[1]); // color writemask red
|
| + EXPECT_EQ(1, results[2]); // color writemask green
|
| + EXPECT_EQ(1, results[3]); // color writemask blue
|
| + EXPECT_EQ(1, results[4]); // color writemask alpha
|
| + EXPECT_EQ(-1, results[5]); // stencil writemask alpha
|
| + EXPECT_EQ(kSentinel, results[num_results]); // End of results
|
| }
|
|
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawElementsDeletedBufferFails) {
|
| - SetupVertexBuffer();
|
| - SetupIndexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| - DeleteIndexBuffer();
|
| +TEST_F(GLES2DecoderTest, GetMultipleIntegervCHROMIUMInvalidArgs) {
|
| + const GLsizei kCount = 3;
|
| + // Offset the pnames because GLGetError will use the first uint32.
|
| + const uint32 kPnameOffset = sizeof(uint32);
|
| + const uint32 kResultsOffset = kPnameOffset + sizeof(GLint) * kCount;
|
| + GLenum* pnames = GetSharedMemoryAsWithOffset<GLenum*>(kPnameOffset);
|
| + pnames[0] = GL_DEPTH_WRITEMASK;
|
| + pnames[1] = GL_COLOR_WRITEMASK;
|
| + pnames[2] = GL_STENCIL_WRITEMASK;
|
| + GLint* results = GetSharedMemoryAsWithOffset<GLint*>(kResultsOffset);
|
|
|
| - EXPECT_CALL(*gl_, DrawElements(_, _, _, _))
|
| - .Times(0);
|
| - DrawElements cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| + GLsizei num_results = 0;
|
| + for (GLsizei ii = 0; ii < kCount; ++ii) {
|
| + num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]);
|
| + }
|
| + const GLsizei result_size = num_results * sizeof(*results);
|
| + memset(results, 0, result_size);
|
|
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawElementsDeletedProgramSucceeds) {
|
| - SetupTexture();
|
| - SetupIndexBuffer();
|
| - AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - DoDeleteProgram(client_program_id_, kServiceProgramId);
|
| + const GLint kSentinel = 0x12345678;
|
| + results[num_results] = kSentinel;
|
|
|
| - EXPECT_CALL(*gl_, DrawElements(_, _, _, _))
|
| - .Times(1);
|
| - EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId))
|
| - .Times(1);
|
| - DrawElements cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + GetMultipleIntegervCHROMIUM cmd;
|
| + // Check bad pnames pointer.
|
| + cmd.Init(kInvalidSharedMemoryId,
|
| + kSharedMemoryOffset + kPnameOffset,
|
| + kCount,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset + kResultsOffset,
|
| + result_size);
|
| + EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawElementsWithInvalidModeFails) {
|
| - SetupVertexBuffer();
|
| - SetupIndexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - EXPECT_CALL(*gl_, DrawElements(_, _, _, _))
|
| - .Times(0);
|
| - DrawElements cmd;
|
| - cmd.Init(GL_QUADS, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2);
|
| + // Check bad pnames pointer.
|
| + cmd.Init(kSharedMemoryId,
|
| + kInvalidSharedMemoryOffset,
|
| + kCount,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset + kResultsOffset,
|
| + result_size);
|
| + EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + // Check bad count.
|
| + cmd.Init(kSharedMemoryId,
|
| + kSharedMemoryOffset + kPnameOffset,
|
| + -1,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset + kResultsOffset,
|
| + result_size);
|
| + EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + // Check bad results pointer.
|
| + cmd.Init(kSharedMemoryId,
|
| + kSharedMemoryOffset + kPnameOffset,
|
| + kCount,
|
| + kInvalidSharedMemoryId,
|
| + kSharedMemoryOffset + kResultsOffset,
|
| + result_size);
|
| + EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + // Check bad results pointer.
|
| + cmd.Init(kSharedMemoryId,
|
| + kSharedMemoryOffset + kPnameOffset,
|
| + kCount,
|
| + kSharedMemoryId,
|
| + kInvalidSharedMemoryOffset,
|
| + result_size);
|
| + EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + // Check bad size.
|
| + cmd.Init(kSharedMemoryId,
|
| + kSharedMemoryOffset + kPnameOffset,
|
| + kCount,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset + kResultsOffset,
|
| + result_size + 1);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| - cmd.Init(GL_POLYGON, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart);
|
| + EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| + // Check bad size.
|
| + cmd.Init(kSharedMemoryId,
|
| + kSharedMemoryOffset + kPnameOffset,
|
| + kCount,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset + kResultsOffset,
|
| + result_size - 1);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| + // Check bad enum.
|
| + cmd.Init(kSharedMemoryId,
|
| + kSharedMemoryOffset + kPnameOffset,
|
| + kCount,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset + kResultsOffset,
|
| + result_size);
|
| + GLenum temp = pnames[2];
|
| + pnames[2] = GL_TRUE;
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| + pnames[2] = temp;
|
| + // Check results area has not been cleared by client.
|
| + results[1] = 1;
|
| + EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd));
|
| + // Check buffer is what we expect
|
| + EXPECT_EQ(0, results[0]);
|
| + EXPECT_EQ(1, results[1]);
|
| + EXPECT_EQ(0, results[2]);
|
| + EXPECT_EQ(0, results[3]);
|
| + EXPECT_EQ(0, results[4]);
|
| + EXPECT_EQ(0, results[5]);
|
| + EXPECT_EQ(kSentinel, results[num_results]); // End of results
|
| }
|
|
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawElementsInvalidCountFails) {
|
| - SetupVertexBuffer();
|
| - SetupIndexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - // Try start > 0
|
| - EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0);
|
| - DrawElements cmd;
|
| - cmd.Init(GL_TRIANGLES, kNumIndices, GL_UNSIGNED_SHORT, 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Try with count > size
|
| - cmd.Init(GL_TRIANGLES, kNumIndices + 1, GL_UNSIGNED_SHORT, 0);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawElementsOutOfRangeIndicesFails) {
|
| - SetupVertexBuffer();
|
| - SetupIndexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0);
|
| - DrawElements cmd;
|
| - cmd.Init(GL_TRIANGLES, kInvalidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kInvalidIndexRangeStart * 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawElementsOddOffsetForUint16Fails) {
|
| - SetupVertexBuffer();
|
| - SetupIndexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0);
|
| - DrawElements cmd;
|
| - cmd.Init(GL_TRIANGLES, kInvalidIndexRangeCount, GL_UNSIGNED_SHORT, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawElementsInstancedANGLEFails) {
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - SetupIndexBuffer();
|
| - DoEnableVertexAttribArray(1);
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DrawElementsInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawElementsInstancedANGLENoAttributesFails) {
|
| - SetupTexture();
|
| - SetupIndexBuffer();
|
| -
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DrawElementsInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawElementsInstancedANGLESimulatedAttrib0) {
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - SetupIndexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| -
|
| - DoVertexAttribDivisorANGLE(0, 1);
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(
|
| - GL_TRIANGLES,
|
| - kValidIndexRangeCount,
|
| - GL_UNSIGNED_SHORT,
|
| - BufferOffset(kValidIndexRangeStart * 2),
|
| - 3))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 1))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawElementsInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, 3);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawElementsInstancedANGLEMissingAttributesFails) {
|
| - SetupIndexBuffer();
|
| - DoEnableVertexAttribArray(1);
|
| -
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
|
| - .Times(0);
|
| - DrawElementsInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawElementsInstancedANGLEMissingAttributesZeroCountSucceeds) {
|
| - SetupIndexBuffer();
|
| - DoEnableVertexAttribArray(1);
|
| -
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
|
| - .Times(0);
|
| - DrawElementsInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawElementsInstancedANGLEValidAttributesSucceeds) {
|
| - SetupIndexBuffer();
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - DoEnableVertexAttribArray(1);
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| - AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| -
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(
|
| - GL_TRIANGLES,
|
| - kValidIndexRangeCount,
|
| - GL_UNSIGNED_SHORT,
|
| - BufferOffset(kValidIndexRangeStart * 2),
|
| - 1))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawElementsInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawElementsInstancedANGLEWithInvalidModeFails) {
|
| - SetupIndexBuffer();
|
| - SetupVertexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
|
| - .Times(0);
|
| - DrawElementsInstancedANGLE cmd;
|
| - cmd.Init(GL_QUADS, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| - cmd.Init(GL_INVALID_ENUM, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -}
|
| -
|
| -// Per-instance data is twice as large, but number of instances is half
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawElementsInstancedANGLELargeInstanceSucceeds) {
|
| - SetupTexture();
|
| - SetupIndexBuffer();
|
| - SetupVertexBuffer();
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - //Add offset so we're sure we're accessing data near the end of the buffer.
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0,
|
| - (kNumVertices - kMaxValidIndex - 1) * 2 *
|
| - sizeof(GLfloat));
|
| -
|
| - DoEnableVertexAttribArray(0);
|
| - DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0);
|
| - DoVertexAttribDivisorANGLE(0, 1);
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(
|
| - GL_TRIANGLES,
|
| - kValidIndexRangeCount,
|
| - GL_UNSIGNED_SHORT,
|
| - BufferOffset(kValidIndexRangeStart * 2),
|
| - kNumVertices / 2))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawElementsInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, kNumVertices / 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -// Per-instance data is twice as large, but divisor is twice
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawElementsInstancedANGLELargeDivisorSucceeds) {
|
| - SetupTexture();
|
| - SetupIndexBuffer();
|
| - SetupVertexBuffer();
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - DoEnableVertexAttribArray(0);
|
| - DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0);
|
| - DoVertexAttribDivisorANGLE(0, 2);
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(
|
| - GL_TRIANGLES,
|
| - kValidIndexRangeCount,
|
| - GL_UNSIGNED_SHORT,
|
| - BufferOffset(kValidIndexRangeStart * 2),
|
| - kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawElementsInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawElementsInstancedANGLELargeFails) {
|
| - SetupTexture();
|
| - SetupIndexBuffer();
|
| - SetupVertexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - DoEnableVertexAttribArray(0);
|
| - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
|
| - DoVertexAttribDivisorANGLE(0, 1);
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DrawElementsInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, kNumVertices + 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - cmd.Init(GL_TRIANGLES, kInvalidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kInvalidIndexRangeStart * 2, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawElementsInstancedANGLEInvalidPrimcountFails) {
|
| - SetupTexture();
|
| - SetupIndexBuffer();
|
| - SetupVertexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - DoEnableVertexAttribArray(0);
|
| - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
|
| - DoVertexAttribDivisorANGLE(0, 1);
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DrawElementsInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, -1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -// Per-index data is twice as large, but values of indices are smaller
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawElementsInstancedANGLELargeIndexSucceeds) {
|
| - SetupTexture();
|
| - SetupIndexBuffer();
|
| - SetupVertexBuffer();
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - DoVertexAttribPointer(1, 4, GL_FLOAT, 0, 0);
|
| -
|
| - DoEnableVertexAttribArray(0);
|
| - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
|
| - DoVertexAttribDivisorANGLE(0, 1);
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(
|
| - GL_TRIANGLES,
|
| - kValidIndexRangeCount,
|
| - GL_UNSIGNED_SHORT,
|
| - BufferOffset(kValidIndexRangeStart * 2),
|
| - kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawElementsInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderGeometryInstancingTest,
|
| - DrawElementsInstancedANGLENoDivisor0Fails) {
|
| - SetupTexture();
|
| - SetupIndexBuffer();
|
| - SetupVertexBuffer();
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| -
|
| - DoEnableVertexAttribArray(0);
|
| - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
|
| - DoVertexAttribDivisorANGLE(0, 1);
|
| - DoVertexAttribDivisorANGLE(1, 1);
|
| - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DrawElementsInstancedANGLE cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetVertexAttribPointervSucceeds) {
|
| - const float dummy = 0;
|
| - const GLuint kOffsetToTestFor = sizeof(dummy) * 4;
|
| - const GLuint kIndexToTest = 1;
|
| - GetVertexAttribPointerv::Result* result =
|
| - static_cast<GetVertexAttribPointerv::Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - const GLuint* result_value = result->GetData();
|
| - // Test that initial value is 0.
|
| - GetVertexAttribPointerv cmd;
|
| - cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(sizeof(*result_value), result->size);
|
| - EXPECT_EQ(0u, *result_value);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Set the value and see that we get it.
|
| - SetupVertexBuffer();
|
| - DoVertexAttribPointer(kIndexToTest, 2, GL_FLOAT, 0, kOffsetToTestFor);
|
| - result->size = 0;
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(sizeof(*result_value), result->size);
|
| - EXPECT_EQ(kOffsetToTestFor, *result_value);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetVertexAttribPointervBadArgsFails) {
|
| - const GLuint kIndexToTest = 1;
|
| - GetVertexAttribPointerv::Result* result =
|
| - static_cast<GetVertexAttribPointerv::Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - const GLuint* result_value = result->GetData();
|
| - // Test pname invalid fails.
|
| - GetVertexAttribPointerv cmd;
|
| - cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER + 1,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0u, result->size);
|
| - EXPECT_EQ(kInitialResult, *result_value);
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -
|
| - // Test index out of range fails.
|
| - result->size = 0;
|
| - cmd.Init(kNumVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_POINTER,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0u, result->size);
|
| - EXPECT_EQ(kInitialResult, *result_value);
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -
|
| - // Test memory id bad fails.
|
| - cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER,
|
| - kInvalidSharedMemoryId, shared_memory_offset_);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -
|
| - // Test memory offset bad fails.
|
| - cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER,
|
| - shared_memory_id_, kInvalidSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformivSucceeds) {
|
| - GetUniformiv::Result* result =
|
| - static_cast<GetUniformiv::Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - GetUniformiv cmd;
|
| - cmd.Init(client_program_id_,
|
| - kUniform2FakeLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_, GetUniformiv(kServiceProgramId, kUniform2RealLocation, _))
|
| - .Times(1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type),
|
| - result->size);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformivArrayElementSucceeds) {
|
| - GetUniformiv::Result* result =
|
| - static_cast<GetUniformiv::Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - GetUniformiv cmd;
|
| - cmd.Init(client_program_id_,
|
| - kUniform2ElementFakeLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_,
|
| - GetUniformiv(kServiceProgramId, kUniform2ElementRealLocation, _))
|
| - .Times(1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type),
|
| - result->size);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadProgramFails) {
|
| - GetUniformiv::Result* result =
|
| - static_cast<GetUniformiv::Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - GetUniformiv cmd;
|
| - // non-existant program
|
| - cmd.Init(kInvalidClientId,
|
| - kUniform2FakeLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_, GetUniformiv(_, _, _))
|
| - .Times(0);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0U, result->size);
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - // Valid id that is not a program. The GL spec requires a different error for
|
| - // this case.
|
| -#if GLES2_TEST_SHADER_VS_PROGRAM_IDS
|
| - result->size = kInitialResult;
|
| - cmd.Init(client_shader_id_,
|
| - kUniform2FakeLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0U, result->size);
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS
|
| - // Unlinked program
|
| - EXPECT_CALL(*gl_, CreateProgram())
|
| - .Times(1)
|
| - .WillOnce(Return(kNewServiceId))
|
| - .RetiresOnSaturation();
|
| - CreateProgram cmd2;
|
| - cmd2.Init(kNewClientId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - result->size = kInitialResult;
|
| - cmd.Init(kNewClientId,
|
| - kUniform2FakeLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0U, result->size);
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadLocationFails) {
|
| - GetUniformiv::Result* result =
|
| - static_cast<GetUniformiv::Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - GetUniformiv cmd;
|
| - // invalid location
|
| - cmd.Init(client_program_id_, kInvalidUniformLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_, GetUniformiv(_, _, _))
|
| - .Times(0);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0U, result->size);
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadSharedMemoryFails) {
|
| - GetUniformiv cmd;
|
| - cmd.Init(client_program_id_,
|
| - kUniform2FakeLocation,
|
| - kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_, GetUniformiv(_, _, _))
|
| - .Times(0);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(client_program_id_, kUniform2FakeLocation,
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -};
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformfvSucceeds) {
|
| - GetUniformfv::Result* result =
|
| - static_cast<GetUniformfv::Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - GetUniformfv cmd;
|
| - cmd.Init(client_program_id_,
|
| - kUniform2FakeLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_, GetUniformfv(kServiceProgramId, kUniform2RealLocation, _))
|
| - .Times(1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type),
|
| - result->size);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformfvArrayElementSucceeds) {
|
| - GetUniformfv::Result* result =
|
| - static_cast<GetUniformfv::Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - GetUniformfv cmd;
|
| - cmd.Init(client_program_id_,
|
| - kUniform2ElementFakeLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_,
|
| - GetUniformfv(kServiceProgramId, kUniform2ElementRealLocation, _))
|
| - .Times(1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type),
|
| - result->size);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadProgramFails) {
|
| - GetUniformfv::Result* result =
|
| - static_cast<GetUniformfv::Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - GetUniformfv cmd;
|
| - // non-existant program
|
| - cmd.Init(kInvalidClientId,
|
| - kUniform2FakeLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_, GetUniformfv(_, _, _))
|
| - .Times(0);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0U, result->size);
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - // Valid id that is not a program. The GL spec requires a different error for
|
| - // this case.
|
| -#if GLES2_TEST_SHADER_VS_PROGRAM_IDS
|
| - result->size = kInitialResult;
|
| - cmd.Init(client_shader_id_,
|
| - kUniform2FakeLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0U, result->size);
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS
|
| - // Unlinked program
|
| - EXPECT_CALL(*gl_, CreateProgram())
|
| - .Times(1)
|
| - .WillOnce(Return(kNewServiceId))
|
| - .RetiresOnSaturation();
|
| - CreateProgram cmd2;
|
| - cmd2.Init(kNewClientId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - result->size = kInitialResult;
|
| - cmd.Init(kNewClientId,
|
| - kUniform2FakeLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0U, result->size);
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadLocationFails) {
|
| - GetUniformfv::Result* result =
|
| - static_cast<GetUniformfv::Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - GetUniformfv cmd;
|
| - // invalid location
|
| - cmd.Init(client_program_id_, kInvalidUniformLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_, GetUniformfv(_, _, _))
|
| - .Times(0);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0U, result->size);
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadSharedMemoryFails) {
|
| - GetUniformfv cmd;
|
| - cmd.Init(client_program_id_,
|
| - kUniform2FakeLocation,
|
| - kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_, GetUniformfv(_, _, _))
|
| - .Times(0);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(client_program_id_, kUniform2FakeLocation,
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -};
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersSucceeds) {
|
| - GetAttachedShaders cmd;
|
| - typedef GetAttachedShaders::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - EXPECT_CALL(*gl_, GetAttachedShaders(kServiceProgramId, 1, _, _))
|
| - .WillOnce(DoAll(SetArgumentPointee<2>(1),
|
| - SetArgumentPointee<3>(kServiceShaderId)));
|
| - cmd.Init(client_program_id_, shared_memory_id_, shared_memory_offset_,
|
| - Result::ComputeSize(1));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(1, result->GetNumResults());
|
| - EXPECT_EQ(client_shader_id_, result->GetData()[0]);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersResultNotInitFail) {
|
| - GetAttachedShaders cmd;
|
| - typedef GetAttachedShaders::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->size = 1;
|
| - EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _))
|
| - .Times(0);
|
| - cmd.Init(client_program_id_, shared_memory_id_, shared_memory_offset_,
|
| - Result::ComputeSize(1));
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersBadProgramFails) {
|
| - GetAttachedShaders cmd;
|
| - typedef GetAttachedShaders::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _))
|
| - .Times(0);
|
| - cmd.Init(kInvalidClientId, shared_memory_id_, shared_memory_offset_,
|
| - Result::ComputeSize(1));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0U, result->size);
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersBadSharedMemoryFails) {
|
| - GetAttachedShaders cmd;
|
| - typedef GetAttachedShaders::Result Result;
|
| - cmd.Init(client_program_id_, kInvalidSharedMemoryId, shared_memory_offset_,
|
| - Result::ComputeSize(1));
|
| - EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _))
|
| - .Times(0);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(client_program_id_, shared_memory_id_, kInvalidSharedMemoryOffset,
|
| - Result::ComputeSize(1));
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatSucceeds) {
|
| - ScopedGLImplementationSetter gl_impl(::gfx::kGLImplementationEGLGLES2);
|
| - GetShaderPrecisionFormat cmd;
|
| - typedef GetShaderPrecisionFormat::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->success = 0;
|
| - const GLint range[2] = { 62, 62 };
|
| - const GLint precision = 16;
|
| - EXPECT_CALL(*gl_,GetShaderPrecisionFormat(_, _, _, _))
|
| - .WillOnce(DoAll(SetArrayArgument<2>(range,range+2),
|
| - SetArgumentPointee<3>(precision)))
|
| - .RetiresOnSaturation();
|
| - cmd.Init(GL_VERTEX_SHADER, GL_HIGH_FLOAT,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_NE(0, result->success);
|
| - EXPECT_EQ(range[0], result->min_range);
|
| - EXPECT_EQ(range[1], result->max_range);
|
| - EXPECT_EQ(precision, result->precision);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatResultNotInitFails) {
|
| - GetShaderPrecisionFormat cmd;
|
| - typedef GetShaderPrecisionFormat::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->success = 1;
|
| - // NOTE: GL might not be called. There is no Desktop OpenGL equivalent
|
| - cmd.Init(GL_VERTEX_SHADER, GL_HIGH_FLOAT,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatBadArgsFails) {
|
| - typedef GetShaderPrecisionFormat::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->success = 0;
|
| - GetShaderPrecisionFormat cmd;
|
| - cmd.Init(GL_TEXTURE_2D, GL_HIGH_FLOAT,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| - result->success = 0;
|
| - cmd.Init(GL_VERTEX_SHADER, GL_TEXTURE_2D,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest,
|
| - GetShaderPrecisionFormatBadSharedMemoryFails) {
|
| - GetShaderPrecisionFormat cmd;
|
| - cmd.Init(GL_VERTEX_SHADER, GL_HIGH_FLOAT,
|
| - kInvalidSharedMemoryId, shared_memory_offset_);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(GL_VERTEX_SHADER, GL_TEXTURE_2D,
|
| - shared_memory_id_, kInvalidSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformSucceeds) {
|
| - const GLuint kUniformIndex = 1;
|
| - const uint32 kBucketId = 123;
|
| - GetActiveUniform cmd;
|
| - typedef GetActiveUniform::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->success = 0;
|
| - cmd.Init(client_program_id_, kUniformIndex, kBucketId,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_NE(0, result->success);
|
| - EXPECT_EQ(kUniform2Size, result->size);
|
| - EXPECT_EQ(kUniform2Type, result->type);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
|
| - ASSERT_TRUE(bucket != NULL);
|
| - EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kUniform2Name,
|
| - bucket->size()));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformResultNotInitFails) {
|
| - const GLuint kUniformIndex = 1;
|
| - const uint32 kBucketId = 123;
|
| - GetActiveUniform cmd;
|
| - typedef GetActiveUniform::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->success = 1;
|
| - cmd.Init(client_program_id_, kUniformIndex, kBucketId,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadProgramFails) {
|
| - const GLuint kUniformIndex = 1;
|
| - const uint32 kBucketId = 123;
|
| - GetActiveUniform cmd;
|
| - typedef GetActiveUniform::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->success = 0;
|
| - cmd.Init(kInvalidClientId, kUniformIndex, kBucketId,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0, result->success);
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -#if GLES2_TEST_SHADER_VS_PROGRAM_IDS
|
| - result->success = 0;
|
| - cmd.Init(client_shader_id_, kUniformIndex, kBucketId,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0, result->success);
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadIndexFails) {
|
| - const uint32 kBucketId = 123;
|
| - GetActiveUniform cmd;
|
| - typedef GetActiveUniform::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->success = 0;
|
| - cmd.Init(client_program_id_, kBadUniformIndex, kBucketId,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0, result->success);
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadSharedMemoryFails) {
|
| - const GLuint kUniformIndex = 1;
|
| - const uint32 kBucketId = 123;
|
| - GetActiveUniform cmd;
|
| - cmd.Init(client_program_id_, kUniformIndex, kBucketId,
|
| - kInvalidSharedMemoryId, shared_memory_offset_);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(client_program_id_, kUniformIndex, kBucketId,
|
| - shared_memory_id_, kInvalidSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribSucceeds) {
|
| - const GLuint kAttribIndex = 1;
|
| - const uint32 kBucketId = 123;
|
| - GetActiveAttrib cmd;
|
| - typedef GetActiveAttrib::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->success = 0;
|
| - cmd.Init(client_program_id_, kAttribIndex, kBucketId,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_NE(0, result->success);
|
| - EXPECT_EQ(kAttrib2Size, result->size);
|
| - EXPECT_EQ(kAttrib2Type, result->type);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
|
| - ASSERT_TRUE(bucket != NULL);
|
| - EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kAttrib2Name,
|
| - bucket->size()));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribResultNotInitFails) {
|
| - const GLuint kAttribIndex = 1;
|
| - const uint32 kBucketId = 123;
|
| - GetActiveAttrib cmd;
|
| - typedef GetActiveAttrib::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->success = 1;
|
| - cmd.Init(client_program_id_, kAttribIndex, kBucketId,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadProgramFails) {
|
| - const GLuint kAttribIndex = 1;
|
| - const uint32 kBucketId = 123;
|
| - GetActiveAttrib cmd;
|
| - typedef GetActiveAttrib::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->success = 0;
|
| - cmd.Init(kInvalidClientId, kAttribIndex, kBucketId,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0, result->success);
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -#if GLES2_TEST_SHADER_VS_PROGRAM_IDS
|
| - result->success = 0;
|
| - cmd.Init(client_shader_id_, kAttribIndex, kBucketId,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0, result->success);
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadIndexFails) {
|
| - const uint32 kBucketId = 123;
|
| - GetActiveAttrib cmd;
|
| - typedef GetActiveAttrib::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->success = 0;
|
| - cmd.Init(client_program_id_, kBadAttribIndex, kBucketId,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0, result->success);
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadSharedMemoryFails) {
|
| - const GLuint kAttribIndex = 1;
|
| - const uint32 kBucketId = 123;
|
| - GetActiveAttrib cmd;
|
| - cmd.Init(client_program_id_, kAttribIndex, kBucketId,
|
| - kInvalidSharedMemoryId, shared_memory_offset_);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(client_program_id_, kAttribIndex, kBucketId,
|
| - shared_memory_id_, kInvalidSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetShaderInfoLogValidArgs) {
|
| - const char* kInfo = "hello";
|
| - const uint32 kBucketId = 123;
|
| - CompileShader compile_cmd;
|
| - GetShaderInfoLog cmd;
|
| - EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _));
|
| - EXPECT_CALL(*gl_, CompileShader(kServiceShaderId));
|
| - EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _))
|
| - .WillOnce(SetArgumentPointee<2>(GL_FALSE))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_INFO_LOG_LENGTH, _))
|
| - .WillOnce(SetArgumentPointee<2>(strlen(kInfo) + 1))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(
|
| - *gl_, GetShaderInfoLog(kServiceShaderId, strlen(kInfo) + 1, _, _))
|
| - .WillOnce(DoAll(SetArgumentPointee<2>(strlen(kInfo)),
|
| - SetArrayArgument<3>(kInfo, kInfo + strlen(kInfo) + 1)));
|
| - compile_cmd.Init(client_shader_id_);
|
| - cmd.Init(client_shader_id_, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(compile_cmd));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
|
| - ASSERT_TRUE(bucket != NULL);
|
| - EXPECT_EQ(strlen(kInfo) + 1, bucket->size());
|
| - EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kInfo,
|
| - bucket->size()));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetShaderInfoLogInvalidArgs) {
|
| - const uint32 kBucketId = 123;
|
| - GetShaderInfoLog cmd;
|
| - cmd.Init(kInvalidClientId, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, GetIntegervCached) {
|
| - struct TestInfo {
|
| - GLenum pname;
|
| - GLint expected;
|
| - };
|
| - TestInfo tests[] = {
|
| - { GL_MAX_TEXTURE_SIZE, TestHelper::kMaxTextureSize, },
|
| - { GL_MAX_CUBE_MAP_TEXTURE_SIZE, TestHelper::kMaxCubeMapTextureSize, },
|
| - { GL_MAX_RENDERBUFFER_SIZE, TestHelper::kMaxRenderbufferSize, },
|
| - };
|
| - typedef GetIntegerv::Result Result;
|
| - for (size_t ii = 0; ii < sizeof(tests) / sizeof(tests[0]); ++ii) {
|
| - const TestInfo& test = tests[ii];
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetIntegerv(test.pname, _))
|
| - .Times(0);
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(test.pname, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(test.pname),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(test.expected, result->GetData()[0]);
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, CompileShaderValidArgs) {
|
| - EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _));
|
| - EXPECT_CALL(*gl_, CompileShader(kServiceShaderId));
|
| - EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _))
|
| - .WillOnce(SetArgumentPointee<2>(GL_TRUE))
|
| - .RetiresOnSaturation();
|
| - CompileShader cmd;
|
| - cmd.Init(client_shader_id_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, CompileShaderInvalidArgs) {
|
| - CompileShader cmd;
|
| - cmd.Init(kInvalidClientId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -#if GLES2_TEST_SHADER_VS_PROGRAM_IDS
|
| - cmd.Init(client_program_id_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, ShaderSourceAndGetShaderSourceValidArgs) {
|
| - const uint32 kBucketId = 123;
|
| - const char kSource[] = "hello";
|
| - const uint32 kSourceSize = sizeof(kSource) - 1;
|
| - memcpy(shared_memory_address_, kSource, kSourceSize);
|
| - ShaderSource cmd;
|
| - cmd.Init(client_shader_id_,
|
| - kSharedMemoryId, kSharedMemoryOffset, kSourceSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - memset(shared_memory_address_, 0, kSourceSize);
|
| - GetShaderSource get_cmd;
|
| - get_cmd.Init(client_shader_id_, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd));
|
| - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
|
| - ASSERT_TRUE(bucket != NULL);
|
| - EXPECT_EQ(kSourceSize + 1, bucket->size());
|
| - EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kSource,
|
| - bucket->size()));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, ShaderSourceInvalidArgs) {
|
| - const char kSource[] = "hello";
|
| - const uint32 kSourceSize = sizeof(kSource) - 1;
|
| - memcpy(shared_memory_address_, kSource, kSourceSize);
|
| - ShaderSource cmd;
|
| - cmd.Init(kInvalidClientId,
|
| - kSharedMemoryId, kSharedMemoryOffset, kSourceSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -#if GLES2_TEST_SHADER_VS_PROGRAM_IDS
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kSharedMemoryOffset, kSourceSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS
|
| - cmd.Init(client_shader_id_,
|
| - kInvalidSharedMemoryId, kSharedMemoryOffset, kSourceSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(client_shader_id_,
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset, kSourceSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(client_shader_id_,
|
| - kSharedMemoryId, kSharedMemoryOffset, kSharedBufferSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, ShaderSourceBucketAndGetShaderSourceValidArgs) {
|
| - const uint32 kInBucketId = 123;
|
| - const uint32 kOutBucketId = 125;
|
| - const char kSource[] = "hello";
|
| - const uint32 kSourceSize = sizeof(kSource) - 1;
|
| - SetBucketAsCString(kInBucketId, kSource);
|
| - ShaderSourceBucket cmd;
|
| - cmd.Init(client_shader_id_, kInBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - ClearSharedMemory();
|
| - GetShaderSource get_cmd;
|
| - get_cmd.Init(client_shader_id_, kOutBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd));
|
| - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kOutBucketId);
|
| - ASSERT_TRUE(bucket != NULL);
|
| - EXPECT_EQ(kSourceSize + 1, bucket->size());
|
| - EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kSource,
|
| - bucket->size()));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, ShaderSourceBucketInvalidArgs) {
|
| - const uint32 kBucketId = 123;
|
| - const char kSource[] = "hello";
|
| - const uint32 kSourceSize = sizeof(kSource) - 1;
|
| - memcpy(shared_memory_address_, kSource, kSourceSize);
|
| - ShaderSourceBucket cmd;
|
| - // Test no bucket.
|
| - cmd.Init(client_texture_id_, kBucketId);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - // Test invalid client.
|
| - SetBucketAsCString(kBucketId, kSource);
|
| - cmd.Init(kInvalidClientId, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, ShaderSourceStripComments) {
|
| - const uint32 kInBucketId = 123;
|
| - const char kSource[] = "hello/*te\ast*/world//a\ab";
|
| - SetBucketAsCString(kInBucketId, kSource);
|
| - ShaderSourceBucket cmd;
|
| - cmd.Init(client_shader_id_, kInBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, GenerateMipmapWrongFormatsFails) {
|
| - EXPECT_CALL(*gl_, GenerateMipmapEXT(_))
|
| - .Times(0);
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - GenerateMipmap cmd;
|
| - cmd.Init(GL_TEXTURE_2D);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, GenerateMipmapHandlesOutOfMemory) {
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - TextureManager* manager = group().texture_manager();
|
| - TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
|
| - ASSERT_TRUE(texture_ref != NULL);
|
| - Texture* texture = texture_ref->texture();
|
| - GLint width = 0;
|
| - GLint height = 0;
|
| - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 2, &width, &height));
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D))
|
| - .Times(1);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_OUT_OF_MEMORY))
|
| - .RetiresOnSaturation();
|
| - GenerateMipmap cmd;
|
| - cmd.Init(GL_TEXTURE_2D);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 2, &width, &height));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, GenerateMipmapClearsUnclearedTexture) {
|
| - EXPECT_CALL(*gl_, GenerateMipmapEXT(_))
|
| - .Times(0);
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - SetupClearTextureExpectations(
|
| - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D,
|
| - 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2);
|
| - EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D));
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - GenerateMipmap cmd;
|
| - cmd.Init(GL_TEXTURE_2D);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -// Same as GenerateMipmapClearsUnclearedTexture, but with workaround
|
| -// |set_texture_filters_before_generating_mipmap|.
|
| -TEST_F(GLES2DecoderManualInitTest, SetTextureFiltersBeforeGenerateMipmap) {
|
| - CommandLine command_line(0, NULL);
|
| - command_line.AppendSwitchASCII(
|
| - switches::kGpuDriverBugWorkarounds,
|
| - base::IntToString(gpu::SET_TEXTURE_FILTER_BEFORE_GENERATING_MIPMAP));
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoderWithCommandLine(init, &command_line);
|
| -
|
| - EXPECT_CALL(*gl_, GenerateMipmapEXT(_))
|
| - .Times(0);
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - SetupClearTextureExpectations(
|
| - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D,
|
| - 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2);
|
| - EXPECT_CALL(*gl_, TexParameteri(
|
| - GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D));
|
| - EXPECT_CALL(*gl_, TexParameteri(
|
| - GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - GenerateMipmap cmd;
|
| - cmd.Init(GL_TEXTURE_2D);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, Uniform1iValidArgs) {
|
| - EXPECT_CALL(*gl_, Uniform1i(kUniform1RealLocation, 2));
|
| - Uniform1i cmd;
|
| - cmd.Init(kUniform1FakeLocation, 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivValidArgs) {
|
| - EXPECT_CALL(
|
| - *gl_, Uniform1iv(kUniform1RealLocation, 1,
|
| - reinterpret_cast<const GLint*>(shared_memory_address_)));
|
| - Uniform1iv cmd;
|
| - cmd.Init(kUniform1FakeLocation,
|
| - 1, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidArgs2_0) {
|
| - EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0);
|
| - Uniform1iv cmd;
|
| - cmd.Init(kUniform1FakeLocation,
|
| - 1, kInvalidSharedMemoryId, 0);
|
| - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidArgs2_1) {
|
| - EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0);
|
| - Uniform1iv cmd;
|
| - cmd.Init(kUniform1FakeLocation,
|
| - 1, shared_memory_id_, kInvalidSharedMemoryOffset);
|
| - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivImmediateValidArgs) {
|
| - Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>();
|
| - EXPECT_CALL(
|
| - *gl_,
|
| - Uniform1iv(kUniform1RealLocation, 1,
|
| - reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd))));
|
| - GLint temp[1 * 2] = { 0, };
|
| - cmd.Init(kUniform1FakeLocation, 1,
|
| - &temp[0]);
|
| - EXPECT_EQ(error::kNoError,
|
| - ExecuteImmediateCmd(cmd, sizeof(temp)));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidValidArgs) {
|
| - EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0);
|
| - Uniform1iv cmd;
|
| - cmd.Init(kUniform1FakeLocation,
|
| - 2, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivZeroCount) {
|
| - EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0);
|
| - Uniform1iv cmd;
|
| - cmd.Init(kUniform1FakeLocation,
|
| - 0, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, Uniform1iSamplerIsLmited) {
|
| - EXPECT_CALL(*gl_, Uniform1i(_, _)).Times(0);
|
| - Uniform1i cmd;
|
| - cmd.Init(
|
| - kUniform1FakeLocation,
|
| - kNumTextureUnits);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivSamplerIsLimited) {
|
| - EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0);
|
| - Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>();
|
| - GLint temp[] = { kNumTextureUnits };
|
| - cmd.Init(kUniform1FakeLocation, 1,
|
| - &temp[0]);
|
| - EXPECT_EQ(error::kNoError,
|
| - ExecuteImmediateCmd(cmd, sizeof(temp)));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, BindBufferToDifferentTargetFails) {
|
| - // Bind the buffer to GL_ARRAY_BUFFER
|
| - DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
|
| - // Attempt to rebind to GL_ELEMENT_ARRAY_BUFFER
|
| - // NOTE: Real GLES2 does not have this restriction but WebGL and we do.
|
| - // This can be restriction can be removed at runtime.
|
| - EXPECT_CALL(*gl_, BindBuffer(_, _))
|
| - .Times(0);
|
| - BindBuffer cmd;
|
| - cmd.Init(GL_ELEMENT_ARRAY_BUFFER, client_buffer_id_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, ActiveTextureValidArgs) {
|
| - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1));
|
| - SpecializedSetup<ActiveTexture, 0>(true);
|
| - ActiveTexture cmd;
|
| - cmd.Init(GL_TEXTURE1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, ActiveTextureInvalidArgs) {
|
| - EXPECT_CALL(*gl_, ActiveTexture(_)).Times(0);
|
| - SpecializedSetup<ActiveTexture, 0>(false);
|
| - ActiveTexture cmd;
|
| - cmd.Init(GL_TEXTURE0 - 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| - cmd.Init(kNumTextureUnits);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, CheckFramebufferStatusWithNoBoundTarget) {
|
| - EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(_))
|
| - .Times(0);
|
| - CheckFramebufferStatus::Result* result =
|
| - static_cast<CheckFramebufferStatus::Result*>(shared_memory_address_);
|
| - *result = 0;
|
| - CheckFramebufferStatus cmd;
|
| - cmd.Init(GL_FRAMEBUFFER, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), *result);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, BindAndDeleteFramebuffer) {
|
| - SetupTexture();
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - DoDeleteFramebuffer(
|
| - client_framebuffer_id_, kServiceFramebufferId,
|
| - true, GL_FRAMEBUFFER, 0,
|
| - true, GL_FRAMEBUFFER, 0);
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, FramebufferRenderbufferWithNoBoundTarget) {
|
| - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(_, _, _, _))
|
| - .Times(0);
|
| - FramebufferRenderbuffer cmd;
|
| - cmd.Init(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, FramebufferTexture2DWithNoBoundTarget) {
|
| - EXPECT_CALL(*gl_, FramebufferTexture2DEXT(_, _, _, _, _))
|
| - .Times(0);
|
| - FramebufferTexture2D cmd;
|
| - cmd.Init(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_,
|
| - 0);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithNoBoundTarget) {
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetFramebufferAttachmentParameterivEXT(_, _, _, _))
|
| - .Times(0);
|
| - GetFramebufferAttachmentParameteriv cmd;
|
| - cmd.Init(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
| - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, shared_memory_id_,
|
| - shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithRenderbuffer) {
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| - kServiceRenderbufferId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - GetFramebufferAttachmentParameteriv::Result* result =
|
| - static_cast<GetFramebufferAttachmentParameteriv::Result*>(
|
| - shared_memory_address_);
|
| - result->size = 0;
|
| - const GLint* result_value = result->GetData();
|
| - FramebufferRenderbuffer fbrb_cmd;
|
| - GetFramebufferAttachmentParameteriv cmd;
|
| - fbrb_cmd.Init(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_);
|
| - cmd.Init(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
| - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, shared_memory_id_,
|
| - shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(static_cast<GLuint>(*result_value), client_renderbuffer_id_);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithTexture) {
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, FramebufferTexture2DEXT(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - kServiceTextureId, 0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - GetFramebufferAttachmentParameteriv::Result* result =
|
| - static_cast<GetFramebufferAttachmentParameteriv::Result*>(
|
| - shared_memory_address_);
|
| - result->SetNumResults(0);
|
| - const GLint* result_value = result->GetData();
|
| - FramebufferTexture2D fbtex_cmd;
|
| - GetFramebufferAttachmentParameteriv cmd;
|
| - fbtex_cmd.Init(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_,
|
| - 0);
|
| - cmd.Init(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
| - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, shared_memory_id_,
|
| - shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(static_cast<GLuint>(*result_value), client_texture_id_);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, GetRenderbufferParameterivWithNoBoundTarget) {
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetRenderbufferParameterivEXT(_, _, _))
|
| - .Times(0);
|
| - GetRenderbufferParameteriv cmd;
|
| - cmd.Init(
|
| - GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, shared_memory_id_,
|
| - shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, RenderbufferStorageWithNoBoundTarget) {
|
| - EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _))
|
| - .Times(0);
|
| - RenderbufferStorage cmd;
|
| - cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 3, 4);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -namespace {
|
| -
|
| -// A class to emulate glReadPixels
|
| -class ReadPixelsEmulator {
|
| - public:
|
| - // pack_alignment is the alignment you want ReadPixels to use
|
| - // when copying. The actual data passed in pixels should be contiguous.
|
| - ReadPixelsEmulator(GLsizei width, GLsizei height, GLint bytes_per_pixel,
|
| - const void* src_pixels, const void* expected_pixels,
|
| - GLint pack_alignment)
|
| - : width_(width),
|
| - height_(height),
|
| - pack_alignment_(pack_alignment),
|
| - bytes_per_pixel_(bytes_per_pixel),
|
| - src_pixels_(reinterpret_cast<const int8*>(src_pixels)),
|
| - expected_pixels_(reinterpret_cast<const int8*>(expected_pixels)) {
|
| - }
|
| -
|
| - void ReadPixels(
|
| - GLint x, GLint y, GLsizei width, GLsizei height,
|
| - GLenum format, GLenum type, void* pixels) const {
|
| - DCHECK_GE(x, 0);
|
| - DCHECK_GE(y, 0);
|
| - DCHECK_LE(x + width, width_);
|
| - DCHECK_LE(y + height, height_);
|
| - for (GLint yy = 0; yy < height; ++yy) {
|
| - const int8* src = GetPixelAddress(src_pixels_, x, y + yy);
|
| - const void* dst = ComputePackAlignmentAddress(0, yy, width, pixels);
|
| - memcpy(const_cast<void*>(dst), src, width * bytes_per_pixel_);
|
| - }
|
| - }
|
| -
|
| - bool CompareRowSegment(
|
| - GLint x, GLint y, GLsizei width, const void* data) const {
|
| - DCHECK(x + width <= width_ || width == 0);
|
| - return memcmp(data, GetPixelAddress(expected_pixels_, x, y),
|
| - width * bytes_per_pixel_) == 0;
|
| - }
|
| -
|
| - // Helper to compute address of pixel in pack aligned data.
|
| - const void* ComputePackAlignmentAddress(
|
| - GLint x, GLint y, GLsizei width, const void* address) const {
|
| - GLint unpadded_row_size = ComputeImageDataSize(width, 1);
|
| - GLint two_rows_size = ComputeImageDataSize(width, 2);
|
| - GLsizei padded_row_size = two_rows_size - unpadded_row_size;
|
| - GLint offset = y * padded_row_size + x * bytes_per_pixel_;
|
| - return static_cast<const int8*>(address) + offset;
|
| - }
|
| -
|
| - GLint ComputeImageDataSize(GLint width, GLint height) const {
|
| - GLint row_size = width * bytes_per_pixel_;
|
| - if (height > 1) {
|
| - GLint temp = row_size + pack_alignment_ - 1;
|
| - GLint padded_row_size = (temp / pack_alignment_) * pack_alignment_;
|
| - GLint size_of_all_but_last_row = (height - 1) * padded_row_size;
|
| - return size_of_all_but_last_row + row_size;
|
| - } else {
|
| - return height * row_size;
|
| - }
|
| - }
|
| -
|
| - private:
|
| - const int8* GetPixelAddress(const int8* base, GLint x, GLint y) const {
|
| - return base + (width_ * y + x) * bytes_per_pixel_;
|
| - }
|
| -
|
| - GLsizei width_;
|
| - GLsizei height_;
|
| - GLint pack_alignment_;
|
| - GLint bytes_per_pixel_;
|
| - const int8* src_pixels_;
|
| - const int8* expected_pixels_;
|
| -};
|
| -
|
| -} // anonymous namespace
|
| -
|
| -void GLES2DecoderTest::CheckReadPixelsOutOfRange(
|
| - GLint in_read_x, GLint in_read_y,
|
| - GLsizei in_read_width, GLsizei in_read_height,
|
| - bool init) {
|
| - const GLsizei kWidth = 5;
|
| - const GLsizei kHeight = 3;
|
| - const GLint kBytesPerPixel = 3;
|
| - const GLint kPackAlignment = 4;
|
| - const GLenum kFormat = GL_RGB;
|
| - static const int8 kSrcPixels[kWidth * kHeight * kBytesPerPixel] = {
|
| - 12, 13, 14, 18, 19, 18, 19, 12, 13, 14, 18, 19, 18, 19, 13,
|
| - 29, 28, 23, 22, 21, 22, 21, 29, 28, 23, 22, 21, 22, 21, 28,
|
| - 31, 34, 39, 37, 32, 37, 32, 31, 34, 39, 37, 32, 37, 32, 34,
|
| - };
|
| -
|
| - ClearSharedMemory();
|
| -
|
| - // We need to setup an FBO so we can know the max size that ReadPixels will
|
| - // access
|
| - if (init) {
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, kFormat, kWidth, kHeight, 0,
|
| - kFormat, GL_UNSIGNED_BYTE, kSharedMemoryId,
|
| - kSharedMemoryOffset);
|
| - DoBindFramebuffer(
|
| - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| - DoFramebufferTexture2D(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - client_texture_id_, kServiceTextureId, 0, GL_NO_ERROR);
|
| - EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
|
| - .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
|
| - .RetiresOnSaturation();
|
| - }
|
| -
|
| - ReadPixelsEmulator emu(
|
| - kWidth, kHeight, kBytesPerPixel, kSrcPixels, kSrcPixels, kPackAlignment);
|
| - typedef ReadPixels::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - uint32 result_shm_id = kSharedMemoryId;
|
| - uint32 result_shm_offset = kSharedMemoryOffset;
|
| - uint32 pixels_shm_id = kSharedMemoryId;
|
| - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result);
|
| - void* dest = &result[1];
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - // ReadPixels will be called for valid size only even though the command
|
| - // is requesting a larger size.
|
| - GLint read_x = std::max(0, in_read_x);
|
| - GLint read_y = std::max(0, in_read_y);
|
| - GLint read_end_x = std::max(0, std::min(kWidth, in_read_x + in_read_width));
|
| - GLint read_end_y = std::max(0, std::min(kHeight, in_read_y + in_read_height));
|
| - GLint read_width = read_end_x - read_x;
|
| - GLint read_height = read_end_y - read_y;
|
| - if (read_width > 0 && read_height > 0) {
|
| - for (GLint yy = read_y; yy < read_end_y; ++yy) {
|
| - EXPECT_CALL(
|
| - *gl_, ReadPixels(read_x, yy, read_width, 1,
|
| - kFormat, GL_UNSIGNED_BYTE, _))
|
| - .WillOnce(Invoke(&emu, &ReadPixelsEmulator::ReadPixels))
|
| - .RetiresOnSaturation();
|
| - }
|
| - }
|
| - ReadPixels cmd;
|
| - cmd.Init(in_read_x, in_read_y, in_read_width, in_read_height,
|
| - kFormat, GL_UNSIGNED_BYTE,
|
| - pixels_shm_id, pixels_shm_offset,
|
| - result_shm_id, result_shm_offset,
|
| - false);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -
|
| - GLint unpadded_row_size = emu.ComputeImageDataSize(in_read_width, 1);
|
| - scoped_ptr<int8[]> zero(new int8[unpadded_row_size]);
|
| - scoped_ptr<int8[]> pack(new int8[kPackAlignment]);
|
| - memset(zero.get(), 0, unpadded_row_size);
|
| - memset(pack.get(), kInitialMemoryValue, kPackAlignment);
|
| - for (GLint yy = 0; yy < in_read_height; ++yy) {
|
| - const int8* row = static_cast<const int8*>(
|
| - emu.ComputePackAlignmentAddress(0, yy, in_read_width, dest));
|
| - GLint y = in_read_y + yy;
|
| - if (y < 0 || y >= kHeight) {
|
| - EXPECT_EQ(0, memcmp(zero.get(), row, unpadded_row_size));
|
| - } else {
|
| - // check off left.
|
| - GLint num_left_pixels = std::max(-in_read_x, 0);
|
| - GLint num_left_bytes = num_left_pixels * kBytesPerPixel;
|
| - EXPECT_EQ(0, memcmp(zero.get(), row, num_left_bytes));
|
| -
|
| - // check off right.
|
| - GLint num_right_pixels = std::max(in_read_x + in_read_width - kWidth, 0);
|
| - GLint num_right_bytes = num_right_pixels * kBytesPerPixel;
|
| - EXPECT_EQ(0, memcmp(zero.get(),
|
| - row + unpadded_row_size - num_right_bytes,
|
| - num_right_bytes));
|
| -
|
| - // check middle.
|
| - GLint x = std::max(in_read_x, 0);
|
| - GLint num_middle_pixels =
|
| - std::max(in_read_width - num_left_pixels - num_right_pixels, 0);
|
| - EXPECT_TRUE(emu.CompareRowSegment(
|
| - x, y, num_middle_pixels, row + num_left_bytes));
|
| - }
|
| -
|
| - // check padding
|
| - if (yy != in_read_height - 1) {
|
| - GLint num_padding_bytes =
|
| - (kPackAlignment - 1) - (unpadded_row_size % kPackAlignment);
|
| - EXPECT_EQ(0,
|
| - memcmp(pack.get(), row + unpadded_row_size, num_padding_bytes));
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, ReadPixels) {
|
| - const GLsizei kWidth = 5;
|
| - const GLsizei kHeight = 3;
|
| - const GLint kBytesPerPixel = 3;
|
| - const GLint kPackAlignment = 4;
|
| - static const int8 kSrcPixels[kWidth * kHeight * kBytesPerPixel] = {
|
| - 12, 13, 14, 18, 19, 18, 19, 12, 13, 14, 18, 19, 18, 19, 13,
|
| - 29, 28, 23, 22, 21, 22, 21, 29, 28, 23, 22, 21, 22, 21, 28,
|
| - 31, 34, 39, 37, 32, 37, 32, 31, 34, 39, 37, 32, 37, 32, 34,
|
| - };
|
| -
|
| - surface_->SetSize(gfx::Size(INT_MAX, INT_MAX));
|
| -
|
| - ReadPixelsEmulator emu(
|
| - kWidth, kHeight, kBytesPerPixel, kSrcPixels, kSrcPixels, kPackAlignment);
|
| - typedef ReadPixels::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - uint32 result_shm_id = kSharedMemoryId;
|
| - uint32 result_shm_offset = kSharedMemoryOffset;
|
| - uint32 pixels_shm_id = kSharedMemoryId;
|
| - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result);
|
| - void* dest = &result[1];
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(
|
| - *gl_, ReadPixels(0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, _))
|
| - .WillOnce(Invoke(&emu, &ReadPixelsEmulator::ReadPixels));
|
| - ReadPixels cmd;
|
| - cmd.Init(0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE,
|
| - pixels_shm_id, pixels_shm_offset,
|
| - result_shm_id, result_shm_offset,
|
| - false);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - for (GLint yy = 0; yy < kHeight; ++yy) {
|
| - EXPECT_TRUE(emu.CompareRowSegment(
|
| - 0, yy, kWidth,
|
| - emu.ComputePackAlignmentAddress(0, yy, kWidth, dest)));
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderRGBBackbufferTest, ReadPixelsNoAlphaBackbuffer) {
|
| - const GLsizei kWidth = 3;
|
| - const GLsizei kHeight = 3;
|
| - const GLint kBytesPerPixel = 4;
|
| - const GLint kPackAlignment = 4;
|
| - static const uint8 kExpectedPixels[kWidth * kHeight * kBytesPerPixel] = {
|
| - 12, 13, 14, 255, 19, 18, 19, 255, 13, 14, 18, 255,
|
| - 29, 28, 23, 255, 21, 22, 21, 255, 28, 23, 22, 255,
|
| - 31, 34, 39, 255, 32, 37, 32, 255, 34, 39, 37, 255,
|
| - };
|
| - static const uint8 kSrcPixels[kWidth * kHeight * kBytesPerPixel] = {
|
| - 12, 13, 14, 18, 19, 18, 19, 12, 13, 14, 18, 19,
|
| - 29, 28, 23, 22, 21, 22, 21, 29, 28, 23, 22, 21,
|
| - 31, 34, 39, 37, 32, 37, 32, 31, 34, 39, 37, 32,
|
| - };
|
| -
|
| - surface_->SetSize(gfx::Size(INT_MAX, INT_MAX));
|
| -
|
| - ReadPixelsEmulator emu(
|
| - kWidth, kHeight, kBytesPerPixel, kSrcPixels, kExpectedPixels,
|
| - kPackAlignment);
|
| - typedef ReadPixels::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - uint32 result_shm_id = kSharedMemoryId;
|
| - uint32 result_shm_offset = kSharedMemoryOffset;
|
| - uint32 pixels_shm_id = kSharedMemoryId;
|
| - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result);
|
| - void* dest = &result[1];
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(
|
| - *gl_, ReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, _))
|
| - .WillOnce(Invoke(&emu, &ReadPixelsEmulator::ReadPixels));
|
| - ReadPixels cmd;
|
| - cmd.Init(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - pixels_shm_id, pixels_shm_offset,
|
| - result_shm_id, result_shm_offset,
|
| - false);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - for (GLint yy = 0; yy < kHeight; ++yy) {
|
| - EXPECT_TRUE(emu.CompareRowSegment(
|
| - 0, yy, kWidth,
|
| - emu.ComputePackAlignmentAddress(0, yy, kWidth, dest)));
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, ReadPixelsOutOfRange) {
|
| - static GLint tests[][4] = {
|
| - { -2, -1, 9, 5, }, // out of range on all sides
|
| - { 2, 1, 9, 5, }, // out of range on right, bottom
|
| - { -7, -4, 9, 5, }, // out of range on left, top
|
| - { 0, -5, 9, 5, }, // completely off top
|
| - { 0, 3, 9, 5, }, // completely off bottom
|
| - { -9, 0, 9, 5, }, // completely off left
|
| - { 5, 0, 9, 5, }, // completely off right
|
| - };
|
| -
|
| - for (size_t tt = 0; tt < arraysize(tests); ++tt) {
|
| - CheckReadPixelsOutOfRange(
|
| - tests[tt][0], tests[tt][1], tests[tt][2], tests[tt][3], tt == 0);
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, ReadPixelsInvalidArgs) {
|
| - typedef ReadPixels::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - uint32 result_shm_id = kSharedMemoryId;
|
| - uint32 result_shm_offset = kSharedMemoryOffset;
|
| - uint32 pixels_shm_id = kSharedMemoryId;
|
| - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result);
|
| - EXPECT_CALL(*gl_, ReadPixels(_, _, _, _, _, _, _)).Times(0);
|
| - ReadPixels cmd;
|
| - cmd.Init(0, 0, -1, 1, GL_RGB, GL_UNSIGNED_BYTE,
|
| - pixels_shm_id, pixels_shm_offset,
|
| - result_shm_id, result_shm_offset,
|
| - false);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(0, 0, 1, -1, GL_RGB, GL_UNSIGNED_BYTE,
|
| - pixels_shm_id, pixels_shm_offset,
|
| - result_shm_id, result_shm_offset,
|
| - false);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(0, 0, 1, 1, GL_RGB, GL_INT,
|
| - pixels_shm_id, pixels_shm_offset,
|
| - result_shm_id, result_shm_offset,
|
| - false);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| - cmd.Init(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE,
|
| - kInvalidSharedMemoryId, pixels_shm_offset,
|
| - result_shm_id, result_shm_offset,
|
| - false);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE,
|
| - pixels_shm_id, kInvalidSharedMemoryOffset,
|
| - result_shm_id, result_shm_offset,
|
| - false);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE,
|
| - pixels_shm_id, pixels_shm_offset,
|
| - kInvalidSharedMemoryId, result_shm_offset,
|
| - false);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE,
|
| - pixels_shm_id, pixels_shm_offset,
|
| - result_shm_id, kInvalidSharedMemoryOffset,
|
| - false);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ReadPixelsAsyncError) {
|
| - InitState init;
|
| - init.extensions = "GL_ARB_sync";
|
| - init.gl_version = "opengl es 3.0";
|
| - init.has_alpha = true;
|
| - init.request_alpha = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - typedef ReadPixels::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| -
|
| - const GLsizei kWidth = 4;
|
| - const GLsizei kHeight = 4;
|
| - uint32 result_shm_id = kSharedMemoryId;
|
| - uint32 result_shm_offset = kSharedMemoryOffset;
|
| - uint32 pixels_shm_id = kSharedMemoryId;
|
| - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - // first error check must pass to get to the test
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - // second check is after BufferData, simulate fail here
|
| - .WillOnce(Return(GL_INVALID_OPERATION))
|
| - // third error check is fall-through call to sync ReadPixels
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| -
|
| - EXPECT_CALL(*gl_, ReadPixels(0, 0, kWidth, kHeight, GL_RGB,
|
| - GL_UNSIGNED_BYTE, _)).Times(1);
|
| - EXPECT_CALL(*gl_, GenBuffersARB(1, _)).Times(1);
|
| - EXPECT_CALL(*gl_, BindBuffer(GL_PIXEL_PACK_BUFFER_ARB, _)).Times(2);
|
| - EXPECT_CALL(*gl_, BufferData(GL_PIXEL_PACK_BUFFER_ARB, _, NULL,
|
| - GL_STREAM_READ)).Times(1);
|
| -
|
| - ReadPixels cmd;
|
| - cmd.Init(0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE,
|
| - pixels_shm_id, pixels_shm_offset,
|
| - result_shm_id, result_shm_offset,
|
| - true);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, BindAttribLocation) {
|
| - const GLint kLocation = 2;
|
| - const char* kName = "testing";
|
| - const uint32 kNameSize = strlen(kName);
|
| - EXPECT_CALL(
|
| - *gl_, BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName)))
|
| - .Times(1);
|
| - memcpy(shared_memory_address_, kName, kNameSize);
|
| - BindAttribLocation cmd;
|
| - cmd.Init(client_program_id_, kLocation, kSharedMemoryId, kSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, BindAttribLocationInvalidArgs) {
|
| - const GLint kLocation = 2;
|
| - const char* kName = "testing";
|
| - const char* kBadName = "test\aing";
|
| - const uint32 kNameSize = strlen(kName);
|
| - const uint32 kBadNameSize = strlen(kBadName);
|
| - EXPECT_CALL(*gl_, BindAttribLocation(_, _, _)).Times(0);
|
| - memcpy(shared_memory_address_, kName, kNameSize);
|
| - BindAttribLocation cmd;
|
| - cmd.Init(kInvalidClientId, kLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset, kNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(client_program_id_, kLocation,
|
| - kInvalidSharedMemoryId, kSharedMemoryOffset, kNameSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(client_program_id_, kLocation,
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset, kNameSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(client_program_id_, kLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset, kSharedBufferSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - memcpy(shared_memory_address_, kBadName, kBadNameSize);
|
| - cmd.Init(client_program_id_, kLocation,
|
| - kSharedMemoryId, kSharedMemoryOffset, kBadNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, BindAttribLocationBucket) {
|
| - const uint32 kBucketId = 123;
|
| - const GLint kLocation = 2;
|
| - const char* kName = "testing";
|
| - EXPECT_CALL(
|
| - *gl_, BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName)))
|
| - .Times(1);
|
| - SetBucketAsCString(kBucketId, kName);
|
| - BindAttribLocationBucket cmd;
|
| - cmd.Init(client_program_id_, kLocation, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, BindAttribLocationBucketInvalidArgs) {
|
| - const uint32 kBucketId = 123;
|
| - const GLint kLocation = 2;
|
| - const char* kName = "testing";
|
| - EXPECT_CALL(*gl_, BindAttribLocation(_, _, _)).Times(0);
|
| - BindAttribLocationBucket cmd;
|
| - // check bucket does not exist.
|
| - cmd.Init(client_program_id_, kLocation, kBucketId);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - // check bucket is empty.
|
| - SetBucketAsCString(kBucketId, NULL);
|
| - cmd.Init(client_program_id_, kLocation, kBucketId);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - // Check bad program id
|
| - SetBucketAsCString(kBucketId, kName);
|
| - cmd.Init(kInvalidClientId, kLocation, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetAttribLocation) {
|
| - const uint32 kNameSize = strlen(kAttrib2Name);
|
| - const char* kNonExistentName = "foobar";
|
| - const uint32 kNonExistentNameSize = strlen(kNonExistentName);
|
| - typedef GetAttribLocation::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - *result = -1;
|
| - char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result));
|
| - const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result);
|
| - memcpy(name, kAttrib2Name, kNameSize);
|
| - GetAttribLocation cmd;
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(kAttrib2Location, *result);
|
| - *result = -1;
|
| - memcpy(name, kNonExistentName, kNonExistentNameSize);
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kNonExistentNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationInvalidArgs) {
|
| - const uint32 kNameSize = strlen(kAttrib2Name);
|
| - const char* kBadName = "foo\abar";
|
| - const uint32 kBadNameSize = strlen(kBadName);
|
| - typedef GetAttribLocation::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - *result = -1;
|
| - char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result));
|
| - const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result);
|
| - memcpy(name, kAttrib2Name, kNameSize);
|
| - GetAttribLocation cmd;
|
| - cmd.Init(kInvalidClientId,
|
| - kSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - *result = -1;
|
| - cmd.Init(client_program_id_,
|
| - kInvalidSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kNameOffset,
|
| - kInvalidSharedMemoryId, kSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kSharedBufferSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - memcpy(name, kBadName, kBadNameSize);
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kBadNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationBucket) {
|
| - const uint32 kBucketId = 123;
|
| - const char* kNonExistentName = "foobar";
|
| - typedef GetAttribLocationBucket::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - SetBucketAsCString(kBucketId, kAttrib2Name);
|
| - *result = -1;
|
| - GetAttribLocationBucket cmd;
|
| - cmd.Init(client_program_id_, kBucketId,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(kAttrib2Location, *result);
|
| - SetBucketAsCString(kBucketId, kNonExistentName);
|
| - *result = -1;
|
| - cmd.Init(client_program_id_, kBucketId,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationBucketInvalidArgs) {
|
| - const uint32 kBucketId = 123;
|
| - typedef GetAttribLocationBucket::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - *result = -1;
|
| - GetAttribLocationBucket cmd;
|
| - // Check no bucket
|
| - cmd.Init(client_program_id_, kBucketId,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - // Check bad program id.
|
| - SetBucketAsCString(kBucketId, kAttrib2Name);
|
| - cmd.Init(kInvalidClientId, kBucketId,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - *result = -1;
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - // Check bad memory
|
| - cmd.Init(client_program_id_, kBucketId,
|
| - kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(client_program_id_, kBucketId,
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformLocation) {
|
| - const uint32 kNameSize = strlen(kUniform2Name);
|
| - const char* kNonExistentName = "foobar";
|
| - const uint32 kNonExistentNameSize = strlen(kNonExistentName);
|
| - typedef GetUniformLocation::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - *result = -1;
|
| - char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result));
|
| - const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result);
|
| - memcpy(name, kUniform2Name, kNameSize);
|
| - GetUniformLocation cmd;
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(kUniform2FakeLocation, *result);
|
| - memcpy(name, kNonExistentName, kNonExistentNameSize);
|
| - *result = -1;
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kNonExistentNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationInvalidArgs) {
|
| - const uint32 kNameSize = strlen(kUniform2Name);
|
| - const char* kBadName = "foo\abar";
|
| - const uint32 kBadNameSize = strlen(kBadName);
|
| - typedef GetUniformLocation::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - *result = -1;
|
| - char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result));
|
| - const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result);
|
| - memcpy(name, kUniform2Name, kNameSize);
|
| - GetUniformLocation cmd;
|
| - cmd.Init(kInvalidClientId,
|
| - kSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - *result = -1;
|
| - cmd.Init(client_program_id_,
|
| - kInvalidSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kNameOffset,
|
| - kInvalidSharedMemoryId, kSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kSharedBufferSize);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - memcpy(name, kBadName, kBadNameSize);
|
| - cmd.Init(client_program_id_,
|
| - kSharedMemoryId, kNameOffset,
|
| - kSharedMemoryId, kSharedMemoryOffset,
|
| - kBadNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationBucket) {
|
| - const uint32 kBucketId = 123;
|
| - const char* kNonExistentName = "foobar";
|
| - typedef GetUniformLocationBucket::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - SetBucketAsCString(kBucketId, kUniform2Name);
|
| - *result = -1;
|
| - GetUniformLocationBucket cmd;
|
| - cmd.Init(client_program_id_, kBucketId,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(kUniform2FakeLocation, *result);
|
| - SetBucketAsCString(kBucketId, kNonExistentName);
|
| - *result = -1;
|
| - cmd.Init(client_program_id_, kBucketId,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationBucketInvalidArgs) {
|
| - const uint32 kBucketId = 123;
|
| - typedef GetUniformLocationBucket::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - *result = -1;
|
| - GetUniformLocationBucket cmd;
|
| - // Check no bucket
|
| - cmd.Init(client_program_id_, kBucketId,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - // Check bad program id.
|
| - SetBucketAsCString(kBucketId, kUniform2Name);
|
| - cmd.Init(kInvalidClientId, kBucketId,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - *result = -1;
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(-1, *result);
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - // Check bad memory
|
| - cmd.Init(client_program_id_, kBucketId,
|
| - kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(client_program_id_, kBucketId,
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetMaxValueInBufferCHROMIUM) {
|
| - SetupIndexBuffer();
|
| - GetMaxValueInBufferCHROMIUM::Result* result =
|
| - static_cast<GetMaxValueInBufferCHROMIUM::Result*>(shared_memory_address_);
|
| - *result = 0;
|
| -
|
| - GetMaxValueInBufferCHROMIUM cmd;
|
| - cmd.Init(client_element_buffer_id_, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(7u, *result);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1,
|
| - GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(100u, *result);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - cmd.Init(kInvalidClientId, kValidIndexRangeCount,
|
| - GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(client_element_buffer_id_, kOutOfRangeIndexRangeEnd,
|
| - GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1,
|
| - GL_UNSIGNED_SHORT,
|
| - kOutOfRangeIndexRangeEnd * 2, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1,
|
| - GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(client_buffer_id_, kValidIndexRangeCount + 1,
|
| - GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1,
|
| - GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2,
|
| - kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1,
|
| - GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2,
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, SharedIds) {
|
| - GenSharedIdsCHROMIUM gen_cmd;
|
| - RegisterSharedIdsCHROMIUM reg_cmd;
|
| - DeleteSharedIdsCHROMIUM del_cmd;
|
| -
|
| - const GLuint kNamespaceId = id_namespaces::kTextures;
|
| - const GLuint kExpectedId1 = 1;
|
| - const GLuint kExpectedId2 = 2;
|
| - const GLuint kExpectedId3 = 4;
|
| - const GLuint kRegisterId = 3;
|
| - GLuint* ids = GetSharedMemoryAs<GLuint*>();
|
| - gen_cmd.Init(kNamespaceId, 0, 2, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(gen_cmd));
|
| - IdAllocatorInterface* id_allocator = GetIdAllocator(kNamespaceId);
|
| - ASSERT_TRUE(id_allocator != NULL);
|
| - // This check is implementation dependant but it's kind of hard to check
|
| - // otherwise.
|
| - EXPECT_EQ(kExpectedId1, ids[0]);
|
| - EXPECT_EQ(kExpectedId2, ids[1]);
|
| - EXPECT_TRUE(id_allocator->InUse(kExpectedId1));
|
| - EXPECT_TRUE(id_allocator->InUse(kExpectedId2));
|
| - EXPECT_FALSE(id_allocator->InUse(kRegisterId));
|
| - EXPECT_FALSE(id_allocator->InUse(kExpectedId3));
|
| -
|
| - ClearSharedMemory();
|
| - ids[0] = kRegisterId;
|
| - reg_cmd.Init(kNamespaceId, 1, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(reg_cmd));
|
| - EXPECT_TRUE(id_allocator->InUse(kExpectedId1));
|
| - EXPECT_TRUE(id_allocator->InUse(kExpectedId2));
|
| - EXPECT_TRUE(id_allocator->InUse(kRegisterId));
|
| - EXPECT_FALSE(id_allocator->InUse(kExpectedId3));
|
| -
|
| - ClearSharedMemory();
|
| - gen_cmd.Init(kNamespaceId, 0, 1, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(gen_cmd));
|
| - EXPECT_EQ(kExpectedId3, ids[0]);
|
| - EXPECT_TRUE(id_allocator->InUse(kExpectedId1));
|
| - EXPECT_TRUE(id_allocator->InUse(kExpectedId2));
|
| - EXPECT_TRUE(id_allocator->InUse(kRegisterId));
|
| - EXPECT_TRUE(id_allocator->InUse(kExpectedId3));
|
| -
|
| - ClearSharedMemory();
|
| - ids[0] = kExpectedId1;
|
| - ids[1] = kRegisterId;
|
| - del_cmd.Init(kNamespaceId, 2, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(del_cmd));
|
| - EXPECT_FALSE(id_allocator->InUse(kExpectedId1));
|
| - EXPECT_TRUE(id_allocator->InUse(kExpectedId2));
|
| - EXPECT_FALSE(id_allocator->InUse(kRegisterId));
|
| - EXPECT_TRUE(id_allocator->InUse(kExpectedId3));
|
| -
|
| - ClearSharedMemory();
|
| - ids[0] = kExpectedId3;
|
| - ids[1] = kExpectedId2;
|
| - del_cmd.Init(kNamespaceId, 2, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(del_cmd));
|
| - EXPECT_FALSE(id_allocator->InUse(kExpectedId1));
|
| - EXPECT_FALSE(id_allocator->InUse(kExpectedId2));
|
| - EXPECT_FALSE(id_allocator->InUse(kRegisterId));
|
| - EXPECT_FALSE(id_allocator->InUse(kExpectedId3));
|
| -
|
| - // Check passing in an id_offset.
|
| - ClearSharedMemory();
|
| - const GLuint kOffset = 0xABCDEF;
|
| - gen_cmd.Init(kNamespaceId, kOffset, 2, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(gen_cmd));
|
| - EXPECT_EQ(kOffset, ids[0]);
|
| - EXPECT_EQ(kOffset + 1, ids[1]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, GenSharedIdsCHROMIUMBadArgs) {
|
| - const GLuint kNamespaceId = id_namespaces::kTextures;
|
| - GenSharedIdsCHROMIUM cmd;
|
| - cmd.Init(kNamespaceId, 0, -1, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(kNamespaceId, 0, 1, kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(kNamespaceId, 0, 1, kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, RegisterSharedIdsCHROMIUMBadArgs) {
|
| - const GLuint kNamespaceId = id_namespaces::kTextures;
|
| - RegisterSharedIdsCHROMIUM cmd;
|
| - cmd.Init(kNamespaceId, -1, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(kNamespaceId, 1, kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(kNamespaceId, 1, kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, RegisterSharedIdsCHROMIUMDuplicateIds) {
|
| - const GLuint kNamespaceId = id_namespaces::kTextures;
|
| - const GLuint kRegisterId = 3;
|
| - RegisterSharedIdsCHROMIUM cmd;
|
| - GLuint* ids = GetSharedMemoryAs<GLuint*>();
|
| - ids[0] = kRegisterId;
|
| - cmd.Init(kNamespaceId, 1, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(kNamespaceId, 1, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, DeleteSharedIdsCHROMIUMBadArgs) {
|
| - const GLuint kNamespaceId = id_namespaces::kTextures;
|
| - DeleteSharedIdsCHROMIUM cmd;
|
| - cmd.Init(kNamespaceId, -1, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(kNamespaceId, 1, kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(kNamespaceId, 1, kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, TexSubImage2DValidArgs) {
|
| - const int kWidth = 16;
|
| - const int kHeight = 8;
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 1, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_, TexSubImage2D(
|
| - GL_TEXTURE_2D, 1, 1, 0, kWidth - 1, kHeight, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - shared_memory_address_))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - TexSubImage2D cmd;
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 1, 1, 0, kWidth - 1, kHeight, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, TexSubImage2DBadArgs) {
|
| - const int kWidth = 16;
|
| - const int kHeight = 8;
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 1, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - TexSubImage2D cmd;
|
| - cmd.Init(GL_TEXTURE0, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_TRUE, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_INT,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, -1, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 1, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, -1, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, 1, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth + 1, kHeight, GL_RGBA,
|
| - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight + 1, GL_RGBA,
|
| - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA,
|
| - GL_UNSIGNED_SHORT_4_4_4_4, kSharedMemoryId, kSharedMemoryOffset,
|
| - GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kInvalidSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, CopyTexSubImage2DValidArgs) {
|
| - const int kWidth = 16;
|
| - const int kHeight = 8;
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 1, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_, CopyTexSubImage2D(
|
| - GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - CopyTexSubImage2D cmd;
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, CopyTexSubImage2DBadArgs) {
|
| - const int kWidth = 16;
|
| - const int kHeight = 8;
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 1, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - CopyTexSubImage2D cmd;
|
| - cmd.Init(GL_TEXTURE0, 1, 0, 0, 0, 0, kWidth, kHeight);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, -1, 0, 0, 0, kWidth, kHeight);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 1, 0, 0, 0, kWidth, kHeight);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, -1, 0, 0, kWidth, kHeight);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, 1, 0, 0, kWidth, kHeight);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth + 1, kHeight);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight + 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -// Check that if a renderbuffer is attached and GL returns
|
| -// GL_FRAMEBUFFER_COMPLETE that the buffer is cleared and state is restored.
|
| -TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearColor) {
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - ClearColor color_cmd;
|
| - ColorMask color_mask_cmd;
|
| - Enable enable_cmd;
|
| - FramebufferRenderbuffer cmd;
|
| - color_cmd.Init(0.1f, 0.2f, 0.3f, 0.4f);
|
| - color_mask_cmd.Init(0, 1, 0, 1);
|
| - enable_cmd.Init(GL_SCISSOR_TEST);
|
| - cmd.Init(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_);
|
| - InSequence sequence;
|
| - EXPECT_CALL(*gl_, ClearColor(0.1f, 0.2f, 0.3f, 0.4f))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| - kServiceRenderbufferId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(color_cmd));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(color_mask_cmd));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(enable_cmd));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepth) {
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - ClearDepthf depth_cmd;
|
| - DepthMask depth_mask_cmd;
|
| - FramebufferRenderbuffer cmd;
|
| - depth_cmd.Init(0.5f);
|
| - depth_mask_cmd.Init(false);
|
| - cmd.Init(
|
| - GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_);
|
| - InSequence sequence;
|
| - EXPECT_CALL(*gl_, ClearDepth(0.5f))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
|
| - GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
|
| - kServiceRenderbufferId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(depth_mask_cmd));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearStencil) {
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - ClearStencil stencil_cmd;
|
| - StencilMaskSeparate stencil_mask_separate_cmd;
|
| - FramebufferRenderbuffer cmd;
|
| - stencil_cmd.Init(123);
|
| - stencil_mask_separate_cmd.Init(GL_BACK, 0x1234u);
|
| - cmd.Init(
|
| - GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_);
|
| - InSequence sequence;
|
| - EXPECT_CALL(*gl_, ClearStencil(123))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
|
| - GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
|
| - kServiceRenderbufferId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_mask_separate_cmd));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, IsBuffer) {
|
| - EXPECT_FALSE(DoIsBuffer(client_buffer_id_));
|
| - DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
|
| - EXPECT_TRUE(DoIsBuffer(client_buffer_id_));
|
| - DoDeleteBuffer(client_buffer_id_, kServiceBufferId);
|
| - EXPECT_FALSE(DoIsBuffer(client_buffer_id_));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, IsFramebuffer) {
|
| - EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_));
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - EXPECT_TRUE(DoIsFramebuffer(client_framebuffer_id_));
|
| - DoDeleteFramebuffer(
|
| - client_framebuffer_id_, kServiceFramebufferId,
|
| - true, GL_FRAMEBUFFER, 0,
|
| - true, GL_FRAMEBUFFER, 0);
|
| - EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, IsProgram) {
|
| - // IsProgram is true as soon as the program is created.
|
| - EXPECT_TRUE(DoIsProgram(client_program_id_));
|
| - EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DoDeleteProgram(client_program_id_, kServiceProgramId);
|
| - EXPECT_FALSE(DoIsProgram(client_program_id_));
|
| -
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, IsRenderbuffer) {
|
| - EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_));
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - EXPECT_TRUE(DoIsRenderbuffer(client_renderbuffer_id_));
|
| - DoDeleteRenderbuffer(client_renderbuffer_id_, kServiceRenderbufferId);
|
| - EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, IsShader) {
|
| - // IsShader is true as soon as the program is created.
|
| - EXPECT_TRUE(DoIsShader(client_shader_id_));
|
| - DoDeleteShader(client_shader_id_, kServiceShaderId);
|
| - EXPECT_FALSE(DoIsShader(client_shader_id_));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, IsTexture) {
|
| - EXPECT_FALSE(DoIsTexture(client_texture_id_));
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - EXPECT_TRUE(DoIsTexture(client_texture_id_));
|
| - DoDeleteTexture(client_texture_id_, kServiceTextureId);
|
| - EXPECT_FALSE(DoIsTexture(client_texture_id_));
|
| -}
|
| -
|
| -#if 0 // Turn this test on once we allow GL_DEPTH_STENCIL_ATTACHMENT
|
| -TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepthStencil) {
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - ClearDepthf depth_cmd;
|
| - ClearStencil stencil_cmd;
|
| - FramebufferRenderbuffer cmd;
|
| - depth_cmd.Init(0.5f);
|
| - stencil_cmd.Init(123);
|
| - cmd.Init(
|
| - GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_);
|
| - InSequence sequence;
|
| - EXPECT_CALL(*gl_, ClearDepth(0.5f))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, ClearStencil(123))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
|
| - GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
|
| - kServiceRenderbufferId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -#endif
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, VertexAttribPointer) {
|
| - SetupVertexBuffer();
|
| - static const GLenum types[] = {
|
| - GL_BYTE,
|
| - GL_UNSIGNED_BYTE,
|
| - GL_SHORT,
|
| - GL_UNSIGNED_SHORT,
|
| - GL_FLOAT,
|
| - GL_FIXED,
|
| - GL_INT,
|
| - GL_UNSIGNED_INT,
|
| - };
|
| - static const GLsizei sizes[] = {
|
| - 1,
|
| - 1,
|
| - 2,
|
| - 2,
|
| - 4,
|
| - 4,
|
| - 4,
|
| - 4,
|
| - };
|
| - static const GLuint indices[] = {
|
| - 0,
|
| - 1,
|
| - kNumVertexAttribs - 1,
|
| - kNumVertexAttribs,
|
| - };
|
| - static const GLsizei offset_mult[] = {
|
| - 0,
|
| - 0,
|
| - 1,
|
| - 1,
|
| - 2,
|
| - 1000,
|
| - };
|
| - static const GLsizei offset_offset[] = {
|
| - 0,
|
| - 1,
|
| - 0,
|
| - 1,
|
| - 0,
|
| - 0,
|
| - };
|
| - static const GLsizei stride_mult[] = {
|
| - -1,
|
| - 0,
|
| - 0,
|
| - 1,
|
| - 1,
|
| - 2,
|
| - 1000,
|
| - };
|
| - static const GLsizei stride_offset[] = {
|
| - 0,
|
| - 0,
|
| - 1,
|
| - 0,
|
| - 1,
|
| - 0,
|
| - 0,
|
| - };
|
| - for (size_t tt = 0; tt < arraysize(types); ++tt) {
|
| - GLenum type = types[tt];
|
| - GLsizei num_bytes = sizes[tt];
|
| - for (size_t ii = 0; ii < arraysize(indices); ++ii) {
|
| - GLuint index = indices[ii];
|
| - for (GLint size = 0; size < 5; ++size) {
|
| - for (size_t oo = 0; oo < arraysize(offset_mult); ++oo) {
|
| - GLuint offset = num_bytes * offset_mult[oo] + offset_offset[oo];
|
| - for (size_t ss = 0; ss < arraysize(stride_mult); ++ss) {
|
| - GLsizei stride = num_bytes * stride_mult[ss] + stride_offset[ss];
|
| - for (int normalize = 0; normalize < 2; ++normalize) {
|
| - bool index_good = index < static_cast<GLuint>(kNumVertexAttribs);
|
| - bool size_good = (size > 0 && size < 5);
|
| - bool offset_good = (offset % num_bytes == 0);
|
| - bool stride_good = (stride % num_bytes == 0) && stride >= 0 &&
|
| - stride <= 255;
|
| - bool type_good = (type != GL_INT && type != GL_UNSIGNED_INT &&
|
| - type != GL_FIXED);
|
| - bool good = size_good && offset_good && stride_good &&
|
| - type_good && index_good;
|
| - bool call = good && (type != GL_FIXED);
|
| - if (call) {
|
| - EXPECT_CALL(*gl_, VertexAttribPointer(
|
| - index, size, type, normalize, stride,
|
| - BufferOffset(offset)));
|
| - }
|
| - VertexAttribPointer cmd;
|
| - cmd.Init(index, size, type, normalize, stride, offset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - if (good) {
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - } else if (size_good &&
|
| - offset_good &&
|
| - stride_good &&
|
| - type_good &&
|
| - !index_good) {
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - } else if (size_good &&
|
| - offset_good &&
|
| - stride_good &&
|
| - !type_good &&
|
| - index_good) {
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| - } else if (size_good &&
|
| - offset_good &&
|
| - !stride_good &&
|
| - type_good &&
|
| - index_good) {
|
| - if (stride < 0 || stride > 255) {
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - } else {
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - }
|
| - } else if (size_good &&
|
| - !offset_good &&
|
| - stride_good &&
|
| - type_good &&
|
| - index_good) {
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - } else if (!size_good &&
|
| - offset_good &&
|
| - stride_good &&
|
| - type_good &&
|
| - index_good) {
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - } else {
|
| - EXPECT_NE(GL_NO_ERROR, GetGLError());
|
| - }
|
| - }
|
| - }
|
| - }
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -// Test that with an RGB backbuffer if we set the color mask to 1,1,1,1 it is
|
| -// set to 1,1,1,0 at Draw time but is 1,1,1,1 at query time.
|
| -TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMask) {
|
| - ColorMask cmd;
|
| - cmd.Init(true, true, true, true);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - SetupTexture();
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDirtyState(
|
| - true, // Framebuffer is RGB
|
| - false, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1110, // color bits
|
| - false, // depth mask
|
| - false, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays draw_cmd;
|
| - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_COLOR_WRITEMASK, result->GetData()))
|
| - .Times(0);
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_COLOR_WRITEMASK, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_COLOR_WRITEMASK),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(1, result->GetData()[0]);
|
| - EXPECT_EQ(1, result->GetData()[1]);
|
| - EXPECT_EQ(1, result->GetData()[2]);
|
| - EXPECT_EQ(1, result->GetData()[3]);
|
| -}
|
| -
|
| -// Test that with no depth if we set DepthMask true that it's set to false at
|
| -// draw time but querying it returns true.
|
| -TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferDepthMask) {
|
| - EXPECT_CALL(*gl_, DepthMask(true))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DepthMask cmd;
|
| - cmd.Init(true);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - SetupTexture();
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDirtyState(
|
| - true, // Framebuffer is RGB
|
| - false, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1110, // color bits
|
| - false, // depth mask
|
| - false, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays draw_cmd;
|
| - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_WRITEMASK, result->GetData()))
|
| - .Times(0);
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_DEPTH_WRITEMASK, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_WRITEMASK),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(1, result->GetData()[0]);
|
| -}
|
| -
|
| -// Test that with no stencil if we set the stencil mask it's still set to 0 at
|
| -// draw time but gets our value if we query.
|
| -TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferStencilMask) {
|
| - const GLint kMask = 123;
|
| - EXPECT_CALL(*gl_, StencilMask(kMask))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - StencilMask cmd;
|
| - cmd.Init(kMask);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - SetupTexture();
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDirtyState(
|
| - true, // Framebuffer is RGB
|
| - false, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1110, // color bits
|
| - false, // depth mask
|
| - false, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays draw_cmd;
|
| - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_WRITEMASK, result->GetData()))
|
| - .Times(0);
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_STENCIL_WRITEMASK, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_WRITEMASK),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(kMask, result->GetData()[0]);
|
| -}
|
| -
|
| -// Test that if an FBO is bound we get the correct masks.
|
| -TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMaskFBO) {
|
| - ColorMask cmd;
|
| - cmd.Init(true, true, true, true);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - SetupTexture();
|
| - SetupVertexBuffer();
|
| - DoEnableVertexAttribArray(0);
|
| - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
|
| - DoEnableVertexAttribArray(1);
|
| - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| - DoEnableVertexAttribArray(2);
|
| - DoVertexAttribPointer(2, 2, GL_FLOAT, 0, 0);
|
| - SetupExpectationsForApplyingDirtyState(
|
| - true, // Framebuffer is RGB
|
| - false, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1110, // color bits
|
| - false, // depth mask
|
| - false, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays draw_cmd;
|
| - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Check that no extra calls are made on the next draw.
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Setup Frame buffer.
|
| - // needs to be 1x1 or else it's not renderable.
|
| - const GLsizei kWidth = 1;
|
| - const GLsizei kHeight = 1;
|
| - const GLenum kFormat = GL_RGB;
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - // Pass some data so the texture will be marked as cleared.
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, kFormat, kWidth, kHeight, 0,
|
| - kFormat, GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset);
|
| - DoBindFramebuffer(
|
| - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| - DoFramebufferTexture2D(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - client_texture_id_, kServiceTextureId, 0, GL_NO_ERROR);
|
| - EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
|
| - .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
|
| - .RetiresOnSaturation();
|
| -
|
| - // This time state needs to be set.
|
| - SetupExpectationsForApplyingDirtyState(
|
| - false, // Framebuffer is RGB
|
| - false, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1110, // color bits
|
| - false, // depth mask
|
| - false, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Check that no extra calls are made on the next draw.
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Unbind
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0);
|
| -
|
| - SetupExpectationsForApplyingDirtyState(
|
| - true, // Framebuffer is RGB
|
| - false, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1110, // color bits
|
| - false, // depth mask
|
| - false, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ActualAlphaMatchesRequestedAlpha) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.has_alpha = true;
|
| - init.request_alpha = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(8))
|
| - .RetiresOnSaturation();
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_ALPHA_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ALPHA_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(8, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ActualAlphaDoesNotMatchRequestedAlpha) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.has_alpha = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(8))
|
| - .RetiresOnSaturation();
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_ALPHA_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ALPHA_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(0, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ActualDepthMatchesRequestedDepth) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.has_depth = true;
|
| - init.request_depth = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(24))
|
| - .RetiresOnSaturation();
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(24, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ActualDepthDoesNotMatchRequestedDepth) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.has_depth = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(24))
|
| - .RetiresOnSaturation();
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(0, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ActualStencilMatchesRequestedStencil) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.has_stencil = true;
|
| - init.request_stencil = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(8))
|
| - .RetiresOnSaturation();
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(8, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ActualStencilDoesNotMatchRequestedStencil) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.has_stencil = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(8))
|
| - .RetiresOnSaturation();
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(0, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, DepthEnableWithDepth) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.has_depth = true;
|
| - init.request_depth = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - Enable cmd;
|
| - cmd.Init(GL_DEPTH_TEST);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - SetupDefaultProgram();
|
| - SetupTexture();
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDirtyState(
|
| - true, // Framebuffer is RGB
|
| - true, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1110, // color bits
|
| - true, // depth mask
|
| - true, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays draw_cmd;
|
| - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_TEST, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_DEPTH_TEST, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_TEST),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(1, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, DepthEnableWithoutRequestedDepth) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.has_depth = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - Enable cmd;
|
| - cmd.Init(GL_DEPTH_TEST);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - SetupDefaultProgram();
|
| - SetupTexture();
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDirtyState(
|
| - true, // Framebuffer is RGB
|
| - false, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1110, // color bits
|
| - false, // depth mask
|
| - false, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays draw_cmd;
|
| - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_TEST, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_DEPTH_TEST, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_TEST),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(1, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, StencilEnableWithStencil) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.has_stencil = true;
|
| - init.request_stencil = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - Enable cmd;
|
| - cmd.Init(GL_STENCIL_TEST);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - SetupDefaultProgram();
|
| - SetupTexture();
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDirtyState(
|
| - true, // Framebuffer is RGB
|
| - false, // Framebuffer has depth
|
| - true, // Framebuffer has stencil
|
| - 0x1110, // color bits
|
| - false, // depth mask
|
| - false, // depth enabled
|
| - -1, // front stencil mask
|
| - -1, // back stencil mask
|
| - true, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays draw_cmd;
|
| - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_TEST, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_STENCIL_TEST, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_TEST),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(1, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, StencilEnableWithoutRequestedStencil) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.has_stencil = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - Enable cmd;
|
| - cmd.Init(GL_STENCIL_TEST);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - SetupDefaultProgram();
|
| - SetupTexture();
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDirtyState(
|
| - true, // Framebuffer is RGB
|
| - false, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1110, // color bits
|
| - false, // depth mask
|
| - false, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays draw_cmd;
|
| - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_TEST, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_STENCIL_TEST, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_TEST),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(1, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilReportsCorrectValues) {
|
| - InitState init;
|
| - init.extensions = "GL_OES_packed_depth_stencil";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.has_depth = true;
|
| - init.has_stencil = true;
|
| - init.request_depth = true;
|
| - init.request_stencil = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(8))
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(8, result->GetData()[0]);
|
| - result->size = 0;
|
| - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(24))
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(24, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilNoRequestedStencil) {
|
| - InitState init;
|
| - init.extensions = "GL_OES_packed_depth_stencil";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.has_depth = true;
|
| - init.has_stencil = true;
|
| - init.request_depth = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(8))
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(0, result->GetData()[0]);
|
| - result->size = 0;
|
| - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(24))
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(24, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilRenderbufferDepth) {
|
| - InitState init;
|
| - init.extensions = "GL_OES_packed_depth_stencil";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR)) // for RenderbufferStoage
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR)) // for FramebufferRenderbuffer
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| -
|
| - EXPECT_CALL(*gl_, RenderbufferStorageEXT(
|
| - GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - RenderbufferStorage cmd;
|
| - cmd.Init(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
|
| - GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
|
| - kServiceRenderbufferId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - FramebufferRenderbuffer fbrb_cmd;
|
| - fbrb_cmd.Init(
|
| - GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd));
|
| -
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(8))
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(0, result->GetData()[0]);
|
| - result->size = 0;
|
| - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(24))
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(24, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilRenderbufferStencil) {
|
| - InitState init;
|
| - init.extensions = "GL_OES_packed_depth_stencil";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR)) // for RenderbufferStoage
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR)) // for FramebufferRenderbuffer
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| -
|
| - EXPECT_CALL(*gl_, RenderbufferStorageEXT(
|
| - GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - RenderbufferStorage cmd;
|
| - cmd.Init(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
|
| - GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
|
| - kServiceRenderbufferId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - FramebufferRenderbuffer fbrb_cmd;
|
| - fbrb_cmd.Init(
|
| - GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd));
|
| -
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - result->size = 0;
|
| - GetIntegerv cmd2;
|
| - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(8))
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(8, result->GetData()[0]);
|
| - result->size = 0;
|
| - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _))
|
| - .WillOnce(SetArgumentPointee<1>(24))
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(
|
| - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS),
|
| - result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(0, result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, GetMultipleIntegervCHROMIUMValidArgs) {
|
| - const GLsizei kCount = 3;
|
| - GLenum* pnames = GetSharedMemoryAs<GLenum*>();
|
| - pnames[0] = GL_DEPTH_WRITEMASK;
|
| - pnames[1] = GL_COLOR_WRITEMASK;
|
| - pnames[2] = GL_STENCIL_WRITEMASK;
|
| - GLint* results =
|
| - GetSharedMemoryAsWithOffset<GLint*>(sizeof(*pnames) * kCount);
|
| -
|
| - GLsizei num_results = 0;
|
| - for (GLsizei ii = 0; ii < kCount; ++ii) {
|
| - num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]);
|
| - }
|
| - const GLsizei result_size = num_results * sizeof(*results);
|
| - memset(results, 0, result_size);
|
| -
|
| - const GLint kSentinel = 0x12345678;
|
| - results[num_results] = kSentinel;
|
| -
|
| - GetMultipleIntegervCHROMIUM cmd;
|
| - cmd.Init(
|
| - kSharedMemoryId, kSharedMemoryOffset, kCount,
|
| - kSharedMemoryId, kSharedMemoryOffset + sizeof(*pnames) * kCount,
|
| - result_size);
|
| -
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(1, results[0]); // Depth writemask
|
| - EXPECT_EQ(1, results[1]); // color writemask red
|
| - EXPECT_EQ(1, results[2]); // color writemask green
|
| - EXPECT_EQ(1, results[3]); // color writemask blue
|
| - EXPECT_EQ(1, results[4]); // color writemask alpha
|
| - EXPECT_EQ(-1, results[5]); // stencil writemask alpha
|
| - EXPECT_EQ(kSentinel, results[num_results]); // End of results
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, GetMultipleIntegervCHROMIUMInvalidArgs) {
|
| - const GLsizei kCount = 3;
|
| - // Offset the pnames because GLGetError will use the first uint32.
|
| - const uint32 kPnameOffset = sizeof(uint32);
|
| - const uint32 kResultsOffset = kPnameOffset + sizeof(GLint) * kCount;
|
| - GLenum* pnames = GetSharedMemoryAsWithOffset<GLenum*>(kPnameOffset);
|
| - pnames[0] = GL_DEPTH_WRITEMASK;
|
| - pnames[1] = GL_COLOR_WRITEMASK;
|
| - pnames[2] = GL_STENCIL_WRITEMASK;
|
| - GLint* results = GetSharedMemoryAsWithOffset<GLint*>(kResultsOffset);
|
| -
|
| - GLsizei num_results = 0;
|
| - for (GLsizei ii = 0; ii < kCount; ++ii) {
|
| - num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]);
|
| - }
|
| - const GLsizei result_size = num_results * sizeof(*results);
|
| - memset(results, 0, result_size);
|
| -
|
| - const GLint kSentinel = 0x12345678;
|
| - results[num_results] = kSentinel;
|
| -
|
| - GetMultipleIntegervCHROMIUM cmd;
|
| - // Check bad pnames pointer.
|
| - cmd.Init(
|
| - kInvalidSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount,
|
| - kSharedMemoryId, kSharedMemoryOffset + kResultsOffset,
|
| - result_size);
|
| - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - // Check bad pnames pointer.
|
| - cmd.Init(
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset, kCount,
|
| - kSharedMemoryId, kSharedMemoryOffset + kResultsOffset,
|
| - result_size);
|
| - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - // Check bad count.
|
| - cmd.Init(
|
| - kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, -1,
|
| - kSharedMemoryId, kSharedMemoryOffset + kResultsOffset,
|
| - result_size);
|
| - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - // Check bad results pointer.
|
| - cmd.Init(
|
| - kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount,
|
| - kInvalidSharedMemoryId, kSharedMemoryOffset + kResultsOffset,
|
| - result_size);
|
| - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - // Check bad results pointer.
|
| - cmd.Init(
|
| - kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount,
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset,
|
| - result_size);
|
| - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - // Check bad size.
|
| - cmd.Init(
|
| - kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount,
|
| - kSharedMemoryId, kSharedMemoryOffset + kResultsOffset,
|
| - result_size + 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - // Check bad size.
|
| - cmd.Init(
|
| - kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount,
|
| - kSharedMemoryId, kSharedMemoryOffset + kResultsOffset,
|
| - result_size - 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - // Check bad enum.
|
| - cmd.Init(
|
| - kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount,
|
| - kSharedMemoryId, kSharedMemoryOffset + kResultsOffset,
|
| - result_size);
|
| - GLenum temp = pnames[2];
|
| - pnames[2] = GL_TRUE;
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| - pnames[2] = temp;
|
| - // Check results area has not been cleared by client.
|
| - results[1] = 1;
|
| - EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd));
|
| - // Check buffer is what we expect
|
| - EXPECT_EQ(0, results[0]);
|
| - EXPECT_EQ(1, results[1]);
|
| - EXPECT_EQ(0, results[2]);
|
| - EXPECT_EQ(0, results[3]);
|
| - EXPECT_EQ(0, results[4]);
|
| - EXPECT_EQ(0, results[5]);
|
| - EXPECT_EQ(kSentinel, results[num_results]); // End of results
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, TexImage2DRedefinitionSucceeds) {
|
| - const int kWidth = 16;
|
| - const int kHeight = 8;
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillRepeatedly(Return(GL_NO_ERROR));
|
| - for (int ii = 0; ii < 2; ++ii) {
|
| - TexImage2D cmd;
|
| - if (ii == 0) {
|
| - EXPECT_CALL(*gl_, TexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA,
|
| - GL_UNSIGNED_BYTE, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA,
|
| - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset);
|
| - } else {
|
| - SetupClearTextureExpectations(
|
| - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D,
|
| - 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, kWidth, kHeight);
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA,
|
| - GL_UNSIGNED_BYTE, 0, 0);
|
| - }
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_CALL(*gl_, TexSubImage2D(
|
| - GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight - 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - shared_memory_address_))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - // Consider this TexSubImage2D command part of the previous TexImage2D
|
| - // (last GL_TRUE argument). It will be skipped if there are bugs in the
|
| - // redefinition case.
|
| - TexSubImage2D cmd2;
|
| - cmd2.Init(
|
| - GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight - 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_TRUE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, TexImage2DGLError) {
|
| - GLenum target = GL_TEXTURE_2D;
|
| - GLint level = 0;
|
| - GLenum internal_format = GL_RGBA;
|
| - GLsizei width = 2;
|
| - GLsizei height = 4;
|
| - GLint border = 0;
|
| - GLenum format = GL_RGBA;
|
| - GLenum type = GL_UNSIGNED_BYTE;
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - TextureManager* manager = group().texture_manager();
|
| - TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
|
| - ASSERT_TRUE(texture_ref != NULL);
|
| - Texture* texture = texture_ref->texture();
|
| - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height));
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_OUT_OF_MEMORY))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, TexImage2D(target, level, internal_format,
|
| - width, height, border, format, type, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - TexImage2D cmd;
|
| - cmd.Init(target, level, internal_format, width, height, border, format,
|
| - type, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, BufferDataGLError) {
|
| - GLenum target = GL_ARRAY_BUFFER;
|
| - GLsizeiptr size = 4;
|
| - DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
|
| - BufferManager* manager = group().buffer_manager();
|
| - Buffer* buffer = manager->GetBuffer(client_buffer_id_);
|
| - ASSERT_TRUE(buffer != NULL);
|
| - EXPECT_EQ(0, buffer->size());
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_OUT_OF_MEMORY))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, BufferData(target, size, _, GL_STREAM_DRAW))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - BufferData cmd;
|
| - cmd.Init(target, size, 0, 0, GL_STREAM_DRAW);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| - EXPECT_EQ(0, buffer->size());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, CopyTexImage2DGLError) {
|
| - GLenum target = GL_TEXTURE_2D;
|
| - GLint level = 0;
|
| - GLenum internal_format = GL_RGBA;
|
| - GLsizei width = 2;
|
| - GLsizei height = 4;
|
| - GLint border = 0;
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - TextureManager* manager = group().texture_manager();
|
| - TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
|
| - ASSERT_TRUE(texture_ref != NULL);
|
| - Texture* texture = texture_ref->texture();
|
| - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height));
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_OUT_OF_MEMORY))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, CopyTexImage2D(
|
| - target, level, internal_format, 0, 0, width, height, border))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - CopyTexImage2D cmd;
|
| - cmd.Init(target, level, internal_format, 0, 0, width, height, border);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, FramebufferRenderbufferGLError) {
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_OUT_OF_MEMORY))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| - kServiceRenderbufferId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - FramebufferRenderbuffer cmd;
|
| - cmd.Init(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, FramebufferTexture2DGLError) {
|
| - const GLsizei kWidth = 5;
|
| - const GLsizei kHeight = 3;
|
| - const GLenum kFormat = GL_RGB;
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, kFormat, kWidth, kHeight, 0,
|
| - kFormat, GL_UNSIGNED_BYTE, 0, 0);
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_OUT_OF_MEMORY))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, FramebufferTexture2DEXT(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - kServiceTextureId, 0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - FramebufferTexture2D fbtex_cmd;
|
| - fbtex_cmd.Init(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_,
|
| - 0);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, RenderbufferStorageGLError) {
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_OUT_OF_MEMORY))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, RenderbufferStorageEXT(
|
| - GL_RENDERBUFFER, GL_RGBA, 100, 50))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - RenderbufferStorage cmd;
|
| - cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 100, 50);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, RenderbufferStorageBadArgs) {
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - RenderbufferStorage cmd;
|
| - cmd.Init(GL_RENDERBUFFER, GL_RGBA4, TestHelper::kMaxRenderbufferSize + 1, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 1, TestHelper::kMaxRenderbufferSize + 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest,
|
| - RenderbufferStorageMultisampleCHROMIUMGLError) {
|
| - InitState init;
|
| - init.extensions = "GL_EXT_framebuffer_multisample";
|
| - init.gl_version = "2.1";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_OUT_OF_MEMORY))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, RenderbufferStorageMultisampleEXT(
|
| - GL_RENDERBUFFER, 1, GL_RGBA, 100, 50))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - RenderbufferStorageMultisampleCHROMIUM cmd;
|
| - cmd.Init(GL_RENDERBUFFER, 1, GL_RGBA4, 100, 50);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest,
|
| - RenderbufferStorageMultisampleCHROMIUMBadArgs) {
|
| - InitState init;
|
| - init.extensions = "GL_EXT_framebuffer_multisample";
|
| - init.gl_version = "2.1";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - EXPECT_CALL(*gl_, RenderbufferStorageMultisampleEXT(_, _, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - RenderbufferStorageMultisampleCHROMIUM cmd;
|
| - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples + 1,
|
| - GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples,
|
| - GL_RGBA4, TestHelper::kMaxRenderbufferSize + 1, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples,
|
| - GL_RGBA4, 1, TestHelper::kMaxRenderbufferSize + 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, RenderbufferStorageMultisampleCHROMIUM) {
|
| - InitState init;
|
| - init.extensions = "GL_EXT_framebuffer_multisample";
|
| - init.gl_version = "2.1";
|
| - InitDecoder(init);
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - InSequence sequence;
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(
|
| - *gl_,
|
| - RenderbufferStorageMultisampleEXT(GL_RENDERBUFFER,
|
| - TestHelper::kMaxSamples,
|
| - GL_RGBA,
|
| - TestHelper::kMaxRenderbufferSize,
|
| - 1))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - RenderbufferStorageMultisampleCHROMIUM cmd;
|
| - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples,
|
| - GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest,
|
| - RenderbufferStorageMultisampleEXTNotSupported) {
|
| - InitState init;
|
| - init.extensions = "GL_EXT_framebuffer_multisample";
|
| - init.gl_version = "2.1";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - InSequence sequence;
|
| - // GL_EXT_framebuffer_multisample uses RenderbufferStorageMultisampleCHROMIUM.
|
| - RenderbufferStorageMultisampleEXT cmd;
|
| - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples,
|
| - GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -class GLES2DecoderMultisampledRenderToTextureTest
|
| - : public GLES2DecoderTestWithExtensionsOnGLES2 {};
|
| -
|
| -TEST_P(GLES2DecoderMultisampledRenderToTextureTest,
|
| - NotCompatibleWithRenderbufferStorageMultisampleCHROMIUM) {
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - RenderbufferStorageMultisampleCHROMIUM cmd;
|
| - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples,
|
| - GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_P(GLES2DecoderMultisampledRenderToTextureTest,
|
| - RenderbufferStorageMultisampleEXT) {
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - InSequence sequence;
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - if (strstr(GetParam(), "GL_IMG_multisampled_render_to_texture")) {
|
| - EXPECT_CALL(
|
| - *gl_,
|
| - RenderbufferStorageMultisampleIMG(GL_RENDERBUFFER,
|
| - TestHelper::kMaxSamples,
|
| - GL_RGBA,
|
| - TestHelper::kMaxRenderbufferSize,
|
| - 1))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - } else {
|
| - EXPECT_CALL(
|
| - *gl_,
|
| - RenderbufferStorageMultisampleEXT(GL_RENDERBUFFER,
|
| - TestHelper::kMaxSamples,
|
| - GL_RGBA,
|
| - TestHelper::kMaxRenderbufferSize,
|
| - 1))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - }
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - RenderbufferStorageMultisampleEXT cmd;
|
| - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples,
|
| - GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -INSTANTIATE_TEST_CASE_P(
|
| - GLES2DecoderMultisampledRenderToTextureTests,
|
| - GLES2DecoderMultisampledRenderToTextureTest,
|
| - ::testing::Values("GL_EXT_multisampled_render_to_texture",
|
| - "GL_IMG_multisampled_render_to_texture"));
|
| -
|
| -TEST_F(GLES2DecoderTest, ReadPixelsGLError) {
|
| - GLenum kFormat = GL_RGBA;
|
| - GLint x = 0;
|
| - GLint y = 0;
|
| - GLsizei width = 2;
|
| - GLsizei height = 4;
|
| - typedef ReadPixels::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - uint32 result_shm_id = kSharedMemoryId;
|
| - uint32 result_shm_offset = kSharedMemoryOffset;
|
| - uint32 pixels_shm_id = kSharedMemoryId;
|
| - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_OUT_OF_MEMORY))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(
|
| - *gl_, ReadPixels(x, y, width, height, kFormat, GL_UNSIGNED_BYTE, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - ReadPixels cmd;
|
| - cmd.Init(x, y, width, height, kFormat, GL_UNSIGNED_BYTE,
|
| - pixels_shm_id, pixels_shm_offset,
|
| - result_shm_id, result_shm_offset,
|
| - false);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsS3TC) {
|
| - const GLenum formats[] = {
|
| - GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
|
| - GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
|
| - GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,
|
| - GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
|
| - };
|
| - CheckFormats("GL_EXT_texture_compression_s3tc", formats, 4);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsATC) {
|
| - const GLenum formats[] = {
|
| - GL_ATC_RGB_AMD,
|
| - GL_ATC_RGBA_EXPLICIT_ALPHA_AMD,
|
| - GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD
|
| - };
|
| - CheckFormats("GL_AMD_compressed_ATC_texture", formats, 3);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsPVRTC) {
|
| - const GLenum formats[] = {
|
| - GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG,
|
| - GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG,
|
| - GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,
|
| - GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
|
| - };
|
| - CheckFormats("GL_IMG_texture_compression_pvrtc", formats, 4);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsETC1) {
|
| - const GLenum formats[] = {
|
| - GL_ETC1_RGB8_OES
|
| - };
|
| - CheckFormats("GL_OES_compressed_ETC1_RGB8_texture", formats, 1);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, GetNoCompressedTextureFormats) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| -
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - GetIntegerv cmd;
|
| - result->size = 0;
|
| - EXPECT_CALL(*gl_, GetIntegerv(_, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - cmd.Init(
|
| - GL_NUM_COMPRESSED_TEXTURE_FORMATS,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(1, result->GetNumResults());
|
| - GLint num_formats = result->GetData()[0];
|
| - EXPECT_EQ(0, num_formats);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - result->size = 0;
|
| - cmd.Init(
|
| - GL_COMPRESSED_TEXTURE_FORMATS,
|
| - shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(num_formats, result->GetNumResults());
|
| -
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, CompressedTexImage2DBucketBadBucket) {
|
| - InitState init;
|
| - init.extensions = "GL_EXT_texture_compression_s3tc";
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - const uint32 kBadBucketId = 123;
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - CompressedTexImage2DBucket cmd;
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 4, 4, 0,
|
| - kBadBucketId);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| - CompressedTexSubImage2DBucket cmd2;
|
| - cmd2.Init(
|
| - GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
|
| - kBadBucketId);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -namespace {
|
| -
|
| -struct S3TCTestData {
|
| - GLenum format;
|
| - size_t block_size;
|
| -};
|
| -
|
| -} // anonymous namespace.
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, CompressedTexImage2DS3TC) {
|
| - InitState init;
|
| - init.extensions = "GL_EXT_texture_compression_s3tc";
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - const uint32 kBucketId = 123;
|
| - CommonDecoder::Bucket* bucket = decoder_->CreateBucket(kBucketId);
|
| - ASSERT_TRUE(bucket != NULL);
|
| -
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| -
|
| - static const S3TCTestData test_data[] = {
|
| - { GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, },
|
| - { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, },
|
| - { GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 16, },
|
| - { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 16, },
|
| - };
|
| -
|
| - for (size_t ii = 0; ii < arraysize(test_data); ++ii) {
|
| - const S3TCTestData& test = test_data[ii];
|
| - CompressedTexImage2DBucket cmd;
|
| - // test small width.
|
| - DoCompressedTexImage2D(
|
| - GL_TEXTURE_2D, 0, test.format, 2, 4, 0, test.block_size,
|
| - kBucketId);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // test bad width.
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 0, test.format, 5, 4, 0,
|
| - kBucketId);
|
| - bucket->SetSize(test.block_size * 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - // test small height.
|
| - DoCompressedTexImage2D(
|
| - GL_TEXTURE_2D, 0, test.format, 4, 2, 0, test.block_size,
|
| - kBucketId);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // test too bad height.
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 0, test.format, 4, 5, 0,
|
| - kBucketId);
|
| - bucket->SetSize(test.block_size * 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - // test small for level 0.
|
| - DoCompressedTexImage2D(
|
| - GL_TEXTURE_2D, 0, test.format, 1, 1, 0, test.block_size,
|
| - kBucketId);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // test small for level 0.
|
| - DoCompressedTexImage2D(
|
| - GL_TEXTURE_2D, 0, test.format, 2, 2, 0, test.block_size,
|
| - kBucketId);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // test size too large.
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 0, test.format, 4, 4, 0,
|
| - kBucketId);
|
| - bucket->SetSize(test.block_size * 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -
|
| - // test size too small.
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 0, test.format, 4, 4, 0,
|
| - kBucketId);
|
| - bucket->SetSize(test.block_size / 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -
|
| - // test with 3 mips.
|
| - DoCompressedTexImage2D(
|
| - GL_TEXTURE_2D, 0, test.format, 4, 4, 0, test.block_size, kBucketId);
|
| - DoCompressedTexImage2D(
|
| - GL_TEXTURE_2D, 1, test.format, 2, 2, 0, test.block_size, kBucketId);
|
| - DoCompressedTexImage2D(
|
| - GL_TEXTURE_2D, 2, test.format, 1, 1, 0, test.block_size, kBucketId);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Test a 16x16
|
| - DoCompressedTexImage2D(
|
| - GL_TEXTURE_2D, 0, test.format, 16, 16, 0, test.block_size * 4 * 4,
|
| - kBucketId);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - CompressedTexSubImage2DBucket sub_cmd;
|
| - bucket->SetSize(test.block_size);
|
| - // Test sub image bad xoffset
|
| - sub_cmd.Init(
|
| - GL_TEXTURE_2D, 0, 1, 0, 4, 4, test.format, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - // Test sub image bad yoffset
|
| - sub_cmd.Init(
|
| - GL_TEXTURE_2D, 0, 0, 2, 4, 4, test.format, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - // Test sub image bad width
|
| - bucket->SetSize(test.block_size * 2);
|
| - sub_cmd.Init(
|
| - GL_TEXTURE_2D, 0, 0, 0, 5, 4, test.format, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - // Test sub image bad height
|
| - sub_cmd.Init(
|
| - GL_TEXTURE_2D, 0, 0, 0, 4, 5, test.format, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - // Test sub image bad size
|
| - bucket->SetSize(test.block_size + 1);
|
| - sub_cmd.Init(
|
| - GL_TEXTURE_2D, 0, 0, 0, 4, 4, test.format, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -
|
| - for (GLint yoffset = 0; yoffset <= 8; yoffset += 4) {
|
| - for (GLint xoffset = 0; xoffset <= 8; xoffset += 4) {
|
| - for (GLsizei height = 4; height <= 8; height +=4 ) {
|
| - for (GLsizei width = 4; width <= 8; width += 4) {
|
| - GLsizei size = test.block_size * (width / 4) * (height / 4);
|
| - bucket->SetSize(size);
|
| - EXPECT_CALL(*gl_, CompressedTexSubImage2D(
|
| - GL_TEXTURE_2D, 0, xoffset, yoffset, width, height, test.format,
|
| - size, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - sub_cmd.Init(
|
| - GL_TEXTURE_2D, 0, xoffset, yoffset, width, height, test.format,
|
| - kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - }
|
| - }
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, CompressedTexImage2DETC1) {
|
| - InitState init;
|
| - init.extensions = "GL_OES_compressed_ETC1_RGB8_texture";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - const uint32 kBucketId = 123;
|
| - CommonDecoder::Bucket* bucket = decoder_->CreateBucket(kBucketId);
|
| - ASSERT_TRUE(bucket != NULL);
|
| -
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| -
|
| - const GLenum kFormat = GL_ETC1_RGB8_OES;
|
| - const size_t kBlockSize = 8;
|
| -
|
| - CompressedTexImage2DBucket cmd;
|
| - // test small width.
|
| - DoCompressedTexImage2D(GL_TEXTURE_2D, 0, kFormat, 4, 8, 0, 16, kBucketId);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // test small height.
|
| - DoCompressedTexImage2D(GL_TEXTURE_2D, 0, kFormat, 8, 4, 0, 16, kBucketId);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // test size too large.
|
| - cmd.Init(GL_TEXTURE_2D, 0, kFormat, 4, 4, 0, kBucketId);
|
| - bucket->SetSize(kBlockSize * 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -
|
| - // test size too small.
|
| - cmd.Init(GL_TEXTURE_2D, 0, kFormat, 4, 4, 0, kBucketId);
|
| - bucket->SetSize(kBlockSize / 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -
|
| - // Test a 16x16
|
| - DoCompressedTexImage2D(
|
| - GL_TEXTURE_2D, 0, kFormat, 16, 16, 0, kBlockSize * 16, kBucketId);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Test CompressedTexSubImage not allowed
|
| - CompressedTexSubImage2DBucket sub_cmd;
|
| - bucket->SetSize(kBlockSize);
|
| - sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 4, kFormat, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - // Test TexSubImage not allowed for ETC1 compressed texture
|
| - TextureRef* texture_ref = GetTexture(client_texture_id_);
|
| - ASSERT_TRUE(texture_ref != NULL);
|
| - Texture* texture = texture_ref->texture();
|
| - GLenum type, internal_format;
|
| - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
|
| - EXPECT_EQ(kFormat, internal_format);
|
| - TexSubImage2D texsub_cmd;
|
| - texsub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(texsub_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - // Test CopyTexSubImage not allowed for ETC1 compressed texture
|
| - CopyTexSubImage2D copy_cmd;
|
| - copy_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetProgramInfoCHROMIUMValidArgs) {
|
| - const uint32 kBucketId = 123;
|
| - GetProgramInfoCHROMIUM cmd;
|
| - cmd.Init(client_program_id_, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
|
| - EXPECT_GT(bucket->size(), 0u);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, GetProgramInfoCHROMIUMInvalidArgs) {
|
| - const uint32 kBucketId = 123;
|
| - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
|
| - EXPECT_TRUE(bucket == NULL);
|
| - GetProgramInfoCHROMIUM cmd;
|
| - cmd.Init(kInvalidClientId, kBucketId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - bucket = decoder_->GetBucket(kBucketId);
|
| - ASSERT_TRUE(bucket != NULL);
|
| - EXPECT_EQ(sizeof(ProgramInfoHeader), bucket->size());
|
| - ProgramInfoHeader* info = bucket->GetDataAs<ProgramInfoHeader*>(
|
| - 0, sizeof(ProgramInfoHeader));
|
| - ASSERT_TRUE(info != 0);
|
| - EXPECT_EQ(0u, info->link_status);
|
| - EXPECT_EQ(0u, info->num_attribs);
|
| - EXPECT_EQ(0u, info->num_uniforms);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, EGLImageExternalBindTexture) {
|
| - InitState init;
|
| - init.extensions = "GL_OES_EGL_image_external";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_EXTERNAL_OES, kNewServiceId));
|
| - EXPECT_CALL(*gl_, GenTextures(1, _))
|
| - .WillOnce(SetArgumentPointee<1>(kNewServiceId));
|
| - BindTexture cmd;
|
| - cmd.Init(GL_TEXTURE_EXTERNAL_OES, kNewClientId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - TextureRef* texture_ref = GetTexture(kNewClientId);
|
| - EXPECT_TRUE(texture_ref != NULL);
|
| - EXPECT_TRUE(texture_ref->texture()->target() == GL_TEXTURE_EXTERNAL_OES);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, EGLImageExternalGetBinding) {
|
| - InitState init;
|
| - init.extensions = "GL_OES_EGL_image_external";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES,
|
| - result->GetData()))
|
| - .Times(0);
|
| - result->size = 0;
|
| - GetIntegerv cmd;
|
| - cmd.Init(GL_TEXTURE_BINDING_EXTERNAL_OES,
|
| - shared_memory_id_,
|
| - shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(
|
| - GL_TEXTURE_BINDING_EXTERNAL_OES), result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(client_texture_id_, (uint32)result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTextureDefaults) {
|
| - InitState init;
|
| - init.extensions = "GL_OES_EGL_image_external";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
|
| -
|
| - TextureRef* texture_ref = GetTexture(client_texture_id_);
|
| - EXPECT_TRUE(texture_ref != NULL);
|
| - Texture* texture = texture_ref->texture();
|
| - EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES);
|
| - EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
|
| - EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
|
| - EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTextureParam) {
|
| - InitState init;
|
| - init.extensions = "GL_OES_EGL_image_external";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
|
| -
|
| - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_EXTERNAL_OES,
|
| - GL_TEXTURE_MIN_FILTER,
|
| - GL_NEAREST));
|
| - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_EXTERNAL_OES,
|
| - GL_TEXTURE_MIN_FILTER,
|
| - GL_LINEAR));
|
| - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_EXTERNAL_OES,
|
| - GL_TEXTURE_WRAP_S,
|
| - GL_CLAMP_TO_EDGE));
|
| - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_EXTERNAL_OES,
|
| - GL_TEXTURE_WRAP_T,
|
| - GL_CLAMP_TO_EDGE));
|
| - TexParameteri cmd;
|
| - cmd.Init(GL_TEXTURE_EXTERNAL_OES,
|
| - GL_TEXTURE_MIN_FILTER,
|
| - GL_NEAREST);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - cmd.Init(GL_TEXTURE_EXTERNAL_OES,
|
| - GL_TEXTURE_MIN_FILTER,
|
| - GL_LINEAR);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - cmd.Init(GL_TEXTURE_EXTERNAL_OES,
|
| - GL_TEXTURE_WRAP_S,
|
| - GL_CLAMP_TO_EDGE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - cmd.Init(GL_TEXTURE_EXTERNAL_OES,
|
| - GL_TEXTURE_WRAP_T,
|
| - GL_CLAMP_TO_EDGE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - TextureRef* texture_ref = GetTexture(client_texture_id_);
|
| - EXPECT_TRUE(texture_ref != NULL);
|
| - Texture* texture = texture_ref->texture();
|
| - EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES);
|
| - EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
|
| - EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
|
| - EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTextureParamInvalid) {
|
| - InitState init;
|
| - init.extensions = "GL_OES_EGL_image_external";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
|
| -
|
| - TexParameteri cmd;
|
| - cmd.Init(GL_TEXTURE_EXTERNAL_OES,
|
| - GL_TEXTURE_MIN_FILTER,
|
| - GL_NEAREST_MIPMAP_NEAREST);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -
|
| - cmd.Init(GL_TEXTURE_EXTERNAL_OES,
|
| - GL_TEXTURE_WRAP_S,
|
| - GL_REPEAT);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -
|
| - cmd.Init(GL_TEXTURE_EXTERNAL_OES,
|
| - GL_TEXTURE_WRAP_T,
|
| - GL_REPEAT);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -
|
| - TextureRef* texture_ref = GetTexture(client_texture_id_);
|
| - EXPECT_TRUE(texture_ref != NULL);
|
| - Texture* texture = texture_ref->texture();
|
| - EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES);
|
| - EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
|
| - EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
|
| - EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTexImage2DError) {
|
| - InitState init;
|
| - init.extensions = "GL_OES_EGL_image_external";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - GLenum target = GL_TEXTURE_EXTERNAL_OES;
|
| - GLint level = 0;
|
| - GLenum internal_format = GL_RGBA;
|
| - GLsizei width = 2;
|
| - GLsizei height = 4;
|
| - GLint border = 0;
|
| - GLenum format = GL_RGBA;
|
| - GLenum type = GL_UNSIGNED_BYTE;
|
| - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
|
| - ASSERT_TRUE(GetTexture(client_texture_id_) != NULL);
|
| - TexImage2D cmd;
|
| - cmd.Init(target, level, internal_format, width, height, border, format,
|
| - type, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -
|
| - // TexImage2D is not allowed with GL_TEXTURE_EXTERNAL_OES targets.
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, BindGeneratesResourceFalse) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - InitDecoder(init);
|
| -
|
| - BindTexture cmd1;
|
| - cmd1.Init(GL_TEXTURE_2D, kInvalidClientId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - BindBuffer cmd2;
|
| - cmd2.Init(GL_ARRAY_BUFFER, kInvalidClientId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - BindFramebuffer cmd3;
|
| - cmd3.Init(GL_FRAMEBUFFER, kInvalidClientId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd3));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - BindRenderbuffer cmd4;
|
| - cmd4.Init(GL_RENDERBUFFER, kInvalidClientId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd4));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, DefaultTextureZero) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - InitDecoder(init);
|
| -
|
| - BindTexture cmd1;
|
| - cmd1.Init(GL_TEXTURE_2D, 0);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - BindTexture cmd2;
|
| - cmd2.Init(GL_TEXTURE_CUBE_MAP, 0);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, DefaultTextureBGR) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - BindTexture cmd1;
|
| - cmd1.Init(GL_TEXTURE_2D, 0);
|
| - EXPECT_CALL(
|
| - *gl_, BindTexture(GL_TEXTURE_2D, TestHelper::kServiceDefaultTexture2dId));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - BindTexture cmd2;
|
| - cmd2.Init(GL_TEXTURE_CUBE_MAP, 0);
|
| - EXPECT_CALL(*gl_,
|
| - BindTexture(GL_TEXTURE_CUBE_MAP,
|
| - TestHelper::kServiceDefaultTextureCubemapId));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -// Test that default texture 0 is immutable.
|
| -TEST_F(GLES2DecoderManualInitTest, NoDefaultTexParameterf) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - InitDecoder(init);
|
| -
|
| - {
|
| - BindTexture cmd1;
|
| - cmd1.Init(GL_TEXTURE_2D, 0);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - TexParameterf cmd2;
|
| - cmd2.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - }
|
| -
|
| - {
|
| - BindTexture cmd1;
|
| - cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - TexParameterf cmd2;
|
| - cmd2.Init(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, NoDefaultTexParameteri) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - InitDecoder(init);
|
| -
|
| - {
|
| - BindTexture cmd1;
|
| - cmd1.Init(GL_TEXTURE_2D, 0);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - TexParameteri cmd2;
|
| - cmd2.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - }
|
| -
|
| - {
|
| - BindTexture cmd1;
|
| - cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - TexParameteri cmd2;
|
| - cmd2.Init(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, NoDefaultTexParameterfv) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - InitDecoder(init);
|
| -
|
| - {
|
| - BindTexture cmd1;
|
| - cmd1.Init(GL_TEXTURE_2D, 0);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - TexParameterfv cmd2;
|
| - cmd2.Init(GL_TEXTURE_2D,
|
| - GL_TEXTURE_MAG_FILTER,
|
| - shared_memory_id_,
|
| - shared_memory_offset_);
|
| - GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST;
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - }
|
| -
|
| - {
|
| - BindTexture cmd1;
|
| - cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - TexParameterfv cmd2;
|
| - cmd2.Init(GL_TEXTURE_CUBE_MAP,
|
| - GL_TEXTURE_MAG_FILTER,
|
| - shared_memory_id_,
|
| - shared_memory_offset_);
|
| - GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST;
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, NoDefaultTexParameteriv) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - InitDecoder(init);
|
| -
|
| - {
|
| - BindTexture cmd1;
|
| - cmd1.Init(GL_TEXTURE_2D, 0);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - TexParameteriv cmd2;
|
| - cmd2.Init(GL_TEXTURE_2D,
|
| - GL_TEXTURE_MAG_FILTER,
|
| - shared_memory_id_,
|
| - shared_memory_offset_);
|
| - GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST;
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - }
|
| -
|
| - {
|
| - BindTexture cmd1;
|
| - cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - TexParameteriv cmd2;
|
| - cmd2.Init(GL_TEXTURE_CUBE_MAP,
|
| - GL_TEXTURE_MAG_FILTER,
|
| - shared_memory_id_,
|
| - shared_memory_offset_);
|
| - GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST;
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, NoDefaultTexImage2D) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - InitDecoder(init);
|
| -
|
| - BindTexture cmd1;
|
| - cmd1.Init(GL_TEXTURE_2D, 0);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - TexImage2D cmd2;
|
| - cmd2.Init(GL_TEXTURE_2D,
|
| - 0,
|
| - GL_RGBA,
|
| - 2,
|
| - 2,
|
| - 0,
|
| - GL_RGBA,
|
| - GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId,
|
| - kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, NoDefaultTexSubImage2D) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - InitDecoder(init);
|
| -
|
| - BindTexture cmd1;
|
| - cmd1.Init(GL_TEXTURE_2D, 0);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - TexSubImage2D cmd2;
|
| - cmd2.Init(GL_TEXTURE_2D,
|
| - 0,
|
| - 1,
|
| - 1,
|
| - 1,
|
| - 1,
|
| - GL_RGBA,
|
| - GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId,
|
| - kSharedMemoryOffset,
|
| - GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleBindTexture) {
|
| - InitState init;
|
| - init.extensions = "GL_ARB_texture_rectangle";
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_RECTANGLE_ARB, kNewServiceId));
|
| - EXPECT_CALL(*gl_, GenTextures(1, _))
|
| - .WillOnce(SetArgumentPointee<1>(kNewServiceId));
|
| - BindTexture cmd;
|
| - cmd.Init(GL_TEXTURE_RECTANGLE_ARB, kNewClientId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - Texture* texture = GetTexture(kNewClientId)->texture();
|
| - EXPECT_TRUE(texture != NULL);
|
| - EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleGetBinding) {
|
| - InitState init;
|
| - init.extensions = "GL_ARB_texture_rectangle";
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindTexture(
|
| - GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - EXPECT_CALL(*gl_, GetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB,
|
| - result->GetData()))
|
| - .Times(0);
|
| - result->size = 0;
|
| - GetIntegerv cmd;
|
| - cmd.Init(GL_TEXTURE_BINDING_RECTANGLE_ARB,
|
| - shared_memory_id_,
|
| - shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(
|
| - GL_TEXTURE_BINDING_RECTANGLE_ARB), result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(client_texture_id_, (uint32)result->GetData()[0]);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleTextureDefaults) {
|
| - InitState init;
|
| - init.extensions = "GL_ARB_texture_rectangle";
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindTexture(
|
| - GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
|
| -
|
| - Texture* texture = GetTexture(client_texture_id_)->texture();
|
| - EXPECT_TRUE(texture != NULL);
|
| - EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB);
|
| - EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
|
| - EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
|
| - EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleTextureParam) {
|
| - InitState init;
|
| - init.extensions = "GL_ARB_texture_rectangle";
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - DoBindTexture(
|
| - GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
|
| -
|
| - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_RECTANGLE_ARB,
|
| - GL_TEXTURE_MIN_FILTER,
|
| - GL_NEAREST));
|
| - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_RECTANGLE_ARB,
|
| - GL_TEXTURE_MIN_FILTER,
|
| - GL_LINEAR));
|
| - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_RECTANGLE_ARB,
|
| - GL_TEXTURE_WRAP_S,
|
| - GL_CLAMP_TO_EDGE));
|
| - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_RECTANGLE_ARB,
|
| - GL_TEXTURE_WRAP_T,
|
| - GL_CLAMP_TO_EDGE));
|
| - TexParameteri cmd;
|
| - cmd.Init(GL_TEXTURE_RECTANGLE_ARB,
|
| - GL_TEXTURE_MIN_FILTER,
|
| - GL_NEAREST);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - cmd.Init(GL_TEXTURE_RECTANGLE_ARB,
|
| - GL_TEXTURE_MIN_FILTER,
|
| - GL_LINEAR);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - cmd.Init(GL_TEXTURE_RECTANGLE_ARB,
|
| - GL_TEXTURE_WRAP_S,
|
| - GL_CLAMP_TO_EDGE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - cmd.Init(GL_TEXTURE_RECTANGLE_ARB,
|
| - GL_TEXTURE_WRAP_T,
|
| - GL_CLAMP_TO_EDGE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - Texture* texture = GetTexture(client_texture_id_)->texture();
|
| - EXPECT_TRUE(texture != NULL);
|
| - EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB);
|
| - EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
|
| - EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
|
| - EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleTextureParamInvalid) {
|
| - InitState init;
|
| - init.extensions = "GL_ARB_texture_rectangle";
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - DoBindTexture(
|
| - GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
|
| -
|
| - TexParameteri cmd;
|
| - cmd.Init(GL_TEXTURE_RECTANGLE_ARB,
|
| - GL_TEXTURE_MIN_FILTER,
|
| - GL_NEAREST_MIPMAP_NEAREST);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -
|
| - cmd.Init(GL_TEXTURE_RECTANGLE_ARB,
|
| - GL_TEXTURE_WRAP_S,
|
| - GL_REPEAT);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -
|
| - cmd.Init(GL_TEXTURE_RECTANGLE_ARB,
|
| - GL_TEXTURE_WRAP_T,
|
| - GL_REPEAT);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -
|
| - Texture* texture = GetTexture(client_texture_id_)->texture();
|
| - EXPECT_TRUE(texture != NULL);
|
| - EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB);
|
| - EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
|
| - EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
|
| - EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleTexImage2DError) {
|
| - InitState init;
|
| - init.extensions = "GL_ARB_texture_rectangle";
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - GLenum target = GL_TEXTURE_RECTANGLE_ARB;
|
| - GLint level = 0;
|
| - GLenum internal_format = GL_RGBA;
|
| - GLsizei width = 2;
|
| - GLsizei height = 4;
|
| - GLint border = 0;
|
| - GLenum format = GL_RGBA;
|
| - GLenum type = GL_UNSIGNED_BYTE;
|
| - DoBindTexture(
|
| - GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
|
| - ASSERT_TRUE(GetTexture(client_texture_id_) != NULL);
|
| - TexImage2D cmd;
|
| - cmd.Init(target, level, internal_format, width, height, border, format,
|
| - type, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -
|
| - // TexImage2D is not allowed with GL_TEXTURE_RECTANGLE_ARB targets.
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, EnableFeatureCHROMIUMBadBucket) {
|
| - const uint32 kBadBucketId = 123;
|
| - EnableFeatureCHROMIUM cmd;
|
| - cmd.Init(kBadBucketId, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, RequestExtensionCHROMIUMBadBucket) {
|
| - const uint32 kBadBucketId = 123;
|
| - RequestExtensionCHROMIUM cmd;
|
| - cmd.Init(kBadBucketId);
|
| - EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, TexSubImage2DClearsAfterTexImage2DNULL) {
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - SetupClearTextureExpectations(
|
| - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D,
|
| - 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2);
|
| - EXPECT_CALL(*gl_, TexSubImage2D(
|
| - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - shared_memory_address_))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - TexSubImage2D cmd;
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - // Test if we call it again it does not clear.
|
| - EXPECT_CALL(*gl_, TexSubImage2D(
|
| - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - shared_memory_address_))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, TexSubImage2DDoesNotClearAfterTexImage2DNULLThenData) {
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_CALL(*gl_, TexSubImage2D(
|
| - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - shared_memory_address_))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - TexSubImage2D cmd;
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - // Test if we call it again it does not clear.
|
| - EXPECT_CALL(*gl_, TexSubImage2D(
|
| - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - shared_memory_address_))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(
|
| - GLES2DecoderManualInitTest,
|
| - TexSubImage2DDoesNotClearAfterTexImage2DNULLThenDataWithTexImage2DIsFaster) {
|
| - CommandLine command_line(0, NULL);
|
| - command_line.AppendSwitchASCII(
|
| - switches::kGpuDriverBugWorkarounds,
|
| - base::IntToString(gpu::TEXSUBIMAGE2D_FASTER_THAN_TEXIMAGE2D));
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoderWithCommandLine(init, &command_line);
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| -
|
| - {
|
| - // Uses texSubimage internally because the above workaround is active and
|
| - // the update is for the full size of the texture.
|
| - EXPECT_CALL(*gl_,
|
| - TexSubImage2D(
|
| - GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - cmds::TexImage2D cmd;
|
| - cmd.Init(GL_TEXTURE_2D,
|
| - 0,
|
| - GL_RGBA,
|
| - 2,
|
| - 2,
|
| - 0,
|
| - GL_RGBA,
|
| - GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId,
|
| - kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - }
|
| -
|
| - EXPECT_CALL(*gl_, TexSubImage2D(
|
| - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - shared_memory_address_))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - TexSubImage2D cmd;
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - // Test if we call it again it does not clear.
|
| - EXPECT_CALL(*gl_, TexSubImage2D(
|
| - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - shared_memory_address_))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, TexSubImage2DClearsAfterTexImage2DWithDataThenNULL) {
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - // Put in data (so it should be marked as cleared)
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - // Put in no data.
|
| - TexImage2D tex_cmd;
|
| - tex_cmd.Init(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
|
| - // It won't actually call TexImage2D, just mark it as uncleared.
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd));
|
| - // Next call to TexSubImage2d should clear.
|
| - SetupClearTextureExpectations(
|
| - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D,
|
| - 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2);
|
| - EXPECT_CALL(*gl_, TexSubImage2D(
|
| - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - shared_memory_address_))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - TexSubImage2D cmd;
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawArraysClearsAfterTexImage2DNULL) {
|
| - SetupAllNeededVertexBuffers();
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - // Create an uncleared texture with 2 levels.
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - DoTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - // Expect 2 levels will be cleared.
|
| - SetupClearTextureExpectations(
|
| - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D,
|
| - 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2);
|
| - SetupClearTextureExpectations(
|
| - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D,
|
| - 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 1, 1);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // But not again
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawElementsClearsAfterTexImage2DNULL) {
|
| - SetupAllNeededVertexBuffers();
|
| - SetupIndexBuffer();
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - // Create an uncleared texture with 2 levels.
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - DoTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - // Expect 2 levels will be cleared.
|
| - SetupClearTextureExpectations(
|
| - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D,
|
| - 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2);
|
| - SetupClearTextureExpectations(
|
| - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D,
|
| - 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 1, 1);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| -
|
| - EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount,
|
| - GL_UNSIGNED_SHORT,
|
| - BufferOffset(kValidIndexRangeStart * 2)))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawElements cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // But not again
|
| - EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount,
|
| - GL_UNSIGNED_SHORT,
|
| - BufferOffset(kValidIndexRangeStart * 2)))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawClearsAfterTexImage2DNULLInFBO) {
|
| - const GLuint kFBOClientTextureId = 4100;
|
| - const GLuint kFBOServiceTextureId = 4101;
|
| -
|
| - SetupAllNeededVertexBuffers();
|
| - // Register a texture id.
|
| - EXPECT_CALL(*gl_, GenTextures(_, _))
|
| - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
|
| - .RetiresOnSaturation();
|
| - GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
|
| -
|
| - // Setup "render to" texture.
|
| - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
|
| - DoBindFramebuffer(
|
| - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| - DoFramebufferTexture2D(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR);
|
| -
|
| - // Setup "render from" texture.
|
| - SetupTexture();
|
| -
|
| - SetupExpectationsForFramebufferClearing(
|
| - GL_FRAMEBUFFER, // target
|
| - GL_COLOR_BUFFER_BIT, // clear bits
|
| - 0, 0, 0, 0, // color
|
| - 0, // stencil
|
| - 1.0f, // depth
|
| - false); // scissor test
|
| -
|
| - SetupExpectationsForApplyingDirtyState(
|
| - false, // Framebuffer is RGB
|
| - false, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1111, // color bits
|
| - false, // depth mask
|
| - false, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // But not again.
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawWitFBOThatCantClearDoesNotDraw) {
|
| - const GLuint kFBOClientTextureId = 4100;
|
| - const GLuint kFBOServiceTextureId = 4101;
|
| -
|
| - // Register a texture id.
|
| - EXPECT_CALL(*gl_, GenTextures(_, _))
|
| - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
|
| - .RetiresOnSaturation();
|
| - GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
|
| -
|
| - // Setup "render to" texture.
|
| - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
|
| - DoBindFramebuffer(
|
| - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| - DoFramebufferTexture2D(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR);
|
| -
|
| - // Setup "render from" texture.
|
| - SetupTexture();
|
| -
|
| - EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
|
| - .WillOnce(Return(GL_FRAMEBUFFER_UNSUPPORTED))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, DrawArrays(_, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_FRAMEBUFFER_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, CopyTexImage2DMarksTextureAsCleared) {
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| -
|
| - TextureManager* manager = group().texture_manager();
|
| - TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
|
| - ASSERT_TRUE(texture_ref != NULL);
|
| - Texture* texture = texture_ref->texture();
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, CopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - CopyTexImage2D cmd;
|
| - cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -
|
| - EXPECT_TRUE(texture->SafeToRenderFrom());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, CopyTexSubImage2DClearsUnclearedTexture) {
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
|
| -
|
| - SetupClearTextureExpectations(
|
| - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D,
|
| - 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2);
|
| - EXPECT_CALL(*gl_, CopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - CopyTexSubImage2D cmd;
|
| - cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, CompressedImage2DMarksTextureAsCleared) {
|
| - InitState init;
|
| - init.extensions = "GL_EXT_texture_compression_s3tc";
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, CompressedTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0, 8, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - CompressedTexImage2D cmd;
|
| - cmd.Init(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0,
|
| - 8, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - TextureManager* manager = group().texture_manager();
|
| - TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
|
| - EXPECT_TRUE(texture_ref->texture()->SafeToRenderFrom());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, UnClearedAttachmentsGetClearedOnClear) {
|
| - const GLuint kFBOClientTextureId = 4100;
|
| - const GLuint kFBOServiceTextureId = 4101;
|
| -
|
| - // Register a texture id.
|
| - EXPECT_CALL(*gl_, GenTextures(_, _))
|
| - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
|
| - .RetiresOnSaturation();
|
| - GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
|
| -
|
| - // Setup "render to" texture.
|
| - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
|
| - DoBindFramebuffer(
|
| - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| - DoFramebufferTexture2D(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR);
|
| -
|
| - // Setup "render from" texture.
|
| - SetupTexture();
|
| -
|
| - SetupExpectationsForFramebufferClearing(
|
| - GL_FRAMEBUFFER, // target
|
| - GL_COLOR_BUFFER_BIT, // clear bits
|
| - 0, 0, 0, 0, // color
|
| - 0, // stencil
|
| - 1.0f, // depth
|
| - false); // scissor test
|
| - SetupExpectationsForApplyingDirtyState(
|
| - false, // Framebuffer is RGB
|
| - false, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1111, // color bits
|
| - false, // depth mask
|
| - false, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, Clear(GL_COLOR_BUFFER_BIT))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - Clear cmd;
|
| - cmd.Init(GL_COLOR_BUFFER_BIT);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, UnClearedAttachmentsGetClearedOnReadPixels) {
|
| - const GLuint kFBOClientTextureId = 4100;
|
| - const GLuint kFBOServiceTextureId = 4101;
|
| -
|
| - // Register a texture id.
|
| - EXPECT_CALL(*gl_, GenTextures(_, _))
|
| - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
|
| - .RetiresOnSaturation();
|
| - GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
|
| -
|
| - // Setup "render to" texture.
|
| - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
|
| - DoBindFramebuffer(
|
| - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| - DoFramebufferTexture2D(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR);
|
| -
|
| - // Setup "render from" texture.
|
| - SetupTexture();
|
| -
|
| - SetupExpectationsForFramebufferClearing(
|
| - GL_FRAMEBUFFER, // target
|
| - GL_COLOR_BUFFER_BIT, // clear bits
|
| - 0, 0, 0, 0, // color
|
| - 0, // stencil
|
| - 1.0f, // depth
|
| - false); // scissor test
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, ReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - typedef ReadPixels::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| - uint32 result_shm_id = kSharedMemoryId;
|
| - uint32 result_shm_offset = kSharedMemoryOffset;
|
| - uint32 pixels_shm_id = kSharedMemoryId;
|
| - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result);
|
| - ReadPixels cmd;
|
| - cmd.Init(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - pixels_shm_id, pixels_shm_offset,
|
| - result_shm_id, result_shm_offset,
|
| - false);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest,
|
| - UnClearedAttachmentsGetClearedOnReadPixelsAndDrawBufferGetsRestored) {
|
| - InitState init;
|
| - init.extensions = "GL_EXT_framebuffer_multisample";
|
| - init.gl_version = "2.1";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - const GLuint kFBOClientTextureId = 4100;
|
| - const GLuint kFBOServiceTextureId = 4101;
|
| -
|
| - // Register a texture id.
|
| - EXPECT_CALL(*gl_, GenTextures(_, _))
|
| - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
|
| - .RetiresOnSaturation();
|
| - GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
|
| -
|
| - // Setup "render from" texture.
|
| - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
|
| - DoBindFramebuffer(
|
| - GL_READ_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| - DoFramebufferTexture2D(
|
| - GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR);
|
| -
|
| - SetupExpectationsForFramebufferClearingMulti(
|
| - kServiceFramebufferId, // read framebuffer service id
|
| - 0, // backbuffer service id
|
| - GL_READ_FRAMEBUFFER, // target
|
| - GL_COLOR_BUFFER_BIT, // clear bits
|
| - 0, 0, 0, 0, // color
|
| - 0, // stencil
|
| - 1.0f, // depth
|
| - false); // scissor test
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, ReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - typedef ReadPixels::Result Result;
|
| - uint32 result_shm_id = kSharedMemoryId;
|
| - uint32 result_shm_offset = kSharedMemoryOffset;
|
| - uint32 pixels_shm_id = kSharedMemoryId;
|
| - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(Result);
|
| - ReadPixels cmd;
|
| - cmd.Init(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - pixels_shm_id, pixels_shm_offset,
|
| - result_shm_id, result_shm_offset,
|
| - false);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, DrawClearsAfterRenderbufferStorageInFBO) {
|
| - SetupTexture();
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - DoRenderbufferStorage(
|
| - GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 100, 50, GL_NO_ERROR);
|
| - DoFramebufferRenderbuffer(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR);
|
| -
|
| - SetupExpectationsForFramebufferClearing(
|
| - GL_FRAMEBUFFER, // target
|
| - GL_COLOR_BUFFER_BIT, // clear bits
|
| - 0, 0, 0, 0, // color
|
| - 0, // stencil
|
| - 1.0f, // depth
|
| - false); // scissor test
|
| -
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDirtyState(
|
| - false, // Framebuffer is RGB
|
| - false, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1111, // color bits
|
| - false, // depth mask
|
| - false, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, DrawArraysClearsAfterTexImage2DNULLCubemap) {
|
| - static const GLenum faces[] = {
|
| - GL_TEXTURE_CUBE_MAP_POSITIVE_X,
|
| - GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
|
| - GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
|
| - GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
|
| - GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
|
| - GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
|
| - };
|
| - SetupCubemapProgram();
|
| - DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId);
|
| - // Fill out all the faces for 2 levels, leave 2 uncleared.
|
| - for (int ii = 0; ii < 6; ++ii) {
|
| - GLenum face = faces[ii];
|
| - int32 shm_id =
|
| - (face == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) ? 0 : kSharedMemoryId;
|
| - uint32 shm_offset =
|
| - (face == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) ? 0 : kSharedMemoryOffset;
|
| - DoTexImage2D(face, 0, GL_RGBA, 2, 2, 0, GL_RGBA,
|
| - GL_UNSIGNED_BYTE, shm_id, shm_offset);
|
| - DoTexImage2D(face, 1, GL_RGBA, 1, 1, 0, GL_RGBA,
|
| - GL_UNSIGNED_BYTE, shm_id, shm_offset);
|
| - }
|
| - // Expect 2 levels will be cleared.
|
| - SetupClearTextureExpectations(
|
| - kServiceTextureId, kServiceTextureId, GL_TEXTURE_CUBE_MAP,
|
| - GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 2, 2);
|
| - SetupClearTextureExpectations(
|
| - kServiceTextureId, kServiceTextureId, GL_TEXTURE_CUBE_MAP,
|
| - GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 1, 1);
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, TextureUsageAngleExtNotEnabledByDefault) {
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| -
|
| - TexParameteri cmd;
|
| - cmd.Init(GL_TEXTURE_2D,
|
| - GL_TEXTURE_USAGE_ANGLE,
|
| - GL_FRAMEBUFFER_ATTACHMENT_ANGLE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest,
|
| - DrawClearsAfterRenderbuffersWithMultipleAttachments) {
|
| - const GLuint kFBOClientTextureId = 4100;
|
| - const GLuint kFBOServiceTextureId = 4101;
|
| -
|
| - // Register a texture id.
|
| - EXPECT_CALL(*gl_, GenTextures(_, _))
|
| - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
|
| - .RetiresOnSaturation();
|
| - GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
|
| -
|
| - // Setup "render to" texture.
|
| - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
|
| - DoBindFramebuffer(
|
| - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| - DoFramebufferTexture2D(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR);
|
| -
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - DoRenderbufferStorage(
|
| - GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT,
|
| - 1, 1, GL_NO_ERROR);
|
| - DoFramebufferRenderbuffer(
|
| - GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR);
|
| -
|
| - SetupTexture();
|
| - SetupExpectationsForFramebufferClearing(
|
| - GL_FRAMEBUFFER, // target
|
| - GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, // clear bits
|
| - 0, 0, 0, 0, // color
|
| - 0, // stencil
|
| - 1.0f, // depth
|
| - false); // scissor test
|
| -
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDirtyState(
|
| - false, // Framebuffer is RGB
|
| - true, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1111, // color bits
|
| - true, // depth mask
|
| - false, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, CopyTexImageWithInCompleteFBOFails) {
|
| - GLenum target = GL_TEXTURE_2D;
|
| - GLint level = 0;
|
| - GLenum internal_format = GL_RGBA;
|
| - GLsizei width = 2;
|
| - GLsizei height = 4;
|
| - GLint border = 0;
|
| - SetupTexture();
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - DoRenderbufferStorage(
|
| - GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 0, 0, GL_NO_ERROR);
|
| - DoFramebufferRenderbuffer(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR);
|
| -
|
| - EXPECT_CALL(*gl_, CopyTexImage2D(_, _, _, _, _, _, _, _))
|
| - .Times(0)
|
| - .RetiresOnSaturation();
|
| - CopyTexImage2D cmd;
|
| - cmd.Init(target, level, internal_format, 0, 0, width, height, border);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_FRAMEBUFFER_OPERATION, GetGLError());
|
| -}
|
| -
|
| -void GLES2DecoderWithShaderTest::CheckRenderbufferChangesMarkFBOAsNotComplete(
|
| - bool bound_fbo) {
|
| - FramebufferManager* framebuffer_manager = group().framebuffer_manager();
|
| - SetupTexture();
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - DoRenderbufferStorage(
|
| - GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 1, 1, GL_NO_ERROR);
|
| - DoFramebufferRenderbuffer(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR);
|
| -
|
| -
|
| - if (!bound_fbo) {
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0);
|
| - }
|
| -
|
| - Framebuffer* framebuffer =
|
| - framebuffer_manager->GetFramebuffer(client_framebuffer_id_);
|
| - ASSERT_TRUE(framebuffer != NULL);
|
| - framebuffer_manager->MarkAsComplete(framebuffer);
|
| - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer));
|
| -
|
| - // Test that renderbufferStorage marks fbo as not complete.
|
| - DoRenderbufferStorage(
|
| - GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 1, 1, GL_NO_ERROR);
|
| - EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer));
|
| - framebuffer_manager->MarkAsComplete(framebuffer);
|
| - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer));
|
| -
|
| - // Test deleting renderbuffer marks fbo as not complete.
|
| - DoDeleteRenderbuffer(client_renderbuffer_id_, kServiceRenderbufferId);
|
| - if (bound_fbo) {
|
| - EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer));
|
| - } else {
|
| - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer));
|
| - }
|
| - // Cleanup
|
| - DoDeleteFramebuffer(
|
| - client_framebuffer_id_, kServiceFramebufferId,
|
| - bound_fbo, GL_FRAMEBUFFER, 0,
|
| - bound_fbo, GL_FRAMEBUFFER, 0);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest,
|
| - RenderbufferChangesMarkFBOAsNotCompleteBoundFBO) {
|
| - CheckRenderbufferChangesMarkFBOAsNotComplete(true);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest,
|
| - RenderbufferChangesMarkFBOAsNotCompleteUnboundFBO) {
|
| - CheckRenderbufferChangesMarkFBOAsNotComplete(false);
|
| -}
|
| -
|
| -void GLES2DecoderWithShaderTest::CheckTextureChangesMarkFBOAsNotComplete(
|
| - bool bound_fbo) {
|
| - FramebufferManager* framebuffer_manager = group().framebuffer_manager();
|
| - const GLuint kFBOClientTextureId = 4100;
|
| - const GLuint kFBOServiceTextureId = 4101;
|
| -
|
| - // Register a texture id.
|
| - EXPECT_CALL(*gl_, GenTextures(_, _))
|
| - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
|
| - .RetiresOnSaturation();
|
| - GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
|
| -
|
| - SetupTexture();
|
| -
|
| - // Setup "render to" texture.
|
| - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
|
| - DoBindFramebuffer(
|
| - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| - DoFramebufferTexture2D(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR);
|
| -
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - DoRenderbufferStorage(
|
| - GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT,
|
| - 1, 1, GL_NO_ERROR);
|
| - DoFramebufferRenderbuffer(
|
| - GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR);
|
| -
|
| - if (!bound_fbo) {
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0);
|
| - }
|
| -
|
| - Framebuffer* framebuffer =
|
| - framebuffer_manager->GetFramebuffer(client_framebuffer_id_);
|
| - ASSERT_TRUE(framebuffer != NULL);
|
| - framebuffer_manager->MarkAsComplete(framebuffer);
|
| - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer));
|
| -
|
| - // Test TexImage2D marks fbo as not complete.
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0, 0);
|
| - EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer));
|
| - framebuffer_manager->MarkAsComplete(framebuffer);
|
| - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer));
|
| -
|
| - // Test CopyImage2D marks fbo as not complete.
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, CopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, 1, 0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - CopyTexImage2D cmd;
|
| - cmd.Init(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, 1, 0);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer));
|
| -
|
| - // Test deleting texture marks fbo as not complete.
|
| - framebuffer_manager->MarkAsComplete(framebuffer);
|
| - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer));
|
| - DoDeleteTexture(kFBOClientTextureId, kFBOServiceTextureId);
|
| -
|
| - if (bound_fbo) {
|
| - EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer));
|
| - } else {
|
| - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer));
|
| - }
|
| - // Cleanup
|
| - DoDeleteFramebuffer(
|
| - client_framebuffer_id_, kServiceFramebufferId,
|
| - bound_fbo, GL_FRAMEBUFFER, 0,
|
| - bound_fbo, GL_FRAMEBUFFER, 0);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, TextureChangesMarkFBOAsNotCompleteBoundFBO) {
|
| - CheckTextureChangesMarkFBOAsNotComplete(true);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest,
|
| - TextureChangesMarkFBOAsNotCompleteUnboundFBO) {
|
| - CheckTextureChangesMarkFBOAsNotComplete(false);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest,
|
| - DrawingWithFBOTwiceChecksForFBOCompleteOnce) {
|
| - const GLuint kFBOClientTextureId = 4100;
|
| - const GLuint kFBOServiceTextureId = 4101;
|
| -
|
| - SetupAllNeededVertexBuffers();
|
| -
|
| - // Register a texture id.
|
| - EXPECT_CALL(*gl_, GenTextures(_, _))
|
| - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
|
| - .RetiresOnSaturation();
|
| - GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
|
| -
|
| - // Setup "render to" texture that is cleared.
|
| - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - DoBindFramebuffer(
|
| - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| - DoFramebufferTexture2D(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR);
|
| -
|
| - // Setup "render from" texture.
|
| - SetupTexture();
|
| -
|
| - // Make sure we check for framebuffer complete.
|
| - EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
|
| - .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
|
| - .RetiresOnSaturation();
|
| -
|
| - SetupExpectationsForApplyingDirtyState(
|
| - false, // Framebuffer is RGB
|
| - false, // Framebuffer has depth
|
| - false, // Framebuffer has stencil
|
| - 0x1111, // color bits
|
| - false, // depth mask
|
| - false, // depth enabled
|
| - 0, // front stencil mask
|
| - 0, // back stencil mask
|
| - false, // stencil enabled
|
| - false, // cull_face_enabled
|
| - false, // scissor_test_enabled
|
| - false); // blend_enabled
|
| -
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // But not again.
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, BeginQueryEXTDisabled) {
|
| - // Test something fails if off.
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXT) {
|
| - InitState init;
|
| - init.extensions = "GL_EXT_occlusion_query_boolean";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.has_alpha = true;
|
| - init.request_alpha = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - // Test end fails if no begin.
|
| - EndQueryEXT end_cmd;
|
| - end_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - BeginQueryEXT begin_cmd;
|
| -
|
| - // Test id = 0 fails.
|
| - begin_cmd.Init(
|
| - GL_ANY_SAMPLES_PASSED_EXT, 0, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - GenHelper<GenQueriesEXTImmediate>(kNewClientId);
|
| -
|
| - // Test valid parameters work.
|
| - EXPECT_CALL(*gl_, GenQueriesARB(1, _))
|
| - .WillOnce(SetArgumentPointee<1>(kNewServiceId))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kNewServiceId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - // Query object should not be created untill BeginQueriesEXT.
|
| - QueryManager* query_manager = decoder_->GetQueryManager();
|
| - ASSERT_TRUE(query_manager != NULL);
|
| - QueryManager::Query* query = query_manager->GetQuery(kNewClientId);
|
| - EXPECT_TRUE(query == NULL);
|
| -
|
| - // BeginQueryEXT should fail if id is not generated from GenQueriesEXT.
|
| - begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT,
|
| - kInvalidClientId,
|
| - kSharedMemoryId,
|
| - kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - begin_cmd.Init(
|
| - GL_ANY_SAMPLES_PASSED_EXT, kNewClientId,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // After BeginQueriesEXT id name should have query object associated with it.
|
| - query = query_manager->GetQuery(kNewClientId);
|
| - ASSERT_TRUE(query != NULL);
|
| - EXPECT_FALSE(query->pending());
|
| -
|
| - // Test trying begin again fails
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - // Test end fails with different target
|
| - end_cmd.Init(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - // Test end succeeds
|
| - EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - end_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_TRUE(query->pending());
|
| -
|
| - EXPECT_CALL(*gl_, DeleteQueriesARB(1, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -}
|
| -
|
| -struct QueryType {
|
| - GLenum type;
|
| - bool is_gl;
|
| -};
|
| -
|
| -const QueryType kQueryTypes[] = {
|
| - { GL_COMMANDS_ISSUED_CHROMIUM, false },
|
| - { GL_LATENCY_QUERY_CHROMIUM, false },
|
| - { GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, false },
|
| - { GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, false },
|
| - { GL_GET_ERROR_QUERY_CHROMIUM, false },
|
| - { GL_COMMANDS_COMPLETED_CHROMIUM, false },
|
| - { GL_ANY_SAMPLES_PASSED_EXT, true },
|
| -};
|
| -
|
| -static void CheckBeginEndQueryBadMemoryFails(
|
| - GLES2DecoderTestBase* test,
|
| - GLuint client_id,
|
| - GLuint service_id,
|
| - const QueryType& query_type,
|
| - int32 shm_id,
|
| - uint32 shm_offset) {
|
| - // We need to reset the decoder on each iteration, because we lose the
|
| - // context every time.
|
| - GLES2DecoderTestBase::InitState init;
|
| - init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.has_alpha = true;
|
| - init.request_alpha = true;
|
| - init.bind_generates_resource = true;
|
| - test->InitDecoder(init);
|
| - ::testing::StrictMock< ::gfx::MockGLInterface>* gl = test->GetGLMock();
|
| -
|
| - BeginQueryEXT begin_cmd;
|
| -
|
| - test->GenHelper<GenQueriesEXTImmediate>(client_id);
|
| -
|
| - if (query_type.is_gl) {
|
| - EXPECT_CALL(*gl, GenQueriesARB(1, _))
|
| - .WillOnce(SetArgumentPointee<1>(service_id))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl, BeginQueryARB(query_type.type, service_id))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - }
|
| -
|
| - // Test bad shared memory fails
|
| - begin_cmd.Init(query_type.type, client_id, shm_id, shm_offset);
|
| - error::Error error1 = test->ExecuteCmd(begin_cmd);
|
| -
|
| - if (query_type.is_gl) {
|
| - EXPECT_CALL(*gl, EndQueryARB(query_type.type))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - }
|
| - if (query_type.type == GL_GET_ERROR_QUERY_CHROMIUM) {
|
| - EXPECT_CALL(*gl, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - }
|
| - GLsync kGlSync = reinterpret_cast<GLsync>(0xdeadbeef);
|
| - if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) {
|
| - EXPECT_CALL(*gl, Flush()).RetiresOnSaturation();
|
| - EXPECT_CALL(*gl, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0))
|
| - .WillOnce(Return(kGlSync))
|
| - .RetiresOnSaturation();
|
| - }
|
| -
|
| - EndQueryEXT end_cmd;
|
| - end_cmd.Init(query_type.type, 1);
|
| - error::Error error2 = test->ExecuteCmd(end_cmd);
|
| -
|
| - if (query_type.is_gl) {
|
| - EXPECT_CALL(*gl,
|
| - GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
|
| - .WillOnce(SetArgumentPointee<2>(1))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl,
|
| - GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_EXT, _))
|
| - .WillOnce(SetArgumentPointee<2>(1))
|
| - .RetiresOnSaturation();
|
| - }
|
| - if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) {
|
| - EXPECT_CALL(*gl, ClientWaitSync(kGlSync, _, _))
|
| - .WillOnce(Return(GL_ALREADY_SIGNALED))
|
| - .RetiresOnSaturation();
|
| - }
|
| -
|
| - QueryManager* query_manager = test->GetDecoder()->GetQueryManager();
|
| - ASSERT_TRUE(query_manager != NULL);
|
| - bool process_success = query_manager->ProcessPendingQueries();
|
| -
|
| - EXPECT_TRUE(error1 != error::kNoError ||
|
| - error2 != error::kNoError ||
|
| - !process_success);
|
| -
|
| - if (query_type.is_gl) {
|
| - EXPECT_CALL(*gl, DeleteQueriesARB(1, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - }
|
| - if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM)
|
| - EXPECT_CALL(*gl, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation();
|
| - test->ResetDecoder();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryIdFails) {
|
| - for (size_t i = 0; i < arraysize(kQueryTypes); ++i) {
|
| - CheckBeginEndQueryBadMemoryFails(
|
| - this, kNewClientId, kNewServiceId,
|
| - kQueryTypes[i],
|
| - kInvalidSharedMemoryId, kSharedMemoryOffset);
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryOffsetFails) {
|
| - for (size_t i = 0; i < arraysize(kQueryTypes); ++i) {
|
| - // Out-of-bounds.
|
| - CheckBeginEndQueryBadMemoryFails(
|
| - this, kNewClientId, kNewServiceId,
|
| - kQueryTypes[i],
|
| - kSharedMemoryId, kInvalidSharedMemoryOffset);
|
| - // Overflow.
|
| - CheckBeginEndQueryBadMemoryFails(
|
| - this, kNewClientId, kNewServiceId,
|
| - kQueryTypes[i],
|
| - kSharedMemoryId, 0xfffffffcu);
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, BeginEndQueryEXTCommandsIssuedCHROMIUM) {
|
| - BeginQueryEXT begin_cmd;
|
| -
|
| - GenHelper<GenQueriesEXTImmediate>(kNewClientId);
|
| -
|
| - // Test valid parameters work.
|
| - begin_cmd.Init(
|
| - GL_COMMANDS_ISSUED_CHROMIUM, kNewClientId,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - QueryManager* query_manager = decoder_->GetQueryManager();
|
| - ASSERT_TRUE(query_manager != NULL);
|
| - QueryManager::Query* query = query_manager->GetQuery(kNewClientId);
|
| - ASSERT_TRUE(query != NULL);
|
| - EXPECT_FALSE(query->pending());
|
| -
|
| - // Test end succeeds
|
| - EndQueryEXT end_cmd;
|
| - end_cmd.Init(GL_COMMANDS_ISSUED_CHROMIUM, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_FALSE(query->pending());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, BeginEndQueryEXTGetErrorQueryCHROMIUM) {
|
| - BeginQueryEXT begin_cmd;
|
| -
|
| - GenHelper<GenQueriesEXTImmediate>(kNewClientId);
|
| -
|
| - // Test valid parameters work.
|
| - begin_cmd.Init(
|
| - GL_GET_ERROR_QUERY_CHROMIUM, kNewClientId,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - QueryManager* query_manager = decoder_->GetQueryManager();
|
| - ASSERT_TRUE(query_manager != NULL);
|
| - QueryManager::Query* query = query_manager->GetQuery(kNewClientId);
|
| - ASSERT_TRUE(query != NULL);
|
| - EXPECT_FALSE(query->pending());
|
| -
|
| - // Test end succeeds
|
| - QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_);
|
| -
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_INVALID_VALUE))
|
| - .RetiresOnSaturation();
|
| -
|
| - EndQueryEXT end_cmd;
|
| - end_cmd.Init(GL_GET_ERROR_QUERY_CHROMIUM, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_FALSE(query->pending());
|
| - EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE),
|
| - static_cast<GLenum>(sync->result));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTCommandsCompletedCHROMIUM) {
|
| - InitState init;
|
| - init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.has_alpha = true;
|
| - init.request_alpha = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - GenHelper<GenQueriesEXTImmediate>(kNewClientId);
|
| -
|
| - BeginQueryEXT begin_cmd;
|
| - begin_cmd.Init(GL_COMMANDS_COMPLETED_CHROMIUM,
|
| - kNewClientId,
|
| - kSharedMemoryId,
|
| - kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - QueryManager* query_manager = decoder_->GetQueryManager();
|
| - ASSERT_TRUE(query_manager != NULL);
|
| - QueryManager::Query* query = query_manager->GetQuery(kNewClientId);
|
| - ASSERT_TRUE(query != NULL);
|
| - EXPECT_FALSE(query->pending());
|
| -
|
| - GLsync kGlSync = reinterpret_cast<GLsync>(0xdeadbeef);
|
| - EXPECT_CALL(*gl_, Flush()).RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0))
|
| - .WillOnce(Return(kGlSync))
|
| - .RetiresOnSaturation();
|
| -
|
| - EndQueryEXT end_cmd;
|
| - end_cmd.Init(GL_COMMANDS_COMPLETED_CHROMIUM, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_TRUE(query->pending());
|
| -
|
| - EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _))
|
| - .WillOnce(Return(GL_TIMEOUT_EXPIRED))
|
| - .RetiresOnSaturation();
|
| - bool process_success = query_manager->ProcessPendingQueries();
|
| -
|
| - EXPECT_TRUE(process_success);
|
| - EXPECT_TRUE(query->pending());
|
| -
|
| - EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _))
|
| - .WillOnce(Return(GL_ALREADY_SIGNALED))
|
| - .RetiresOnSaturation();
|
| - process_success = query_manager->ProcessPendingQueries();
|
| -
|
| - EXPECT_TRUE(process_success);
|
| - EXPECT_FALSE(query->pending());
|
| - QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_);
|
| - EXPECT_EQ(static_cast<GLenum>(0), static_cast<GLenum>(sync->result));
|
| -
|
| - EXPECT_CALL(*gl_, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation();
|
| - ResetDecoder();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, ProduceAndConsumeTextureCHROMIUM) {
|
| - Mailbox mailbox = Mailbox::Generate();
|
| -
|
| - memcpy(shared_memory_address_, mailbox.name, sizeof(mailbox.name));
|
| -
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - DoTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - TextureRef* texture_ref = group().texture_manager()->GetTexture(
|
| - client_texture_id_);
|
| - ASSERT_TRUE(texture_ref != NULL);
|
| - Texture* texture = texture_ref->texture();
|
| - EXPECT_EQ(kServiceTextureId, texture->service_id());
|
| -
|
| - ProduceTextureCHROMIUM produce_cmd;
|
| - produce_cmd.Init(GL_TEXTURE_2D, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(produce_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Texture didn't change.
|
| - GLsizei width;
|
| - GLsizei height;
|
| - GLenum type;
|
| - GLenum internal_format;
|
| -
|
| - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
|
| - EXPECT_EQ(3, width);
|
| - EXPECT_EQ(1, height);
|
| - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
|
| - EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
|
| - EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
|
| -
|
| - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
|
| - EXPECT_EQ(2, width);
|
| - EXPECT_EQ(4, height);
|
| - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format));
|
| - EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
|
| - EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
|
| -
|
| - // Service ID has not changed.
|
| - EXPECT_EQ(kServiceTextureId, texture->service_id());
|
| -
|
| - // Create new texture for consume.
|
| - EXPECT_CALL(*gl_, GenTextures(_, _))
|
| - .WillOnce(SetArgumentPointee<1>(kNewServiceId))
|
| - .RetiresOnSaturation();
|
| - DoBindTexture(GL_TEXTURE_2D, kNewClientId, kNewServiceId);
|
| -
|
| - // Assigns and binds original service size texture ID.
|
| - EXPECT_CALL(*gl_, DeleteTextures(1, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - memcpy(shared_memory_address_, mailbox.name, sizeof(mailbox.name));
|
| - ConsumeTextureCHROMIUM consume_cmd;
|
| - consume_cmd.Init(GL_TEXTURE_2D, kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(consume_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Texture is redefined.
|
| - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
|
| - EXPECT_EQ(3, width);
|
| - EXPECT_EQ(1, height);
|
| - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
|
| - EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
|
| - EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
|
| -
|
| - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
|
| - EXPECT_EQ(2, width);
|
| - EXPECT_EQ(4, height);
|
| - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format));
|
| - EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
|
| - EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
|
| -
|
| - // Service ID is restored.
|
| - EXPECT_EQ(kServiceTextureId, texture->service_id());
|
| -}
|
| -
|
| -
|
| -TEST_F(GLES2DecoderTest, CanChangeSurface) {
|
| - scoped_refptr<GLSurfaceMock> other_surface(new GLSurfaceMock);
|
| - EXPECT_CALL(*other_surface.get(), GetBackingFrameBufferObject()).
|
| - WillOnce(Return(7));
|
| - EXPECT_CALL(*gl_, BindFramebufferEXT(GL_FRAMEBUFFER_EXT, 7));
|
| -
|
| - decoder_->SetSurface(other_surface);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, IsEnabledReturnsCachedValue) {
|
| - // NOTE: There are no expectations because no GL functions should be
|
| - // called for DEPTH_TEST or STENCIL_TEST
|
| - static const GLenum kStates[] = {
|
| - GL_DEPTH_TEST,
|
| - GL_STENCIL_TEST,
|
| - };
|
| - for (size_t ii = 0; ii < arraysize(kStates); ++ii) {
|
| - Enable enable_cmd;
|
| - GLenum state = kStates[ii];
|
| - enable_cmd.Init(state);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(enable_cmd));
|
| - IsEnabled::Result* result =
|
| - static_cast<IsEnabled::Result*>(shared_memory_address_);
|
| - IsEnabled is_enabled_cmd;
|
| - is_enabled_cmd.Init(state, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(is_enabled_cmd));
|
| - EXPECT_NE(0u, *result);
|
| - Disable disable_cmd;
|
| - disable_cmd.Init(state);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(disable_cmd));
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(is_enabled_cmd));
|
| - EXPECT_EQ(0u, *result);
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, DepthTextureBadArgs) {
|
| - InitState init;
|
| - init.extensions = "GL_ANGLE_depth_texture";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.has_depth = true;
|
| - init.has_stencil = true;
|
| - init.request_depth = true;
|
| - init.request_stencil = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - // Check trying to upload data fails.
|
| - TexImage2D tex_cmd;
|
| - tex_cmd.Init(
|
| - GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,
|
| - 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - // Try level > 0.
|
| - tex_cmd.Init(
|
| - GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT,
|
| - 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0, 0);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - // Make a 1 pixel depth texture.
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,
|
| - 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0, 0);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // Check that trying to update it fails.
|
| - TexSubImage2D tex_sub_cmd;
|
| - tex_sub_cmd.Init(
|
| - GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(tex_sub_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - // Check that trying to CopyTexImage2D fails
|
| - CopyTexImage2D copy_tex_cmd;
|
| - copy_tex_cmd.Init(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, 1, 1, 0);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(copy_tex_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -
|
| - // Check that trying to CopyTexSubImage2D fails
|
| - CopyTexSubImage2D copy_sub_cmd;
|
| - copy_sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(copy_sub_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, GenerateMipmapDepthTexture) {
|
| - InitState init;
|
| - init.extensions = "GL_ANGLE_depth_texture";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.has_depth = true;
|
| - init.has_stencil = true;
|
| - init.request_depth = true;
|
| - init.request_stencil = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,
|
| - 2, 2, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
|
| - 0, 0);
|
| - GenerateMipmap cmd;
|
| - cmd.Init(GL_TEXTURE_2D);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, DrawClearsDepthTexture) {
|
| - InitState init;
|
| - init.extensions = "GL_ANGLE_depth_texture";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.has_alpha = true;
|
| - init.has_depth = true;
|
| - init.request_alpha = true;
|
| - init.request_depth = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - SetupDefaultProgram();
|
| - SetupAllNeededVertexBuffers();
|
| - const GLenum attachment = GL_DEPTH_ATTACHMENT;
|
| - const GLenum target = GL_TEXTURE_2D;
|
| - const GLint level = 0;
|
| - DoBindTexture(target, client_texture_id_, kServiceTextureId);
|
| -
|
| - // Create a depth texture.
|
| - DoTexImage2D(target, level, GL_DEPTH_COMPONENT, 1, 1, 0,
|
| - GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0, 0);
|
| -
|
| - EXPECT_CALL(*gl_, GenFramebuffersEXT(1, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - EXPECT_CALL(*gl_, FramebufferTexture2DEXT(
|
| - GL_DRAW_FRAMEBUFFER_EXT, attachment, target, kServiceTextureId, level))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT))
|
| - .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
|
| - .RetiresOnSaturation();
|
| -
|
| - EXPECT_CALL(*gl_, ClearStencil(0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, StencilMask(-1))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, ClearDepth(1.0f))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, DepthMask(true))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, Disable(GL_SCISSOR_TEST))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - EXPECT_CALL(*gl_, Clear(GL_DEPTH_BUFFER_BIT))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - SetupExpectationsForRestoreClearState(
|
| - 0.0f, 0.0f, 0.0f, 0.0f, 0, 1.0f, false);
|
| -
|
| - EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| -
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, BindUniformLocationCHROMIUM) {
|
| - const GLint kLocation = 2;
|
| - const char* kName = "testing";
|
| - const uint32 kNameSize = strlen(kName);
|
| - const char* kBadName1 = "gl_testing";
|
| - const uint32 kBadName1Size = strlen(kBadName1);
|
| - const char* kBadName2 = "testing[1]";
|
| - const uint32 kBadName2Size = strlen(kBadName2);
|
| - memcpy(shared_memory_address_, kName, kNameSize);
|
| - BindUniformLocationCHROMIUM cmd;
|
| - cmd.Init(client_program_id_, kLocation, kSharedMemoryId, kSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - // check negative location
|
| - memcpy(shared_memory_address_, kName, kNameSize);
|
| - cmd.Init(client_program_id_, -1, kSharedMemoryId, kSharedMemoryOffset,
|
| - kNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - // check highest location
|
| - memcpy(shared_memory_address_, kName, kNameSize);
|
| - GLint kMaxLocation =
|
| - (kMaxFragmentUniformVectors + kMaxVertexUniformVectors) * 4 - 1;
|
| - cmd.Init(client_program_id_, kMaxLocation, kSharedMemoryId,
|
| - kSharedMemoryOffset, kNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - // check too high location
|
| - memcpy(shared_memory_address_, kName, kNameSize);
|
| - cmd.Init(client_program_id_, kMaxLocation + 1, kSharedMemoryId,
|
| - kSharedMemoryOffset, kNameSize);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| - // check bad name "gl_..."
|
| - memcpy(shared_memory_address_, kBadName1, kBadName1Size);
|
| - cmd.Init(client_program_id_, kLocation, kSharedMemoryId, kSharedMemoryOffset,
|
| - kBadName1Size);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - // check bad name "name[1]" non zero
|
| - memcpy(shared_memory_address_, kBadName2, kBadName2Size);
|
| - cmd.Init(client_program_id_, kLocation, kSharedMemoryId, kSharedMemoryOffset,
|
| - kBadName2Size);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| -}
|
| -
|
| -class GLES2DecoderVertexArraysOESTest : public GLES2DecoderWithShaderTest {
|
| - public:
|
| - GLES2DecoderVertexArraysOESTest() { }
|
| -
|
| - bool vertex_array_deleted_manually_;
|
| -
|
| - virtual void SetUp() {
|
| - InitState init;
|
| - init.extensions = "GL_OES_vertex_array_object";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - SetupDefaultProgram();
|
| -
|
| - AddExpectationsForGenVertexArraysOES();
|
| - GenHelper<GenVertexArraysOESImmediate>(client_vertexarray_id_);
|
| -
|
| - vertex_array_deleted_manually_ = false;
|
| - }
|
| -
|
| - virtual void TearDown() {
|
| - // This should only be set if the test handled deletion of the vertex array
|
| - // itself. Necessary because vertex_array_objects are not sharable, and thus
|
| - // not managed in the ContextGroup, meaning they will be destroyed during
|
| - // test tear down
|
| - if (!vertex_array_deleted_manually_) {
|
| - AddExpectationsForDeleteVertexArraysOES();
|
| - }
|
| -
|
| - GLES2DecoderWithShaderTest::TearDown();
|
| - }
|
| -
|
| - void GenVertexArraysOESValidArgs() {
|
| - AddExpectationsForGenVertexArraysOES();
|
| - GetSharedMemoryAs<GLuint*>()[0] = kNewClientId;
|
| - GenVertexArraysOES cmd;
|
| - cmd.Init(1, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_TRUE(GetVertexArrayInfo(kNewClientId) != NULL);
|
| - AddExpectationsForDeleteVertexArraysOES();
|
| - }
|
| -
|
| - void GenVertexArraysOESInvalidArgs() {
|
| - EXPECT_CALL(*gl_, GenVertexArraysOES(_, _)).Times(0);
|
| - GetSharedMemoryAs<GLuint*>()[0] = client_vertexarray_id_;
|
| - GenVertexArraysOES cmd;
|
| - cmd.Init(1, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd));
|
| - }
|
| -
|
| - void GenVertexArraysOESImmediateValidArgs() {
|
| - AddExpectationsForGenVertexArraysOES();
|
| - GenVertexArraysOESImmediate* cmd =
|
| - GetImmediateAs<GenVertexArraysOESImmediate>();
|
| - GLuint temp = kNewClientId;
|
| - cmd->Init(1, &temp);
|
| - EXPECT_EQ(error::kNoError,
|
| - ExecuteImmediateCmd(*cmd, sizeof(temp)));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_TRUE(GetVertexArrayInfo(kNewClientId) != NULL);
|
| - AddExpectationsForDeleteVertexArraysOES();
|
| - }
|
| -
|
| - void GenVertexArraysOESImmediateInvalidArgs() {
|
| - EXPECT_CALL(*gl_, GenVertexArraysOES(_, _)).Times(0);
|
| - GenVertexArraysOESImmediate* cmd =
|
| - GetImmediateAs<GenVertexArraysOESImmediate>();
|
| - cmd->Init(1, &client_vertexarray_id_);
|
| - EXPECT_EQ(error::kInvalidArguments,
|
| - ExecuteImmediateCmd(*cmd, sizeof(&client_vertexarray_id_)));
|
| - }
|
| -
|
| - void DeleteVertexArraysOESValidArgs() {
|
| - AddExpectationsForDeleteVertexArraysOES();
|
| - GetSharedMemoryAs<GLuint*>()[0] = client_vertexarray_id_;
|
| - DeleteVertexArraysOES cmd;
|
| - cmd.Init(1, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_TRUE(
|
| - GetVertexArrayInfo(client_vertexarray_id_) == NULL);
|
| - vertex_array_deleted_manually_ = true;
|
| - }
|
| -
|
| - void DeleteVertexArraysOESInvalidArgs() {
|
| - GetSharedMemoryAs<GLuint*>()[0] = kInvalidClientId;
|
| - DeleteVertexArraysOES cmd;
|
| - cmd.Init(1, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - }
|
| -
|
| - void DeleteVertexArraysOESImmediateValidArgs() {
|
| - AddExpectationsForDeleteVertexArraysOES();
|
| - DeleteVertexArraysOESImmediate& cmd =
|
| - *GetImmediateAs<DeleteVertexArraysOESImmediate>();
|
| - cmd.Init(1, &client_vertexarray_id_);
|
| - EXPECT_EQ(error::kNoError,
|
| - ExecuteImmediateCmd(cmd, sizeof(client_vertexarray_id_)));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_TRUE(
|
| - GetVertexArrayInfo(client_vertexarray_id_) == NULL);
|
| - vertex_array_deleted_manually_ = true;
|
| - }
|
| -
|
| - void DeleteVertexArraysOESImmediateInvalidArgs() {
|
| - DeleteVertexArraysOESImmediate& cmd =
|
| - *GetImmediateAs<DeleteVertexArraysOESImmediate>();
|
| - GLuint temp = kInvalidClientId;
|
| - cmd.Init(1, &temp);
|
| - EXPECT_EQ(error::kNoError,
|
| - ExecuteImmediateCmd(cmd, sizeof(temp)));
|
| - }
|
| -
|
| - void DeleteBoundVertexArraysOESImmediateValidArgs() {
|
| - BindVertexArrayOESValidArgs();
|
| -
|
| - AddExpectationsForDeleteBoundVertexArraysOES();
|
| - DeleteVertexArraysOESImmediate& cmd =
|
| - *GetImmediateAs<DeleteVertexArraysOESImmediate>();
|
| - cmd.Init(1, &client_vertexarray_id_);
|
| - EXPECT_EQ(error::kNoError,
|
| - ExecuteImmediateCmd(cmd, sizeof(client_vertexarray_id_)));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_TRUE(GetVertexArrayInfo(client_vertexarray_id_) == NULL);
|
| - vertex_array_deleted_manually_ = true;
|
| - }
|
| -
|
| - void IsVertexArrayOESValidArgs() {
|
| - IsVertexArrayOES cmd;
|
| - cmd.Init(client_vertexarray_id_, shared_memory_id_, shared_memory_offset_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - }
|
| -
|
| - void IsVertexArrayOESInvalidArgsBadSharedMemoryId() {
|
| - IsVertexArrayOES cmd;
|
| - cmd.Init(
|
| - client_vertexarray_id_, kInvalidSharedMemoryId, shared_memory_offset_);
|
| - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| - cmd.Init(
|
| - client_vertexarray_id_, shared_memory_id_, kInvalidSharedMemoryOffset);
|
| - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
|
| - }
|
| -
|
| - void BindVertexArrayOESValidArgs() {
|
| - AddExpectationsForBindVertexArrayOES();
|
| - BindVertexArrayOES cmd;
|
| - cmd.Init(client_vertexarray_id_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - }
|
| -
|
| - void BindVertexArrayOESValidArgsNewId() {
|
| - BindVertexArrayOES cmd;
|
| - cmd.Init(kNewClientId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - }
|
| -};
|
| -
|
| -class GLES2DecoderEmulatedVertexArraysOESTest
|
| - : public GLES2DecoderVertexArraysOESTest {
|
| - public:
|
| - GLES2DecoderEmulatedVertexArraysOESTest() { }
|
| -
|
| - virtual void SetUp() {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - SetupDefaultProgram();
|
| -
|
| - AddExpectationsForGenVertexArraysOES();
|
| - GenHelper<GenVertexArraysOESImmediate>(client_vertexarray_id_);
|
| -
|
| - vertex_array_deleted_manually_ = false;
|
| - }
|
| -};
|
| -
|
| -// Test vertex array objects with native support
|
| -TEST_F(GLES2DecoderVertexArraysOESTest, GenVertexArraysOESValidArgs) {
|
| - GenVertexArraysOESValidArgs();
|
| -}
|
| -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, GenVertexArraysOESValidArgs) {
|
| - GenVertexArraysOESValidArgs();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderVertexArraysOESTest, GenVertexArraysOESInvalidArgs) {
|
| - GenVertexArraysOESInvalidArgs();
|
| -}
|
| -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, ) {
|
| - GenVertexArraysOESInvalidArgs();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderVertexArraysOESTest, GenVertexArraysOESImmediateValidArgs) {
|
| - GenVertexArraysOESImmediateValidArgs();
|
| -}
|
| -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest,
|
| - GenVertexArraysOESImmediateValidArgs) {
|
| - GenVertexArraysOESImmediateValidArgs();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderVertexArraysOESTest,
|
| - GenVertexArraysOESImmediateInvalidArgs) {
|
| - GenVertexArraysOESImmediateInvalidArgs();
|
| -}
|
| -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest,
|
| - GenVertexArraysOESImmediateInvalidArgs) {
|
| - GenVertexArraysOESImmediateInvalidArgs();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderVertexArraysOESTest, DeleteVertexArraysOESValidArgs) {
|
| - DeleteVertexArraysOESValidArgs();
|
| -}
|
| -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest,
|
| - DeleteVertexArraysOESValidArgs) {
|
| - DeleteVertexArraysOESValidArgs();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderVertexArraysOESTest, DeleteVertexArraysOESInvalidArgs) {
|
| - DeleteVertexArraysOESInvalidArgs();
|
| -}
|
| -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest,
|
| - DeleteVertexArraysOESInvalidArgs) {
|
| - DeleteVertexArraysOESInvalidArgs();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderVertexArraysOESTest,
|
| - DeleteVertexArraysOESImmediateValidArgs) {
|
| - DeleteVertexArraysOESImmediateValidArgs();
|
| -}
|
| -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest,
|
| - DeleteVertexArraysOESImmediateValidArgs) {
|
| - DeleteVertexArraysOESImmediateValidArgs();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderVertexArraysOESTest,
|
| - DeleteVertexArraysOESImmediateInvalidArgs) {
|
| - DeleteVertexArraysOESImmediateInvalidArgs();
|
| -}
|
| -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest,
|
| - DeleteVertexArraysOESImmediateInvalidArgs) {
|
| - DeleteVertexArraysOESImmediateInvalidArgs();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderVertexArraysOESTest,
|
| - DeleteBoundVertexArraysOESImmediateValidArgs) {
|
| - DeleteBoundVertexArraysOESImmediateValidArgs();
|
| -}
|
| -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest,
|
| - DeleteBoundVertexArraysOESImmediateValidArgs) {
|
| - DeleteBoundVertexArraysOESImmediateValidArgs();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderVertexArraysOESTest, IsVertexArrayOESValidArgs) {
|
| - IsVertexArrayOESValidArgs();
|
| -}
|
| -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, IsVertexArrayOESValidArgs) {
|
| - IsVertexArrayOESValidArgs();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderVertexArraysOESTest,
|
| - IsVertexArrayOESInvalidArgsBadSharedMemoryId) {
|
| - IsVertexArrayOESInvalidArgsBadSharedMemoryId();
|
| -}
|
| -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest,
|
| - IsVertexArrayOESInvalidArgsBadSharedMemoryId) {
|
| - IsVertexArrayOESInvalidArgsBadSharedMemoryId();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderVertexArraysOESTest, BindVertexArrayOESValidArgs) {
|
| - BindVertexArrayOESValidArgs();
|
| -}
|
| -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, BindVertexArrayOESValidArgs) {
|
| - BindVertexArrayOESValidArgs();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderVertexArraysOESTest, BindVertexArrayOESValidArgsNewId) {
|
| - BindVertexArrayOESValidArgsNewId();
|
| -}
|
| -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest,
|
| - BindVertexArrayOESValidArgsNewId) {
|
| - BindVertexArrayOESValidArgsNewId();
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, BindTexImage2DCHROMIUM) {
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - TextureRef* texture_ref = group().texture_manager()->GetTexture(
|
| - client_texture_id_);
|
| - ASSERT_TRUE(texture_ref != NULL);
|
| - Texture* texture = texture_ref->texture();
|
| - EXPECT_EQ(kServiceTextureId, texture->service_id());
|
| -
|
| - group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1);
|
| - EXPECT_FALSE(group().image_manager()->LookupImage(1) == NULL);
|
| -
|
| - GLsizei width;
|
| - GLsizei height;
|
| - GLenum type;
|
| - GLenum internal_format;
|
| -
|
| - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
|
| - EXPECT_EQ(3, width);
|
| - EXPECT_EQ(1, height);
|
| - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
|
| - EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
|
| - EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
|
| - EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
|
| -
|
| - // Bind image to texture.
|
| - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
|
| - bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
|
| - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
|
| - // Image should now be set.
|
| - EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
|
| -
|
| - // Define new texture image.
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
|
| - // Image should no longer be set.
|
| - EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, BindTexImage2DCHROMIUMCubeMapNotAllowed) {
|
| - group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1);
|
| - DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId);
|
| -
|
| - BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
|
| - bind_tex_image_2d_cmd.Init(GL_TEXTURE_CUBE_MAP, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, OrphanGLImageWithTexImage2D) {
|
| - group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1);
|
| - DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId);
|
| -
|
| - BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
|
| - bind_tex_image_2d_cmd.Init(GL_TEXTURE_CUBE_MAP, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - TextureRef* texture_ref = group().texture_manager()->GetTexture(
|
| - client_texture_id_);
|
| - ASSERT_TRUE(texture_ref != NULL);
|
| - Texture* texture = texture_ref->texture();
|
| - EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderTest, ReleaseTexImage2DCHROMIUM) {
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - 0, 0);
|
| - TextureRef* texture_ref = group().texture_manager()->GetTexture(
|
| - client_texture_id_);
|
| - ASSERT_TRUE(texture_ref != NULL);
|
| - Texture* texture = texture_ref->texture();
|
| - EXPECT_EQ(kServiceTextureId, texture->service_id());
|
| -
|
| - group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1);
|
| - EXPECT_FALSE(group().image_manager()->LookupImage(1) == NULL);
|
| -
|
| - GLsizei width;
|
| - GLsizei height;
|
| - GLenum type;
|
| - GLenum internal_format;
|
| -
|
| - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
|
| - EXPECT_EQ(3, width);
|
| - EXPECT_EQ(1, height);
|
| - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
|
| - EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
|
| - EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
|
| - EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
|
| -
|
| - // Bind image to texture.
|
| - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
|
| - bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
|
| - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
|
| - // Image should now be set.
|
| - EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
|
| -
|
| - // Release image from texture.
|
| - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - ReleaseTexImage2DCHROMIUM release_tex_image_2d_cmd;
|
| - release_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(release_tex_image_2d_cmd));
|
| - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
|
| - // Image should no longer be set.
|
| - EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
|
| -}
|
| -
|
| -class MockGLImage : public gfx::GLImage {
|
| - public:
|
| - MockGLImage() {}
|
| -
|
| - // Overridden from gfx::GLImage:
|
| - MOCK_METHOD0(Destroy, void());
|
| - MOCK_METHOD0(GetSize, gfx::Size());
|
| - MOCK_METHOD1(BindTexImage, bool(unsigned));
|
| - MOCK_METHOD1(ReleaseTexImage, void(unsigned));
|
| - MOCK_METHOD0(WillUseTexImage, void());
|
| - MOCK_METHOD0(DidUseTexImage, void());
|
| - MOCK_METHOD0(WillModifyTexImage, void());
|
| - MOCK_METHOD0(DidModifyTexImage, void());
|
| -
|
| - protected:
|
| - virtual ~MockGLImage() {}
|
| -};
|
| -
|
| -TEST_F(GLES2DecoderWithShaderTest, UseTexImage) {
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| -
|
| - TextureRef* texture_ref = group().texture_manager()->GetTexture(
|
| - client_texture_id_);
|
| - ASSERT_TRUE(texture_ref != NULL);
|
| - Texture* texture = texture_ref->texture();
|
| - EXPECT_EQ(kServiceTextureId, texture->service_id());
|
| -
|
| - const int32 kImageId = 1;
|
| - scoped_refptr<MockGLImage> image(new MockGLImage);
|
| - group().image_manager()->AddImage(image.get(), kImageId);
|
| -
|
| - // Bind image to texture.
|
| - EXPECT_CALL(*image, BindTexImage(GL_TEXTURE_2D))
|
| - .Times(1)
|
| - .WillOnce(Return(true))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*image, GetSize())
|
| - .Times(1)
|
| - .WillOnce(Return(gfx::Size(1, 1)))
|
| - .RetiresOnSaturation();
|
| - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
|
| - bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, kImageId);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
|
| -
|
| - AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| -
|
| - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
|
| - .Times(3)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*image, WillUseTexImage())
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*image, DidUseTexImage())
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawArrays cmd;
|
| - cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId))
|
| - .Times(2)
|
| - .RetiresOnSaturation();
|
| - // Image will be 'in use' as long as bound to a framebuffer.
|
| - EXPECT_CALL(*image, WillUseTexImage())
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, FramebufferTexture2DEXT(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - kServiceTextureId, 0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - FramebufferTexture2D fbtex_cmd;
|
| - fbtex_cmd.Init(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_,
|
| - 0);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| - kServiceRenderbufferId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId))
|
| - .Times(2)
|
| - .RetiresOnSaturation();
|
| - // Image should no longer be 'in use' after being unbound from framebuffer.
|
| - EXPECT_CALL(*image, DidUseTexImage())
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - FramebufferRenderbuffer fbrb_cmd;
|
| - fbrb_cmd.Init(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd));
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, DrawWithGLImageExternal) {
|
| - InitState init;
|
| - init.extensions = "GL_OES_EGL_image_external";
|
| - init.gl_version = "opengl es 2.0";
|
| - init.has_alpha = true;
|
| - init.has_depth = true;
|
| - init.request_alpha = true;
|
| - init.request_depth = true;
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - TextureRef* texture_ref = GetTexture(client_texture_id_);
|
| - scoped_refptr<MockGLImage> image(new MockGLImage);
|
| - group().texture_manager()->SetTarget(texture_ref, GL_TEXTURE_EXTERNAL_OES);
|
| - group().texture_manager()->SetLevelInfo(texture_ref,
|
| - GL_TEXTURE_EXTERNAL_OES,
|
| - 0,
|
| - GL_RGBA,
|
| - 0,
|
| - 0,
|
| - 1,
|
| - 0,
|
| - GL_RGBA,
|
| - GL_UNSIGNED_BYTE,
|
| - true);
|
| - group().texture_manager()->SetLevelImage(
|
| - texture_ref, GL_TEXTURE_EXTERNAL_OES, 0, image);
|
| -
|
| - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - SetupSamplerExternalProgram();
|
| - SetupIndexBuffer();
|
| - AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0);
|
| - SetupExpectationsForApplyingDefaultDirtyState();
|
| - EXPECT_TRUE(group().texture_manager()->CanRender(texture_ref));
|
| -
|
| - InSequence s;
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*image, WillUseTexImage())
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, DrawElements(_, _, _, _))
|
| - .Times(1);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*image, DidUseTexImage())
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DrawElements cmd;
|
| - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
|
| - kValidIndexRangeStart * 2);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, GpuMemoryManagerCHROMIUM) {
|
| - InitState init;
|
| - init.extensions = "GL_ARB_texture_rectangle";
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - Texture* texture = GetTexture(client_texture_id_)->texture();
|
| - EXPECT_TRUE(texture != NULL);
|
| - EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_UNMANAGED_CHROMIUM);
|
| -
|
| - DoBindTexture(
|
| - GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| -
|
| - TexParameteri cmd;
|
| - cmd.Init(GL_TEXTURE_2D,
|
| - GL_TEXTURE_POOL_CHROMIUM,
|
| - GL_TEXTURE_POOL_UNMANAGED_CHROMIUM);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - cmd.Init(GL_TEXTURE_2D,
|
| - GL_TEXTURE_POOL_CHROMIUM,
|
| - GL_TEXTURE_POOL_MANAGED_CHROMIUM);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_MANAGED_CHROMIUM);
|
| -
|
| - cmd.Init(GL_TEXTURE_2D,
|
| - GL_TEXTURE_POOL_CHROMIUM,
|
| - GL_NONE);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransfers) {
|
| - InitState init;
|
| - init.extensions = "GL_CHROMIUM_async_pixel_transfers";
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| -
|
| - // Set up the texture.
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - TextureRef* texture_ref = GetTexture(client_texture_id_);
|
| - Texture* texture = texture_ref->texture();
|
| -
|
| - // Set a mock Async delegate
|
| - StrictMock<gpu::MockAsyncPixelTransferManager>* manager =
|
| - new StrictMock<gpu::MockAsyncPixelTransferManager>;
|
| - manager->Initialize(group().texture_manager());
|
| - decoder_->SetAsyncPixelTransferManagerForTest(manager);
|
| - StrictMock<gpu::MockAsyncPixelTransferDelegate>* delegate = NULL;
|
| -
|
| - // Tex(Sub)Image2D upload commands.
|
| - AsyncTexImage2DCHROMIUM teximage_cmd;
|
| - teximage_cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA,
|
| - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset,
|
| - 0, 0, 0);
|
| - AsyncTexSubImage2DCHROMIUM texsubimage_cmd;
|
| - texsubimage_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGBA,
|
| - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset,
|
| - 0, 0, 0);
|
| - WaitAsyncTexImage2DCHROMIUM wait_cmd;
|
| - wait_cmd.Init(GL_TEXTURE_2D);
|
| - WaitAllAsyncTexImage2DCHROMIUM wait_all_cmd;
|
| - wait_all_cmd.Init();
|
| -
|
| - // No transfer state exists initially.
|
| - EXPECT_FALSE(
|
| - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
|
| - texture_ref));
|
| -
|
| - base::Closure bind_callback;
|
| -
|
| - // AsyncTexImage2D
|
| - {
|
| - // Create transfer state since it doesn't exist.
|
| - EXPECT_EQ(texture_ref->num_observers(), 0);
|
| - EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _))
|
| - .WillOnce(Return(
|
| - delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _))
|
| - .WillOnce(SaveArg<2>(&bind_callback))
|
| - .RetiresOnSaturation();
|
| - // Command succeeds.
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(
|
| - delegate,
|
| - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
|
| - texture_ref));
|
| - EXPECT_TRUE(texture->IsImmutable());
|
| - // The texture is safe but the level has not been defined yet.
|
| - EXPECT_TRUE(texture->SafeToRenderFrom());
|
| - GLsizei width, height;
|
| - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
|
| - EXPECT_EQ(texture_ref->num_observers(), 1);
|
| - }
|
| - {
|
| - // Async redefinitions are not allowed!
|
| - // Command fails.
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(
|
| - delegate,
|
| - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
|
| - texture_ref));
|
| - EXPECT_TRUE(texture->IsImmutable());
|
| - EXPECT_TRUE(texture->SafeToRenderFrom());
|
| - }
|
| -
|
| - // Binding/defining of the async transfer
|
| - {
|
| - // TODO(epenner): We should check that the manager gets the
|
| - // BindCompletedAsyncTransfers() call, which is required to
|
| - // guarantee the delegate calls the bind callback.
|
| -
|
| - // Simulate the bind callback from the delegate.
|
| - bind_callback.Run();
|
| -
|
| - // After the bind callback is run, the texture is safe,
|
| - // and has the right size etc.
|
| - EXPECT_TRUE(texture->SafeToRenderFrom());
|
| - GLsizei width, height;
|
| - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
|
| - EXPECT_EQ(width, 8);
|
| - EXPECT_EQ(height, 8);
|
| - }
|
| -
|
| - // AsyncTexSubImage2D
|
| - EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation();
|
| - decoder_->GetAsyncPixelTransferManager()
|
| - ->ClearPixelTransferDelegateForTest(texture_ref);
|
| - EXPECT_EQ(texture_ref->num_observers(), 0);
|
| - texture->SetImmutable(false);
|
| - {
|
| - // Create transfer state since it doesn't exist.
|
| - EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _))
|
| - .WillOnce(Return(
|
| - delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*delegate, AsyncTexSubImage2D(_, _))
|
| - .RetiresOnSaturation();
|
| - // Command succeeds.
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(texsubimage_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(
|
| - delegate,
|
| - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
|
| - texture_ref));
|
| - EXPECT_TRUE(texture->IsImmutable());
|
| - EXPECT_TRUE(texture->SafeToRenderFrom());
|
| - }
|
| - {
|
| - // No transfer is in progress.
|
| - EXPECT_CALL(*delegate, TransferIsInProgress())
|
| - .WillOnce(Return(false)) // texSubImage validation
|
| - .WillOnce(Return(false)) // async validation
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*delegate, AsyncTexSubImage2D(_, _))
|
| - .RetiresOnSaturation();
|
| - // Command succeeds.
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(texsubimage_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(
|
| - delegate,
|
| - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
|
| - texture_ref));
|
| - EXPECT_TRUE(texture->IsImmutable());
|
| - EXPECT_TRUE(texture->SafeToRenderFrom());
|
| - }
|
| - {
|
| - // A transfer is still in progress!
|
| - EXPECT_CALL(*delegate, TransferIsInProgress())
|
| - .WillOnce(Return(true))
|
| - .RetiresOnSaturation();
|
| - // No async call, command fails.
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(texsubimage_cmd));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| - EXPECT_EQ(
|
| - delegate,
|
| - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
|
| - texture_ref));
|
| - EXPECT_TRUE(texture->IsImmutable());
|
| - EXPECT_TRUE(texture->SafeToRenderFrom());
|
| - }
|
| -
|
| - // Delete delegate on DeleteTexture.
|
| - {
|
| - EXPECT_EQ(texture_ref->num_observers(), 1);
|
| - EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation();
|
| - DoDeleteTexture(client_texture_id_, kServiceTextureId);
|
| - EXPECT_FALSE(
|
| - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
|
| - texture_ref));
|
| - texture = NULL;
|
| - texture_ref = NULL;
|
| - delegate = NULL;
|
| - }
|
| -
|
| - // WaitAsyncTexImage2D
|
| - {
|
| - // Get a fresh texture since the existing texture cannot be respecified
|
| - // asynchronously and AsyncTexSubImage2D does not involve binding.
|
| - EXPECT_CALL(*gl_, GenTextures(1, _))
|
| - .WillOnce(SetArgumentPointee<1>(kServiceTextureId));
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - texture_ref = GetTexture(client_texture_id_);
|
| - texture = texture_ref->texture();
|
| - texture->SetImmutable(false);
|
| - // Create transfer state since it doesn't exist.
|
| - EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _))
|
| - .WillOnce(Return(
|
| - delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _))
|
| - .RetiresOnSaturation();
|
| - // Start async transfer.
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(
|
| - delegate,
|
| - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
|
| - texture_ref));
|
| -
|
| - EXPECT_TRUE(texture->IsImmutable());
|
| - // Wait for completion.
|
| - EXPECT_CALL(*delegate, WaitForTransferCompletion());
|
| - EXPECT_CALL(*manager, BindCompletedAsyncTransfers());
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(wait_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - }
|
| -
|
| - // WaitAllAsyncTexImage2D
|
| - EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation();
|
| - DoDeleteTexture(client_texture_id_, kServiceTextureId);
|
| - EXPECT_FALSE(
|
| - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
|
| - texture_ref));
|
| - texture = NULL;
|
| - texture_ref = NULL;
|
| - delegate = NULL;
|
| - {
|
| - // Get a fresh texture since the existing texture cannot be respecified
|
| - // asynchronously and AsyncTexSubImage2D does not involve binding.
|
| - EXPECT_CALL(*gl_, GenTextures(1, _))
|
| - .WillOnce(SetArgumentPointee<1>(kServiceTextureId));
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - texture_ref = GetTexture(client_texture_id_);
|
| - texture = texture_ref->texture();
|
| - texture->SetImmutable(false);
|
| - // Create transfer state since it doesn't exist.
|
| - EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _))
|
| - .WillOnce(Return(
|
| - delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _))
|
| - .RetiresOnSaturation();
|
| - // Start async transfer.
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(
|
| - delegate,
|
| - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
|
| - texture_ref));
|
| -
|
| - EXPECT_TRUE(texture->IsImmutable());
|
| - // Wait for completion of all uploads.
|
| - EXPECT_CALL(*manager, WaitAllAsyncTexImage2D()).RetiresOnSaturation();
|
| - EXPECT_CALL(*manager, BindCompletedAsyncTransfers());
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(wait_all_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - }
|
| -
|
| - // Remove PixelTransferManager before the decoder destroys.
|
| - EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation();
|
| - decoder_->ResetAsyncPixelTransferManagerForTest();
|
| - manager = NULL;
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransferManager) {
|
| +TEST_F(GLES2DecoderManualInitTest, BindGeneratesResourceFalse) {
|
| InitState init;
|
| - init.extensions = "GL_CHROMIUM_async_pixel_transfers";
|
| init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| InitDecoder(init);
|
|
|
| - // Set up the texture.
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - TextureRef* texture_ref = GetTexture(client_texture_id_);
|
| -
|
| - // Set a mock Async delegate.
|
| - StrictMock<gpu::MockAsyncPixelTransferManager>* manager =
|
| - new StrictMock<gpu::MockAsyncPixelTransferManager>;
|
| - manager->Initialize(group().texture_manager());
|
| - decoder_->SetAsyncPixelTransferManagerForTest(manager);
|
| - StrictMock<gpu::MockAsyncPixelTransferDelegate>* delegate = NULL;
|
| -
|
| - AsyncTexImage2DCHROMIUM teximage_cmd;
|
| - teximage_cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA,
|
| - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset,
|
| - 0, 0, 0);
|
| -
|
| - // No transfer delegate exists initially.
|
| - EXPECT_FALSE(
|
| - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
|
| - texture_ref));
|
| -
|
| - // Create delegate on AsyncTexImage2D.
|
| - {
|
| - EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _))
|
| - .WillOnce(Return(
|
| - delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)).RetiresOnSaturation();
|
| -
|
| - // Command succeeds.
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - }
|
| + BindTexture cmd1;
|
| + cmd1.Init(GL_TEXTURE_2D, kInvalidClientId);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
| + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
|
|
| - // Delegate is cached.
|
| - EXPECT_EQ(delegate,
|
| - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
|
| - texture_ref));
|
| + BindBuffer cmd2;
|
| + cmd2.Init(GL_ARRAY_BUFFER, kInvalidClientId);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
|
|
| - // Delete delegate on manager teardown.
|
| - {
|
| - EXPECT_EQ(texture_ref->num_observers(), 1);
|
| - EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation();
|
| - decoder_->ResetAsyncPixelTransferManagerForTest();
|
| - manager = NULL;
|
| + BindFramebuffer cmd3;
|
| + cmd3.Init(GL_FRAMEBUFFER, kInvalidClientId);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd3));
|
| + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
|
|
| - // Texture ref still valid.
|
| - EXPECT_EQ(texture_ref, GetTexture(client_texture_id_));
|
| - EXPECT_EQ(texture_ref->num_observers(), 0);
|
| - }
|
| + BindRenderbuffer cmd4;
|
| + cmd4.Init(GL_RENDERBUFFER, kInvalidClientId);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd4));
|
| + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| }
|
|
|
| -namespace {
|
| -
|
| -class SizeOnlyMemoryTracker : public MemoryTracker {
|
| - public:
|
| - SizeOnlyMemoryTracker() {
|
| - // These are the default textures. 1 for TEXTURE_2D and 6 faces for
|
| - // TEXTURE_CUBE_MAP.
|
| - const size_t kInitialUnmanagedPoolSize = 7 * 4;
|
| - const size_t kInitialManagedPoolSize = 0;
|
| - pool_infos_[MemoryTracker::kUnmanaged].initial_size =
|
| - kInitialUnmanagedPoolSize;
|
| - pool_infos_[MemoryTracker::kManaged].initial_size =
|
| - kInitialManagedPoolSize;
|
| - }
|
| -
|
| - // Ensure a certain amount of GPU memory is free. Returns true on success.
|
| - MOCK_METHOD1(EnsureGPUMemoryAvailable, bool(size_t size_needed));
|
| -
|
| - virtual void TrackMemoryAllocatedChange(
|
| - size_t old_size, size_t new_size, Pool pool) {
|
| - PoolInfo& info = pool_infos_[pool];
|
| - info.size += new_size - old_size;
|
| - }
|
| -
|
| - size_t GetPoolSize(Pool pool) {
|
| - const PoolInfo& info = pool_infos_[pool];
|
| - return info.size - info.initial_size;
|
| - }
|
| -
|
| - private:
|
| - virtual ~SizeOnlyMemoryTracker() {
|
| - }
|
| - struct PoolInfo {
|
| - PoolInfo()
|
| - : initial_size(0),
|
| - size(0) {
|
| - }
|
| - size_t initial_size;
|
| - size_t size;
|
| - };
|
| - std::map<Pool, PoolInfo> pool_infos_;
|
| -};
|
| -
|
| -} // anonymous namespace.
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, MemoryTrackerInitialSize) {
|
| - scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
|
| - new SizeOnlyMemoryTracker();
|
| - set_memory_tracker(memory_tracker.get());
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - // Expect that initial size - size is 0.
|
| - EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| - EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kManaged));
|
| +TEST_F(GLES2DecoderTest, EnableFeatureCHROMIUMBadBucket) {
|
| + const uint32 kBadBucketId = 123;
|
| + EnableFeatureCHROMIUM cmd;
|
| + cmd.Init(kBadBucketId, shared_memory_id_, shared_memory_offset_);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| }
|
|
|
| -TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexImage2D) {
|
| - scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
|
| - new SizeOnlyMemoryTracker();
|
| - set_memory_tracker(memory_tracker.get());
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| - .WillOnce(Return(true)).RetiresOnSaturation();
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| - EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64))
|
| - .WillOnce(Return(true)).RetiresOnSaturation();
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - // Check we get out of memory and no call to glTexImage2D if Ensure fails.
|
| - EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64))
|
| - .WillOnce(Return(false)).RetiresOnSaturation();
|
| - TexImage2D cmd;
|
| - cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
| - kSharedMemoryId, kSharedMemoryOffset);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| - EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| +TEST_F(GLES2DecoderTest, RequestExtensionCHROMIUMBadBucket) {
|
| + const uint32 kBadBucketId = 123;
|
| + RequestExtensionCHROMIUM cmd;
|
| + cmd.Init(kBadBucketId);
|
| + EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
|
| }
|
|
|
| -TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexStorage2DEXT) {
|
| - scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
|
| - new SizeOnlyMemoryTracker();
|
| - set_memory_tracker(memory_tracker.get());
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - // Check we get out of memory and no call to glTexStorage2DEXT
|
| - // if Ensure fails.
|
| - EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| - .WillOnce(Return(false)).RetiresOnSaturation();
|
| - TexStorage2DEXT cmd;
|
| - cmd.Init(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 4);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| +TEST_F(GLES2DecoderTest, BeginQueryEXTDisabled) {
|
| + // Test something fails if off.
|
| }
|
|
|
| -TEST_F(GLES2DecoderManualInitTest, MemoryTrackerCopyTexImage2D) {
|
| - GLenum target = GL_TEXTURE_2D;
|
| - GLint level = 0;
|
| - GLenum internal_format = GL_RGBA;
|
| - GLsizei width = 4;
|
| - GLsizei height = 8;
|
| - GLint border = 0;
|
| - scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
|
| - new SizeOnlyMemoryTracker();
|
| - set_memory_tracker(memory_tracker.get());
|
| +TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXT) {
|
| InitState init;
|
| - init.gl_version = "3.0";
|
| + init.extensions = "GL_EXT_occlusion_query_boolean";
|
| + init.gl_version = "opengl es 2.0";
|
| init.has_alpha = true;
|
| init.request_alpha = true;
|
| init.bind_generates_resource = true;
|
| InitDecoder(init);
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| - .WillOnce(Return(true)).RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, CopyTexImage2D(
|
| - target, level, internal_format, 0, 0, width, height, border))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - CopyTexImage2D cmd;
|
| - cmd.Init(target, level, internal_format, 0, 0, width, height, border);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - // Check we get out of memory and no call to glCopyTexImage2D if Ensure fails.
|
| - EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| - .WillOnce(Return(false)).RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| - EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| -}
|
|
|
| -TEST_F(GLES2DecoderManualInitTest, MemoryTrackerRenderbufferStorage) {
|
| - scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
|
| - new SizeOnlyMemoryTracker();
|
| - set_memory_tracker(memory_tracker.get());
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
|
| - kServiceRenderbufferId);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| - .WillOnce(Return(true)).RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, RenderbufferStorageEXT(
|
| - GL_RENDERBUFFER, GL_RGBA, 8, 4))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - RenderbufferStorage cmd;
|
| - cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 8, 4);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| - // Check we get out of memory and no call to glRenderbufferStorage if Ensure
|
| - // fails.
|
| - EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| - .WillOnce(Return(false)).RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| - EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| -}
|
| + // Test end fails if no begin.
|
| + EndQueryEXT end_cmd;
|
| + end_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 1);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
|
| + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
|
|
| -TEST_F(GLES2DecoderManualInitTest, MemoryTrackerBufferData) {
|
| - scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
|
| - new SizeOnlyMemoryTracker();
|
| - set_memory_tracker(memory_tracker.get());
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_,
|
| - kServiceBufferId);
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| - .WillOnce(Return(true)).RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, BufferData(GL_ARRAY_BUFFER, 128, _, GL_STREAM_DRAW))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - BufferData cmd;
|
| - cmd.Init(GL_ARRAY_BUFFER, 128, 0, 0, GL_STREAM_DRAW);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged));
|
| - // Check we get out of memory and no call to glBufferData if Ensure
|
| - // fails.
|
| - EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| - .WillOnce(Return(false)).RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| - EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged));
|
| -}
|
| + BeginQueryEXT begin_cmd;
|
| +
|
| + // Test id = 0 fails.
|
| + begin_cmd.Init(
|
| + GL_ANY_SAMPLES_PASSED_EXT, 0, kSharedMemoryId, kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
|
|
| -TEST_F(GLES2DecoderTest, DrawBuffersEXTImmediateSuccceeds) {
|
| - const GLsizei count = 1;
|
| - const GLenum bufs[] = { GL_COLOR_ATTACHMENT0 };
|
| - DrawBuffersEXTImmediate& cmd =
|
| - *GetImmediateAs<DrawBuffersEXTImmediate>();
|
| - cmd.Init(count, bufs);
|
| + GenHelper<GenQueriesEXTImmediate>(kNewClientId);
|
|
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - EXPECT_CALL(*gl_, DrawBuffersARB(count, _))
|
| + // Test valid parameters work.
|
| + EXPECT_CALL(*gl_, GenQueriesARB(1, _))
|
| + .WillOnce(SetArgumentPointee<1>(kNewServiceId))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kNewServiceId))
|
| .Times(1)
|
| .RetiresOnSaturation();
|
| - EXPECT_EQ(error::kNoError,
|
| - ExecuteImmediateCmd(cmd, sizeof(bufs)));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -}
|
|
|
| -TEST_F(GLES2DecoderTest, DrawBuffersEXTImmediateFails) {
|
| - const GLsizei count = 1;
|
| - const GLenum bufs[] = { GL_COLOR_ATTACHMENT1_EXT };
|
| - DrawBuffersEXTImmediate& cmd =
|
| - *GetImmediateAs<DrawBuffersEXTImmediate>();
|
| - cmd.Init(count, bufs);
|
| + // Query object should not be created untill BeginQueriesEXT.
|
| + QueryManager* query_manager = decoder_->GetQueryManager();
|
| + ASSERT_TRUE(query_manager != NULL);
|
| + QueryManager::Query* query = query_manager->GetQuery(kNewClientId);
|
| + EXPECT_TRUE(query == NULL);
|
|
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - EXPECT_EQ(error::kNoError,
|
| - ExecuteImmediateCmd(cmd, sizeof(bufs)));
|
| + // BeginQueryEXT should fail if id is not generated from GenQueriesEXT.
|
| + begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT,
|
| + kInvalidClientId,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
|
|
| -TEST_F(GLES2DecoderTest, DrawBuffersEXTImmediateBackbuffer) {
|
| - const GLsizei count = 1;
|
| - const GLenum bufs[] = { GL_BACK };
|
| - DrawBuffersEXTImmediate& cmd =
|
| - *GetImmediateAs<DrawBuffersEXTImmediate>();
|
| - cmd.Init(count, bufs);
|
| + begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT,
|
| + kNewClientId,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +
|
| + // After BeginQueriesEXT id name should have query object associated with it.
|
| + query = query_manager->GetQuery(kNewClientId);
|
| + ASSERT_TRUE(query != NULL);
|
| + EXPECT_FALSE(query->pending());
|
|
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| - kServiceFramebufferId);
|
| - EXPECT_EQ(error::kNoError,
|
| - ExecuteImmediateCmd(cmd, sizeof(bufs)));
|
| + // Test trying begin again fails
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
|
|
| - DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); // unbind
|
| + // Test end fails with different target
|
| + end_cmd.Init(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, 1);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
|
| + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
|
|
| - EXPECT_CALL(*gl_, DrawBuffersARB(count, _))
|
| + // Test end succeeds
|
| + EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT))
|
| .Times(1)
|
| .RetiresOnSaturation();
|
| -
|
| - EXPECT_EQ(error::kNoError,
|
| - ExecuteImmediateCmd(cmd, sizeof(bufs)));
|
| + end_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 1);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
|
| EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_TRUE(query->pending());
|
| +
|
| + EXPECT_CALL(*gl_, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation();
|
| }
|
|
|
| -TEST_F(GLES2DecoderManualInitTest, InvalidateFramebufferBinding) {
|
| - InitState init;
|
| - init.gl_version = "opengl es 3.0";
|
| - InitDecoder(init);
|
| +struct QueryType {
|
| + GLenum type;
|
| + bool is_gl;
|
| +};
|
|
|
| - // EXPECT_EQ can't be used to compare function pointers
|
| - EXPECT_TRUE(
|
| - gfx::MockGLInterface::GetGLProcAddress("glInvalidateFramebuffer") ==
|
| - gfx::g_driver_gl.fn.glDiscardFramebufferEXTFn);
|
| - EXPECT_TRUE(
|
| - gfx::MockGLInterface::GetGLProcAddress("glInvalidateFramebuffer") !=
|
| - gfx::MockGLInterface::GetGLProcAddress("glDiscardFramebufferEXT"));
|
| -}
|
| +const QueryType kQueryTypes[] = {
|
| + {GL_COMMANDS_ISSUED_CHROMIUM, false},
|
| + {GL_LATENCY_QUERY_CHROMIUM, false},
|
| + {GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, false},
|
| + {GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, false},
|
| + {GL_GET_ERROR_QUERY_CHROMIUM, false},
|
| + {GL_COMMANDS_COMPLETED_CHROMIUM, false},
|
| + {GL_ANY_SAMPLES_PASSED_EXT, true},
|
| +};
|
|
|
| -TEST_F(GLES2DecoderManualInitTest, DiscardFramebufferEXT) {
|
| - InitState init;
|
| - init.extensions = "GL_EXT_discard_framebuffer";
|
| +static void CheckBeginEndQueryBadMemoryFails(GLES2DecoderTestBase* test,
|
| + GLuint client_id,
|
| + GLuint service_id,
|
| + const QueryType& query_type,
|
| + int32 shm_id,
|
| + uint32 shm_offset) {
|
| + // We need to reset the decoder on each iteration, because we lose the
|
| + // context every time.
|
| + GLES2DecoderTestBase::InitState init;
|
| + init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync";
|
| init.gl_version = "opengl es 2.0";
|
| - InitDecoder(init);
|
| + init.has_alpha = true;
|
| + init.request_alpha = true;
|
| + init.bind_generates_resource = true;
|
| + test->InitDecoder(init);
|
| + ::testing::StrictMock< ::gfx::MockGLInterface>* gl = test->GetGLMock();
|
|
|
| - // EXPECT_EQ can't be used to compare function pointers
|
| - EXPECT_TRUE(
|
| - gfx::MockGLInterface::GetGLProcAddress("glDiscardFramebufferEXT") ==
|
| - gfx::g_driver_gl.fn.glDiscardFramebufferEXTFn);
|
| + BeginQueryEXT begin_cmd;
|
|
|
| - const GLenum target = GL_FRAMEBUFFER;
|
| - const GLsizei count = 1;
|
| - const GLenum attachments[] = { GL_COLOR_ATTACHMENT0 };
|
| + test->GenHelper<GenQueriesEXTImmediate>(client_id);
|
|
|
| - SetupTexture();
|
| - DoBindFramebuffer(
|
| - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| - DoFramebufferTexture2D(GL_FRAMEBUFFER,
|
| - GL_COLOR_ATTACHMENT0,
|
| - GL_TEXTURE_2D,
|
| - client_texture_id_,
|
| - kServiceTextureId,
|
| - 0,
|
| - GL_NO_ERROR);
|
| - FramebufferManager* framebuffer_manager = group().framebuffer_manager();
|
| - Framebuffer* framebuffer =
|
| - framebuffer_manager->GetFramebuffer(client_framebuffer_id_);
|
| - EXPECT_TRUE(framebuffer->IsCleared());
|
| + if (query_type.is_gl) {
|
| + EXPECT_CALL(*gl, GenQueriesARB(1, _))
|
| + .WillOnce(SetArgumentPointee<1>(service_id))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl, BeginQueryARB(query_type.type, service_id))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + }
|
|
|
| - EXPECT_CALL(*gl_, DiscardFramebufferEXT(target, count, _))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - DiscardFramebufferEXTImmediate& cmd =
|
| - *GetImmediateAs<DiscardFramebufferEXTImmediate>();
|
| - cmd.Init(target, count, attachments);
|
| + // Test bad shared memory fails
|
| + begin_cmd.Init(query_type.type, client_id, shm_id, shm_offset);
|
| + error::Error error1 = test->ExecuteCmd(begin_cmd);
|
|
|
| - EXPECT_EQ(error::kNoError,
|
| - ExecuteImmediateCmd(cmd, sizeof(attachments)));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - EXPECT_FALSE(framebuffer->IsCleared());
|
| -}
|
| + if (query_type.is_gl) {
|
| + EXPECT_CALL(*gl, EndQueryARB(query_type.type))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + }
|
| + if (query_type.type == GL_GET_ERROR_QUERY_CHROMIUM) {
|
| + EXPECT_CALL(*gl, GetError())
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .RetiresOnSaturation();
|
| + }
|
| + GLsync kGlSync = reinterpret_cast<GLsync>(0xdeadbeef);
|
| + if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) {
|
| + EXPECT_CALL(*gl, Flush()).RetiresOnSaturation();
|
| + EXPECT_CALL(*gl, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0))
|
| + .WillOnce(Return(kGlSync))
|
| + .RetiresOnSaturation();
|
| + }
|
|
|
| -TEST_F(GLES2DecoderTest, DiscardFramebufferEXTUnsupported) {
|
| - const GLenum target = GL_FRAMEBUFFER;
|
| - const GLsizei count = 1;
|
| - const GLenum attachments[] = { GL_COLOR_EXT };
|
| - DiscardFramebufferEXTImmediate& cmd =
|
| - *GetImmediateAs<DiscardFramebufferEXTImmediate>();
|
| - cmd.Init(target, count, attachments);
|
| + EndQueryEXT end_cmd;
|
| + end_cmd.Init(query_type.type, 1);
|
| + error::Error error2 = test->ExecuteCmd(end_cmd);
|
|
|
| - // Should not result into a call into GL.
|
| - EXPECT_EQ(error::kNoError,
|
| - ExecuteImmediateCmd(cmd, sizeof(attachments)));
|
| - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| -}
|
| + if (query_type.is_gl) {
|
| + EXPECT_CALL(
|
| + *gl, GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
|
| + .WillOnce(SetArgumentPointee<2>(1))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl, GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_EXT, _))
|
| + .WillOnce(SetArgumentPointee<2>(1))
|
| + .RetiresOnSaturation();
|
| + }
|
| + if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) {
|
| + EXPECT_CALL(*gl, ClientWaitSync(kGlSync, _, _))
|
| + .WillOnce(Return(GL_ALREADY_SIGNALED))
|
| + .RetiresOnSaturation();
|
| + }
|
|
|
| -TEST_F(GLES2DecoderRestoreStateTest, NullPreviousStateBGR) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - SetupTexture();
|
| + QueryManager* query_manager = test->GetDecoder()->GetQueryManager();
|
| + ASSERT_TRUE(query_manager != NULL);
|
| + bool process_success = query_manager->ProcessPendingQueries();
|
|
|
| - InSequence sequence;
|
| - // Expect to restore texture bindings for unit GL_TEXTURE0.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP,
|
| - TestHelper::kServiceDefaultTextureCubemapId);
|
| + EXPECT_TRUE(error1 != error::kNoError || error2 != error::kNoError ||
|
| + !process_success);
|
|
|
| - // Expect to restore texture bindings for remaining units.
|
| - for (uint32 i = 1; i < group().max_texture_units() ; ++i) {
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0 + i);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D,
|
| - TestHelper::kServiceDefaultTexture2dId);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP,
|
| - TestHelper::kServiceDefaultTextureCubemapId);
|
| + if (query_type.is_gl) {
|
| + EXPECT_CALL(*gl, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation();
|
| }
|
| -
|
| - // Expect to restore the active texture unit to GL_TEXTURE0.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| -
|
| - GetDecoder()->RestoreAllTextureUnitBindings(NULL);
|
| + if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM)
|
| + EXPECT_CALL(*gl, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation();
|
| + test->ResetDecoder();
|
| }
|
|
|
| -TEST_F(GLES2DecoderRestoreStateTest, NullPreviousState) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - InitDecoder(init);
|
| - SetupTexture();
|
| -
|
| - InSequence sequence;
|
| - // Expect to restore texture bindings for unit GL_TEXTURE0.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, 0);
|
| -
|
| - // Expect to restore texture bindings for remaining units.
|
| - for (uint32 i = 1; i < group().max_texture_units(); ++i) {
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0 + i);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D, 0);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, 0);
|
| +TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryIdFails) {
|
| + for (size_t i = 0; i < arraysize(kQueryTypes); ++i) {
|
| + CheckBeginEndQueryBadMemoryFails(this,
|
| + kNewClientId,
|
| + kNewServiceId,
|
| + kQueryTypes[i],
|
| + kInvalidSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| }
|
| -
|
| - // Expect to restore the active texture unit to GL_TEXTURE0.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| -
|
| - GetDecoder()->RestoreAllTextureUnitBindings(NULL);
|
| }
|
|
|
| -TEST_F(GLES2DecoderRestoreStateTest, WithPreviousStateBGR) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| - SetupTexture();
|
| -
|
| - // Construct a previous ContextState with all texture bindings
|
| - // set to default textures.
|
| - ContextState prev_state(NULL, NULL, NULL);
|
| - InitializeContextState(&prev_state, std::numeric_limits<uint32>::max(), 0);
|
| -
|
| - InSequence sequence;
|
| - // Expect to restore only GL_TEXTURE_2D binding for GL_TEXTURE0 unit,
|
| - // since the rest of the bindings haven't changed between the current
|
| - // state and the |prev_state|.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
|
| -
|
| - // Expect to restore active texture unit to GL_TEXTURE0.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| -
|
| - GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
|
| +TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryOffsetFails) {
|
| + for (size_t i = 0; i < arraysize(kQueryTypes); ++i) {
|
| + // Out-of-bounds.
|
| + CheckBeginEndQueryBadMemoryFails(this,
|
| + kNewClientId,
|
| + kNewServiceId,
|
| + kQueryTypes[i],
|
| + kSharedMemoryId,
|
| + kInvalidSharedMemoryOffset);
|
| + // Overflow.
|
| + CheckBeginEndQueryBadMemoryFails(this,
|
| + kNewClientId,
|
| + kNewServiceId,
|
| + kQueryTypes[i],
|
| + kSharedMemoryId,
|
| + 0xfffffffcu);
|
| + }
|
| }
|
|
|
| -TEST_F(GLES2DecoderRestoreStateTest, WithPreviousState) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - InitDecoder(init);
|
| - SetupTexture();
|
| -
|
| - // Construct a previous ContextState with all texture bindings
|
| - // set to default textures.
|
| - ContextState prev_state(NULL, NULL, NULL);
|
| - InitializeContextState(&prev_state, std::numeric_limits<uint32>::max(), 0);
|
| -
|
| - InSequence sequence;
|
| - // Expect to restore only GL_TEXTURE_2D binding for GL_TEXTURE0 unit,
|
| - // since the rest of the bindings haven't changed between the current
|
| - // state and the |prev_state|.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
|
| -
|
| - // Expect to restore active texture unit to GL_TEXTURE0.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| -
|
| - GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
|
| -}
|
| +TEST_F(GLES2DecoderTest, BeginEndQueryEXTCommandsIssuedCHROMIUM) {
|
| + BeginQueryEXT begin_cmd;
|
|
|
| -TEST_F(GLES2DecoderRestoreStateTest, ActiveUnit1) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - InitDecoder(init);
|
| + GenHelper<GenQueriesEXTImmediate>(kNewClientId);
|
|
|
| - // Bind a non-default texture to GL_TEXTURE1 unit.
|
| - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1));
|
| - ActiveTexture cmd;
|
| - cmd.Init(GL_TEXTURE1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + // Test valid parameters work.
|
| + begin_cmd.Init(GL_COMMANDS_ISSUED_CHROMIUM,
|
| + kNewClientId,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - SetupTexture();
|
| -
|
| - // Construct a previous ContextState with all texture bindings
|
| - // set to default textures.
|
| - ContextState prev_state(NULL, NULL, NULL);
|
| - InitializeContextState(&prev_state, std::numeric_limits<uint32>::max(), 0);
|
|
|
| - InSequence sequence;
|
| - // Expect to restore only GL_TEXTURE_2D binding for GL_TEXTURE1 unit,
|
| - // since the rest of the bindings haven't changed between the current
|
| - // state and the |prev_state|.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE1);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
|
| -
|
| - // Expect to restore active texture unit to GL_TEXTURE1.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE1);
|
| + QueryManager* query_manager = decoder_->GetQueryManager();
|
| + ASSERT_TRUE(query_manager != NULL);
|
| + QueryManager::Query* query = query_manager->GetQuery(kNewClientId);
|
| + ASSERT_TRUE(query != NULL);
|
| + EXPECT_FALSE(query->pending());
|
|
|
| - GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
|
| + // Test end succeeds
|
| + EndQueryEXT end_cmd;
|
| + end_cmd.Init(GL_COMMANDS_ISSUED_CHROMIUM, 1);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_FALSE(query->pending());
|
| }
|
|
|
| -TEST_F(GLES2DecoderRestoreStateTest, NonDefaultUnit0BGR) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - init.bind_generates_resource = true;
|
| - InitDecoder(init);
|
| +TEST_F(GLES2DecoderTest, BeginEndQueryEXTGetErrorQueryCHROMIUM) {
|
| + BeginQueryEXT begin_cmd;
|
|
|
| - // Bind a non-default texture to GL_TEXTURE1 unit.
|
| - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1));
|
| - SpecializedSetup<ActiveTexture, 0>(true);
|
| - ActiveTexture cmd;
|
| - cmd.Init(GL_TEXTURE1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - SetupTexture();
|
| + GenHelper<GenQueriesEXTImmediate>(kNewClientId);
|
|
|
| - // Construct a previous ContextState with GL_TEXTURE_2D target in
|
| - // GL_TEXTURE0 unit bound to a non-default texture and the rest
|
| - // set to default textures.
|
| - ContextState prev_state(NULL, NULL, NULL);
|
| - InitializeContextState(&prev_state, 0, kServiceTextureId);
|
| + // Test valid parameters work.
|
| + begin_cmd.Init(GL_GET_ERROR_QUERY_CHROMIUM,
|
| + kNewClientId,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
|
|
| - InSequence sequence;
|
| - // Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE0 unit to
|
| - // a default texture.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D,
|
| - TestHelper::kServiceDefaultTexture2dId);
|
| + QueryManager* query_manager = decoder_->GetQueryManager();
|
| + ASSERT_TRUE(query_manager != NULL);
|
| + QueryManager::Query* query = query_manager->GetQuery(kNewClientId);
|
| + ASSERT_TRUE(query != NULL);
|
| + EXPECT_FALSE(query->pending());
|
|
|
| - // Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE1 unit to
|
| - // non-default.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE1);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
|
| + // Test end succeeds
|
| + QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_);
|
|
|
| - // Expect to restore active texture unit to GL_TEXTURE1.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE1);
|
| + EXPECT_CALL(*gl_, GetError())
|
| + .WillOnce(Return(GL_INVALID_VALUE))
|
| + .RetiresOnSaturation();
|
|
|
| - GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
|
| + EndQueryEXT end_cmd;
|
| + end_cmd.Init(GL_GET_ERROR_QUERY_CHROMIUM, 1);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_FALSE(query->pending());
|
| + EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE),
|
| + static_cast<GLenum>(sync->result));
|
| }
|
|
|
| -TEST_F(GLES2DecoderRestoreStateTest, NonDefaultUnit1BGR) {
|
| +TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTCommandsCompletedCHROMIUM) {
|
| InitState init;
|
| - init.gl_version = "3.0";
|
| + init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync";
|
| + init.gl_version = "opengl es 2.0";
|
| + init.has_alpha = true;
|
| + init.request_alpha = true;
|
| init.bind_generates_resource = true;
|
| InitDecoder(init);
|
|
|
| - // Bind a non-default texture to GL_TEXTURE0 unit.
|
| - SetupTexture();
|
| -
|
| - // Construct a previous ContextState with GL_TEXTURE_2D target in
|
| - // GL_TEXTURE1 unit bound to a non-default texture and the rest
|
| - // set to default textures.
|
| - ContextState prev_state(NULL, NULL, NULL);
|
| - InitializeContextState(&prev_state, 1, kServiceTextureId);
|
| -
|
| - InSequence sequence;
|
| - // Expect to restore GL_TEXTURE_2D binding to the non-default texture
|
| - // for GL_TEXTURE0 unit.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
|
| -
|
| - // Expect to restore GL_TEXTURE_2D binding to the default texture
|
| - // for GL_TEXTURE1 unit.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE1);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D,
|
| - TestHelper::kServiceDefaultTexture2dId);
|
| + GenHelper<GenQueriesEXTImmediate>(kNewClientId);
|
|
|
| - // Expect to restore active texture unit to GL_TEXTURE0.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| + BeginQueryEXT begin_cmd;
|
| + begin_cmd.Init(GL_COMMANDS_COMPLETED_CHROMIUM,
|
| + kNewClientId,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
|
|
| - GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
|
| -}
|
| + QueryManager* query_manager = decoder_->GetQueryManager();
|
| + ASSERT_TRUE(query_manager != NULL);
|
| + QueryManager::Query* query = query_manager->GetQuery(kNewClientId);
|
| + ASSERT_TRUE(query != NULL);
|
| + EXPECT_FALSE(query->pending());
|
|
|
| -TEST_F(GLES2DecoderRestoreStateTest, DefaultUnit0) {
|
| - InitState init;
|
| - init.gl_version = "3.0";
|
| - InitDecoder(init);
|
| + GLsync kGlSync = reinterpret_cast<GLsync>(0xdeadbeef);
|
| + EXPECT_CALL(*gl_, Flush()).RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0))
|
| + .WillOnce(Return(kGlSync))
|
| + .RetiresOnSaturation();
|
|
|
| - // Bind a non-default texture to GL_TEXTURE1 unit.
|
| - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1));
|
| - SpecializedSetup<ActiveTexture, 0>(true);
|
| - ActiveTexture cmd;
|
| - cmd.Init(GL_TEXTURE1);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EndQueryEXT end_cmd;
|
| + end_cmd.Init(GL_COMMANDS_COMPLETED_CHROMIUM, 1);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
|
| EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| - SetupTexture();
|
| + EXPECT_TRUE(query->pending());
|
| +
|
| + EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _))
|
| + .WillOnce(Return(GL_TIMEOUT_EXPIRED))
|
| + .RetiresOnSaturation();
|
| + bool process_success = query_manager->ProcessPendingQueries();
|
|
|
| - // Construct a previous ContextState with GL_TEXTURE_2D target in
|
| - // GL_TEXTURE0 unit bound to a non-default texture and the rest
|
| - // set to default textures.
|
| - ContextState prev_state(NULL, NULL, NULL);
|
| - InitializeContextState(&prev_state, 0, kServiceTextureId);
|
| + EXPECT_TRUE(process_success);
|
| + EXPECT_TRUE(query->pending());
|
|
|
| - InSequence sequence;
|
| - // Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE0 unit to
|
| - // the 0 texture.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D, 0);
|
| + EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _))
|
| + .WillOnce(Return(GL_ALREADY_SIGNALED))
|
| + .RetiresOnSaturation();
|
| + process_success = query_manager->ProcessPendingQueries();
|
|
|
| - // Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE1 unit to
|
| - // non-default.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE1);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
|
| + EXPECT_TRUE(process_success);
|
| + EXPECT_FALSE(query->pending());
|
| + QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_);
|
| + EXPECT_EQ(static_cast<GLenum>(0), static_cast<GLenum>(sync->result));
|
|
|
| - // Expect to restore active texture unit to GL_TEXTURE1.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE1);
|
| + EXPECT_CALL(*gl_, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation();
|
| + ResetDecoder();
|
| +}
|
|
|
| - GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
|
| +TEST_F(GLES2DecoderTest, IsEnabledReturnsCachedValue) {
|
| + // NOTE: There are no expectations because no GL functions should be
|
| + // called for DEPTH_TEST or STENCIL_TEST
|
| + static const GLenum kStates[] = {
|
| + GL_DEPTH_TEST, GL_STENCIL_TEST,
|
| + };
|
| + for (size_t ii = 0; ii < arraysize(kStates); ++ii) {
|
| + Enable enable_cmd;
|
| + GLenum state = kStates[ii];
|
| + enable_cmd.Init(state);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(enable_cmd));
|
| + IsEnabled::Result* result =
|
| + static_cast<IsEnabled::Result*>(shared_memory_address_);
|
| + IsEnabled is_enabled_cmd;
|
| + is_enabled_cmd.Init(state, shared_memory_id_, shared_memory_offset_);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(is_enabled_cmd));
|
| + EXPECT_NE(0u, *result);
|
| + Disable disable_cmd;
|
| + disable_cmd.Init(state);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(disable_cmd));
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(is_enabled_cmd));
|
| + EXPECT_EQ(0u, *result);
|
| + }
|
| }
|
|
|
| -TEST_F(GLES2DecoderRestoreStateTest, DefaultUnit1) {
|
| +TEST_F(GLES2DecoderManualInitTest, GpuMemoryManagerCHROMIUM) {
|
| InitState init;
|
| + init.extensions = "GL_ARB_texture_rectangle";
|
| init.gl_version = "3.0";
|
| + init.bind_generates_resource = true;
|
| InitDecoder(init);
|
|
|
| - // Bind a non-default texture to GL_TEXTURE0 unit.
|
| - SetupTexture();
|
| + Texture* texture = GetTexture(client_texture_id_)->texture();
|
| + EXPECT_TRUE(texture != NULL);
|
| + EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_UNMANAGED_CHROMIUM);
|
|
|
| - // Construct a previous ContextState with GL_TEXTURE_2D target in
|
| - // GL_TEXTURE1 unit bound to a non-default texture and the rest
|
| - // set to default textures.
|
| - ContextState prev_state(NULL, NULL, NULL);
|
| - InitializeContextState(&prev_state, 1, kServiceTextureId);
|
| + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
|
|
| - InSequence sequence;
|
| - // Expect to restore GL_TEXTURE_2D binding to the non-default texture
|
| - // for GL_TEXTURE0 unit.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
|
| + TexParameteri cmd;
|
| + cmd.Init(GL_TEXTURE_2D,
|
| + GL_TEXTURE_POOL_CHROMIUM,
|
| + GL_TEXTURE_POOL_UNMANAGED_CHROMIUM);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
|
|
| - // Expect to restore GL_TEXTURE_2D binding to the 0 texture
|
| - // for GL_TEXTURE1 unit.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE1);
|
| - AddExpectationsForBindTexture(GL_TEXTURE_2D, 0);
|
| + cmd.Init(GL_TEXTURE_2D,
|
| + GL_TEXTURE_POOL_CHROMIUM,
|
| + GL_TEXTURE_POOL_MANAGED_CHROMIUM);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
|
|
| - // Expect to restore active texture unit to GL_TEXTURE0.
|
| - AddExpectationsForActiveTexture(GL_TEXTURE0);
|
| + EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_MANAGED_CHROMIUM);
|
|
|
| - GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
|
| + cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROMIUM, GL_NONE);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
|
| }
|
|
|
| -// TODO(vmiura): Tests for VAO restore.
|
| +namespace {
|
|
|
| -// TODO(vmiura): Tests for ContextState::RestoreAttribute().
|
| +class SizeOnlyMemoryTracker : public MemoryTracker {
|
| + public:
|
| + SizeOnlyMemoryTracker() {
|
| + // These are the default textures. 1 for TEXTURE_2D and 6 faces for
|
| + // TEXTURE_CUBE_MAP.
|
| + const size_t kInitialUnmanagedPoolSize = 7 * 4;
|
| + const size_t kInitialManagedPoolSize = 0;
|
| + pool_infos_[MemoryTracker::kUnmanaged].initial_size =
|
| + kInitialUnmanagedPoolSize;
|
| + pool_infos_[MemoryTracker::kManaged].initial_size = kInitialManagedPoolSize;
|
| + }
|
|
|
| -// TODO(vmiura): Tests for ContextState::RestoreBufferBindings().
|
| + // Ensure a certain amount of GPU memory is free. Returns true on success.
|
| + MOCK_METHOD1(EnsureGPUMemoryAvailable, bool(size_t size_needed));
|
|
|
| -// TODO(vmiura): Tests for ContextState::RestoreProgramBindings().
|
| + virtual void TrackMemoryAllocatedChange(size_t old_size,
|
| + size_t new_size,
|
| + Pool pool) {
|
| + PoolInfo& info = pool_infos_[pool];
|
| + info.size += new_size - old_size;
|
| + }
|
|
|
| -// TODO(vmiura): Tests for RestoreRenderbufferBindings().
|
| + size_t GetPoolSize(Pool pool) {
|
| + const PoolInfo& info = pool_infos_[pool];
|
| + return info.size - info.initial_size;
|
| + }
|
|
|
| -// TODO(vmiura): Tests for RestoreProgramBindings().
|
| + private:
|
| + virtual ~SizeOnlyMemoryTracker() {}
|
| + struct PoolInfo {
|
| + PoolInfo() : initial_size(0), size(0) {}
|
| + size_t initial_size;
|
| + size_t size;
|
| + };
|
| + std::map<Pool, PoolInfo> pool_infos_;
|
| +};
|
|
|
| -// TODO(vmiura): Tests for RestoreGlobalState().
|
| +} // anonymous namespace.
|
|
|
| -TEST_F(GLES2DecoderManualInitTest, ClearUniformsBeforeFirstProgramUse) {
|
| - CommandLine command_line(0, NULL);
|
| - command_line.AppendSwitchASCII(
|
| - switches::kGpuDriverBugWorkarounds,
|
| - base::IntToString(gpu::CLEAR_UNIFORMS_BEFORE_FIRST_PROGRAM_USE));
|
| +TEST_F(GLES2DecoderManualInitTest, MemoryTrackerInitialSize) {
|
| + scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
|
| + new SizeOnlyMemoryTracker();
|
| + set_memory_tracker(memory_tracker.get());
|
| InitState init;
|
| init.gl_version = "3.0";
|
| - init.has_alpha = true;
|
| - init.request_alpha = true;
|
| init.bind_generates_resource = true;
|
| - InitDecoderWithCommandLine(init, &command_line);
|
| - {
|
| - static AttribInfo attribs[] = {
|
| - { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, },
|
| - { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, },
|
| - { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, },
|
| - };
|
| - static UniformInfo uniforms[] = {
|
| - { kUniform1Name, kUniform1Size, kUniform1Type,
|
| - kUniform1FakeLocation, kUniform1RealLocation,
|
| - kUniform1DesiredLocation },
|
| - { kUniform2Name, kUniform2Size, kUniform2Type,
|
| - kUniform2FakeLocation, kUniform2RealLocation,
|
| - kUniform2DesiredLocation },
|
| - { kUniform3Name, kUniform3Size, kUniform3Type,
|
| - kUniform3FakeLocation, kUniform3RealLocation,
|
| - kUniform3DesiredLocation },
|
| - };
|
| - SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms),
|
| - client_program_id_, kServiceProgramId,
|
| - client_vertex_shader_id_, kServiceVertexShaderId,
|
| - client_fragment_shader_id_, kServiceFragmentShaderId);
|
| - TestHelper::SetupExpectationsForClearingUniforms(
|
| - gl_.get(), uniforms, arraysize(uniforms));
|
| - }
|
| -
|
| - {
|
| - EXPECT_CALL(*gl_, UseProgram(kServiceProgramId))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| - cmds::UseProgram cmd;
|
| - cmd.Init(client_program_id_);
|
| - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - }
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, TexImage2DFloatOnGLES2) {
|
| - InitState init;
|
| - init.extensions = "GL_OES_texture_float";
|
| - init.gl_version = "opengl es 2.0";
|
| InitDecoder(init);
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 17, 0, GL_LUMINANCE,
|
| - GL_FLOAT, 0, 0);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 17, 0, GL_ALPHA, GL_FLOAT,
|
| - 0, 0);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 16, 17, 0,
|
| - GL_LUMINANCE_ALPHA, GL_FLOAT, 0, 0);
|
| + // Expect that initial size - size is 0.
|
| + EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| + EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kManaged));
|
| }
|
|
|
| -TEST_F(GLES2DecoderManualInitTest, TexImage2DFloatOnGLES3) {
|
| +TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexImage2D) {
|
| + scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
|
| + new SizeOnlyMemoryTracker();
|
| + set_memory_tracker(memory_tracker.get());
|
| InitState init;
|
| - init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float";
|
| - init.gl_version = "opengl es 3.0";
|
| + init.gl_version = "3.0";
|
| + init.bind_generates_resource = true;
|
| InitDecoder(init);
|
| DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 17, 0, GL_RGBA, GL_FLOAT, 0,
|
| - 0);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 17, 0, GL_LUMINANCE,
|
| - GL_FLOAT, 0, 0);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 17, 0, GL_ALPHA, GL_FLOAT,
|
| - 0, 0);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 16, 17, 0,
|
| - GL_LUMINANCE_ALPHA, GL_FLOAT, 0, 0);
|
| + EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| + .WillOnce(Return(true))
|
| + .RetiresOnSaturation();
|
| + DoTexImage2D(GL_TEXTURE_2D,
|
| + 0,
|
| + GL_RGBA,
|
| + 8,
|
| + 4,
|
| + 0,
|
| + GL_RGBA,
|
| + GL_UNSIGNED_BYTE,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| + EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| + EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64))
|
| + .WillOnce(Return(true))
|
| + .RetiresOnSaturation();
|
| + DoTexImage2D(GL_TEXTURE_2D,
|
| + 0,
|
| + GL_RGBA,
|
| + 4,
|
| + 4,
|
| + 0,
|
| + GL_RGBA,
|
| + GL_UNSIGNED_BYTE,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| + EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + // Check we get out of memory and no call to glTexImage2D if Ensure fails.
|
| + EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64))
|
| + .WillOnce(Return(false))
|
| + .RetiresOnSaturation();
|
| + TexImage2D cmd;
|
| + cmd.Init(GL_TEXTURE_2D,
|
| + 0,
|
| + GL_RGBA,
|
| + 4,
|
| + 4,
|
| + 0,
|
| + GL_RGBA,
|
| + GL_UNSIGNED_BYTE,
|
| + kSharedMemoryId,
|
| + kSharedMemoryOffset);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| + EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| }
|
|
|
| -TEST_F(GLES2DecoderManualInitTest, TexSubImage2DFloatOnGLES3) {
|
| +TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexStorage2DEXT) {
|
| + scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
|
| + new SizeOnlyMemoryTracker();
|
| + set_memory_tracker(memory_tracker.get());
|
| InitState init;
|
| - init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float";
|
| - init.gl_version = "opengl es 3.0";
|
| + init.gl_version = "3.0";
|
| + init.bind_generates_resource = true;
|
| InitDecoder(init);
|
| - const int kWidth = 8;
|
| - const int kHeight = 4;
|
| DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, kWidth, kHeight, 0, GL_RGBA,
|
| - GL_FLOAT, 0, 0);
|
| - EXPECT_CALL(*gl_, TexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA32F, kWidth, kHeight, 0, GL_RGBA, GL_FLOAT,
|
| - shared_memory_address_))
|
| - .Times(1)
|
| + // Check we get out of memory and no call to glTexStorage2DEXT
|
| + // if Ensure fails.
|
| + EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| + .WillOnce(Return(false))
|
| .RetiresOnSaturation();
|
| - TexSubImage2D cmd;
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_RGBA, GL_FLOAT,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| + TexStorage2DEXT cmd;
|
| + cmd.Init(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 4);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| }
|
|
|
| -TEST_F(GLES2DecoderManualInitTest, TexSubImage2DFloatDoesClearOnGLES3) {
|
| +TEST_F(GLES2DecoderManualInitTest, MemoryTrackerCopyTexImage2D) {
|
| + GLenum target = GL_TEXTURE_2D;
|
| + GLint level = 0;
|
| + GLenum internal_format = GL_RGBA;
|
| + GLsizei width = 4;
|
| + GLsizei height = 8;
|
| + GLint border = 0;
|
| + scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
|
| + new SizeOnlyMemoryTracker();
|
| + set_memory_tracker(memory_tracker.get());
|
| InitState init;
|
| - init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float";
|
| - init.gl_version = "opengl es 3.0";
|
| + init.gl_version = "3.0";
|
| + init.has_alpha = true;
|
| + init.request_alpha = true;
|
| + init.bind_generates_resource = true;
|
| InitDecoder(init);
|
| - const int kWidth = 8;
|
| - const int kHeight = 4;
|
| DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, kWidth, kHeight, 0, GL_RGBA,
|
| - GL_FLOAT, 0, 0);
|
| - SetupClearTextureExpectations(
|
| - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D,
|
| - 0, GL_RGBA32F, GL_RGBA, GL_FLOAT, kWidth, kHeight);
|
| - EXPECT_CALL(*gl_, TexSubImage2D(
|
| - GL_TEXTURE_2D, 0, 1, 0, kWidth - 1, kHeight, GL_RGBA, GL_FLOAT,
|
| - shared_memory_address_))
|
| + EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| + .WillOnce(Return(true))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, GetError())
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_,
|
| + CopyTexImage2D(
|
| + target, level, internal_format, 0, 0, width, height, border))
|
| .Times(1)
|
| .RetiresOnSaturation();
|
| - TexSubImage2D cmd;
|
| - cmd.Init(
|
| - GL_TEXTURE_2D, 0, 1, 0, kWidth - 1, kHeight, GL_RGBA, GL_FLOAT,
|
| - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
|
| + CopyTexImage2D cmd;
|
| + cmd.Init(target, level, internal_format, 0, 0, width, height, border);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + // Check we get out of memory and no call to glCopyTexImage2D if Ensure fails.
|
| + EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| + .WillOnce(Return(false))
|
| + .RetiresOnSaturation();
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| + EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| }
|
|
|
| -TEST_F(GLES2DecoderManualInitTest, TexImage2DFloatConvertsFormatDesktop) {
|
| - InitState init;
|
| - init.extensions = "GL_ARB_texture_float";
|
| - init.gl_version = "2.1";
|
| - InitDecoder(init);
|
| - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 17, 0, GL_RGBA, GL_FLOAT, 0,
|
| - 0);
|
| - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0);
|
| - DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0,
|
| - GL_RGBA, GL_FLOAT, 0, 0, GL_RGBA32F_ARB);
|
| - DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, 0, GL_RGB, 16, 17, 0,
|
| - GL_RGB, GL_FLOAT, 0, 0, GL_RGB32F_ARB);
|
| - DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 17, 0,
|
| - GL_LUMINANCE, GL_FLOAT, 0, 0,
|
| - GL_LUMINANCE32F_ARB);
|
| - DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 17, 0,
|
| - GL_ALPHA, GL_FLOAT, 0, 0, GL_ALPHA32F_ARB);
|
| - DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 16,
|
| - 17, 0, GL_LUMINANCE_ALPHA, GL_FLOAT, 0, 0,
|
| - GL_LUMINANCE_ALPHA32F_ARB);
|
| -}
|
| -
|
| -TEST_F(GLES2DecoderManualInitTest, ReadFormatExtension) {
|
| +TEST_F(GLES2DecoderManualInitTest, MemoryTrackerRenderbufferStorage) {
|
| + scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
|
| + new SizeOnlyMemoryTracker();
|
| + set_memory_tracker(memory_tracker.get());
|
| InitState init;
|
| - init.extensions = "GL_OES_read_format";
|
| - init.gl_version = "2.1";
|
| + init.gl_version = "3.0";
|
| init.bind_generates_resource = true;
|
| InitDecoder(init);
|
| -
|
| + DoBindRenderbuffer(
|
| + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId);
|
| EXPECT_CALL(*gl_, GetError())
|
| .WillOnce(Return(GL_NO_ERROR))
|
| .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, GetError())
|
| - .Times(6)
|
| - .RetiresOnSaturation();
|
| -
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - GetIntegerv cmd;
|
| - const GLuint kFBOClientTextureId = 4100;
|
| - const GLuint kFBOServiceTextureId = 4101;
|
| -
|
| - // Register a texture id.
|
| - EXPECT_CALL(*gl_, GenTextures(_, _))
|
| - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
|
| + EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| + .WillOnce(Return(true))
|
| .RetiresOnSaturation();
|
| - GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
|
| -
|
| - // Setup "render to" texture.
|
| - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
|
| - DoBindFramebuffer(
|
| - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| - DoFramebufferTexture2D(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR);
|
| -
|
| - result->size = 0;
|
| - EXPECT_CALL(*gl_, GetIntegerv(_, _))
|
| + EXPECT_CALL(*gl_, RenderbufferStorageEXT(GL_RENDERBUFFER, GL_RGBA, 8, 4))
|
| .Times(1)
|
| .RetiresOnSaturation();
|
| - cmd.Init(
|
| - GL_IMPLEMENTATION_COLOR_READ_FORMAT,
|
| - shared_memory_id_, shared_memory_offset_);
|
| + RenderbufferStorage cmd;
|
| + cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 8, 4);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(1, result->GetNumResults());
|
| EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - result->size = 0;
|
| - EXPECT_CALL(*gl_, GetIntegerv(_, _))
|
| - .Times(1)
|
| + EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| + // Check we get out of memory and no call to glRenderbufferStorage if Ensure
|
| + // fails.
|
| + EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| + .WillOnce(Return(false))
|
| .RetiresOnSaturation();
|
| - cmd.Init(
|
| - GL_IMPLEMENTATION_COLOR_READ_TYPE,
|
| - shared_memory_id_, shared_memory_offset_);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(1, result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| + EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
|
| }
|
|
|
| -TEST_F(GLES2DecoderManualInitTest, NoReadFormatExtension) {
|
| +TEST_F(GLES2DecoderManualInitTest, MemoryTrackerBufferData) {
|
| + scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
|
| + new SizeOnlyMemoryTracker();
|
| + set_memory_tracker(memory_tracker.get());
|
| InitState init;
|
| - init.gl_version = "2.1";
|
| + init.gl_version = "3.0";
|
| init.bind_generates_resource = true;
|
| InitDecoder(init);
|
| -
|
| + DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
|
| EXPECT_CALL(*gl_, GetError())
|
| .WillOnce(Return(GL_NO_ERROR))
|
| .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| - .WillOnce(Return(GL_NO_ERROR))
|
| .RetiresOnSaturation();
|
| -
|
| - typedef GetIntegerv::Result Result;
|
| - Result* result = static_cast<Result*>(shared_memory_address_);
|
| - GetIntegerv cmd;
|
| - const GLuint kFBOClientTextureId = 4100;
|
| - const GLuint kFBOServiceTextureId = 4101;
|
| -
|
| - // Register a texture id.
|
| - EXPECT_CALL(*gl_, GenTextures(_, _))
|
| - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
|
| + EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| + .WillOnce(Return(true))
|
| .RetiresOnSaturation();
|
| - GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
|
| -
|
| - // Setup "render to" texture.
|
| - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
|
| - DoTexImage2D(
|
| - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
|
| - DoBindFramebuffer(
|
| - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
|
| - DoFramebufferTexture2D(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
| - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR);
|
| -
|
| - result->size = 0;
|
| - EXPECT_CALL(*gl_, GetIntegerv(_, _))
|
| - .Times(0)
|
| + EXPECT_CALL(*gl_, BufferData(GL_ARRAY_BUFFER, 128, _, GL_STREAM_DRAW))
|
| + .Times(1)
|
| .RetiresOnSaturation();
|
| - cmd.Init(
|
| - GL_IMPLEMENTATION_COLOR_READ_FORMAT,
|
| - shared_memory_id_, shared_memory_offset_);
|
| + BufferData cmd;
|
| + cmd.Init(GL_ARRAY_BUFFER, 128, 0, 0, GL_STREAM_DRAW);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(1, result->GetNumResults());
|
| EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| -
|
| - result->size = 0;
|
| - EXPECT_CALL(*gl_, GetIntegerv(_, _))
|
| - .Times(0)
|
| + EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged));
|
| + // Check we get out of memory and no call to glBufferData if Ensure
|
| + // fails.
|
| + EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
|
| + .WillOnce(Return(false))
|
| .RetiresOnSaturation();
|
| - cmd.Init(
|
| - GL_IMPLEMENTATION_COLOR_READ_TYPE,
|
| - shared_memory_id_, shared_memory_offset_);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - EXPECT_EQ(1, result->GetNumResults());
|
| - EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
|
| + EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged));
|
| }
|
|
|
| -// TODO(gman): Complete this test.
|
| -// TEST_F(GLES2DecoderTest, CompressedTexImage2DGLError) {
|
| -// }
|
| -
|
| -// TODO(gman): BufferData
|
| -
|
| -// TODO(gman): BufferDataImmediate
|
| -
|
| -// TODO(gman): BufferSubData
|
| -
|
| -// TODO(gman): BufferSubDataImmediate
|
| -
|
| -// TODO(gman): CompressedTexImage2D
|
| -
|
| -// TODO(gman): CompressedTexImage2DImmediate
|
| -
|
| -// TODO(gman): CompressedTexSubImage2DImmediate
|
| -
|
| -// TODO(gman): DeleteProgram
|
| -
|
| -// TODO(gman): DeleteShader
|
| -
|
| -// TODO(gman): PixelStorei
|
| -
|
| -// TODO(gman): TexImage2D
|
| -
|
| -// TODO(gman): TexImage2DImmediate
|
| -
|
| -// TODO(gman): TexSubImage2DImmediate
|
| -
|
| -// TODO(gman): UseProgram
|
| -
|
| -// TODO(gman): SwapBuffers
|
| -
|
| } // namespace gles2
|
| } // namespace gpu
|
|
|