// 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"
#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"
using ::gfx::MockGLInterface;
using ::testing::_;
+using ::testing::AtLeast;
using ::testing::DoAll;
using ::testing::InSequence;
using ::testing::Invoke;
using ::testing::MatcherCast;
+using ::testing::Mock;
using ::testing::Pointee;
using ::testing::Return;
using ::testing::SaveArg;
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 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());
+// Override default setup so nothing gets setup.
+void GLES2DecoderManualInitTest::SetUp() {
}
-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());
+void GLES2DecoderManualInitTest::EnableDisableTest(GLenum cap,
+ bool enable,
+ bool expect_set) {
+ if (expect_set) {
+ SetupExpectationsForEnableDisable(cap, enable);
+ }
+ if (enable) {
+ Enable cmd;
+ cmd.Init(cap);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ } else {
+ Disable cmd;
+ cmd.Init(cap);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ }
}
-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_P(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_P(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);
-
- AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId);
- SetupExpectationsForApplyingDefaultDirtyState();
+TEST_P(GLES2DecoderTest, SharedIds) {
+ GenSharedIdsCHROMIUM gen_cmd;
+ RegisterSharedIdsCHROMIUM reg_cmd;
+ DeleteSharedIdsCHROMIUM del_cmd;
- 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());
-}
+ 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));
-TEST_F(GLES2DecoderGeometryInstancingTest,
- DrawArraysInstancedANGLEMissingAttributesFails) {
- DoEnableVertexAttribArray(1);
+ 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));
- 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());
-}
-
-TEST_F(GLES2DecoderGeometryInstancingTest,
- DrawArraysInstancedANGLEMissingAttributesZeroCountSucceeds) {
- 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, 0, 1);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(GL_NO_ERROR, 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,
- DrawArraysInstancedANGLEValidAttributesSucceeds) {
- SetupTexture();
- SetupVertexBuffer();
- DoEnableVertexAttribArray(1);
- DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
- AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId);
- SetupExpectationsForApplyingDefaultDirtyState();
+ 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(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());
+ // 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,
- 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_P(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,
- DrawArraysInstancedANGLEInvalidPrimcountFails) {
- SetupVertexBuffer();
- DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
+TEST_P(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));
+}
- EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
- .Times(0);
- DrawArraysInstancedANGLE cmd;
- cmd.Init(GL_TRIANGLES, 0, 1, -1);
+TEST_P(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_P(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_P(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_P(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_P(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_P(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_P(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_P(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_P(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_P(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,
+ static_cast<GLuint>(-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);
+TEST_P(GLES2DecoderManualInitTest, BindGeneratesResourceFalse) {
+ InitState init;
+ init.gl_version = "3.0";
+ InitDecoder(init);
- // 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));
+ BindTexture cmd1;
+ cmd1.Init(GL_TEXTURE_2D, kInvalidClientId);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
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());
-}
+ BindBuffer cmd2;
+ cmd2.Init(GL_ARRAY_BUFFER, kInvalidClientId);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
-TEST_F(GLES2DecoderWithShaderTest, DrawElementsOutOfRangeIndicesFails) {
- SetupVertexBuffer();
- SetupIndexBuffer();
- DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
+ BindFramebuffer cmd3;
+ cmd3.Init(GL_FRAMEBUFFER, kInvalidClientId);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd3));
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
- EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0);
- DrawElements cmd;
- cmd.Init(GL_TRIANGLES, kInvalidIndexRangeCount, GL_UNSIGNED_SHORT,
- kInvalidIndexRangeStart * 2);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ BindRenderbuffer cmd4;
+ cmd4.Init(GL_RENDERBUFFER, kInvalidClientId);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd4));
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);
+TEST_P(GLES2DecoderTest, EnableFeatureCHROMIUMBadBucket) {
+ const uint32 kBadBucketId = 123;
+ EnableFeatureCHROMIUM cmd;
+ cmd.Init(kBadBucketId, shared_memory_id_, shared_memory_offset_);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
+}
- 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_P(GLES2DecoderTest, RequestExtensionCHROMIUMBadBucket) {
+ const uint32 kBadBucketId = 123;
+ RequestExtensionCHROMIUM cmd;
+ cmd.Init(kBadBucketId);
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
}
-TEST_F(GLES2DecoderWithShaderTest, DrawElementsInstancedANGLEFails) {
- SetupTexture();
- SetupVertexBuffer();
- SetupIndexBuffer();
- DoEnableVertexAttribArray(1);
- DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
+TEST_P(GLES2DecoderTest, BeginQueryEXTDisabled) {
+ // Test something fails if off.
+}
- 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));
+TEST_P(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());
-}
-TEST_F(GLES2DecoderGeometryInstancingTest,
- DrawElementsInstancedANGLENoAttributesFails) {
- SetupTexture();
- SetupIndexBuffer();
+ BeginQueryEXT begin_cmd;
- 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));
+ // 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(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)
+ GenHelper<GenQueriesEXTImmediate>(kNewClientId);
+
+ // Test valid parameters work.
+ EXPECT_CALL(*gl_, GenQueriesARB(1, _))
+ .WillOnce(SetArgumentPointee<1>(kNewServiceId))
.RetiresOnSaturation();
- EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 1))
+ EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kNewServiceId))
.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);
+ // 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);
- 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));
+ // 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(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));
+ begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT,
+ kNewClientId,
+ kSharedMemoryId,
+ kSharedMemoryOffset);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(begin_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());
-}
+ // 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_F(GLES2DecoderGeometryInstancingTest,
- DrawElementsInstancedANGLEWithInvalidModeFails) {
- SetupIndexBuffer();
- SetupVertexBuffer();
- DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
+ // Test trying begin again fails
+ EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
- 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());
-}
+ // 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());
-// 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))
+ // Test end succeeds
+ EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT))
.Times(1)
.RetiresOnSaturation();
- DrawElementsInstancedANGLE cmd;
- cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT,
- kValidIndexRangeStart * 2, kNumVertices / 2);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ 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());
-// 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());
+ EXPECT_CALL(*gl_, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation();
}
-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());
+struct QueryType {
+ GLenum type;
+ bool is_gl;
+};
- 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());
-}
+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(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());
-}
+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();
-// 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());
-}
+ BeginQueryEXT begin_cmd;
-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->GenHelper<GenQueriesEXTImmediate>(client_id);
-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());
+ 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();
+ }
- // 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 bad shared memory fails
+ begin_cmd.Init(query_type.type, client_id, shm_id, shm_offset);
+ error::Error error1 = test->ExecuteCmd(begin_cmd);
-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());
+ 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();
+#if DCHECK_IS_ON
+ EXPECT_CALL(*gl, IsSync(kGlSync))
+ .WillOnce(Return(GL_TRUE))
+ .RetiresOnSaturation();
+#endif
+ }
- // 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());
+ EndQueryEXT end_cmd;
+ end_cmd.Init(query_type.type, 1);
+ error::Error error2 = test->ExecuteCmd(end_cmd);
- // Test memory id bad fails.
- cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER,
- kInvalidSharedMemoryId, shared_memory_offset_);
- EXPECT_NE(error::kNoError, ExecuteCmd(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) {
+#if DCHECK_IS_ON
+ EXPECT_CALL(*gl, IsSync(kGlSync))
+ .WillOnce(Return(GL_TRUE))
+ .RetiresOnSaturation();
+#endif
+ EXPECT_CALL(*gl, ClientWaitSync(kGlSync, _, _))
+ .WillOnce(Return(GL_ALREADY_SIGNALED))
+ .RetiresOnSaturation();
+ }
- // Test memory offset bad fails.
- cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER,
- shared_memory_id_, kInvalidSharedMemoryOffset);
- EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
-}
+ QueryManager* query_manager = test->GetDecoder()->GetQueryManager();
+ ASSERT_TRUE(query_manager != NULL);
+ bool process_success = query_manager->ProcessPendingQueries();
-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);
-}
+ EXPECT_TRUE(error1 != error::kNoError || error2 != error::kNoError ||
+ !process_success);
-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);
+ if (query_type.is_gl) {
+ EXPECT_CALL(*gl, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation();
+ }
+ if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) {
+#if DCHECK_IS_ON
+ EXPECT_CALL(*gl, IsSync(kGlSync))
+ .WillOnce(Return(GL_TRUE))
+ .RetiresOnSaturation();
+#endif
+ EXPECT_CALL(*gl, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation();
+ }
+ test->ResetDecoder();
}
-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_P(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryIdFails) {
+ for (size_t i = 0; i < arraysize(kQueryTypes); ++i) {
+ CheckBeginEndQueryBadMemoryFails(this,
+ kNewClientId,
+ kNewServiceId,
+ kQueryTypes[i],
+ kInvalidSharedMemoryId,
+ kSharedMemoryOffset);
+ }
}
-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_P(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(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_P(GLES2DecoderTest, BeginEndQueryEXTCommandsIssuedCHROMIUM) {
+ BeginQueryEXT begin_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;
- typedef GetActiveUniform::Result Result;
- 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;
- typedef GetActiveAttrib::Result Result;
- 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());
-}
-
-static bool ValueInArray(GLint value, GLint* array, GLint count) {
- for (GLint ii = 0; ii < count; ++ii) {
- if (array[ii] == value) {
- return true;
- }
- }
- return false;
-}
-
-TEST_F(GLES2DecoderManualInitTest, GetCompressedTextureFormats) {
- InitState init;
- init.extensions = "GL_EXT_texture_compression_s3tc";
- 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(4, 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_TRUE(ValueInArray(
- GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
- result->GetData(), result->GetNumResults()));
- EXPECT_TRUE(ValueInArray(
- GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
- result->GetData(), result->GetNumResults()));
- EXPECT_TRUE(ValueInArray(
- GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,
- result->GetData(), result->GetNumResults()));
- EXPECT_TRUE(ValueInArray(
- GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
- result->GetData(), result->GetNumResults()));
-
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
-}
-
-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(GLES2DecoderManualInitTest, GetCompressedTextureFormatsETC1) {
- InitState init;
- init.extensions = "GL_OES_compressed_ETC1_RGB8_texture";
- init.gl_version = "opengl es 2.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(1, 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_TRUE(ValueInArray(
- GL_ETC1_RGB8_OES,
- result->GetData(), result->GetNumResults()));
- EXPECT_EQ(GL_NO_ERROR, 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, 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));
- }
-}
-
-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));
- }
-}
-
-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();
- begin_cmd.Init(
- GL_ANY_SAMPLES_PASSED_EXT, 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 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_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";
- 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();
- }
-
- 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();
- }
-
- 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();
- }
- 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(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 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, 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);
+ GenHelper<GenQueriesEXTImmediate>(kNewClientId);
- 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 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());
- 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);
-}
+ 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(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);
+ // 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());
}
-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);
+TEST_P(GLES2DecoderTest, BeginEndQueryEXTGetErrorQueryCHROMIUM) {
+ BeginQueryEXT begin_cmd;
- 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());
+ GenHelper<GenQueriesEXTImmediate>(kNewClientId);
- const int32 kImageId = 1;
- scoped_refptr<MockGLImage> image(new MockGLImage);
- group().image_manager()->AddImage(image.get(), kImageId);
+ // 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());
- // 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));
+ 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());
- AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
- SetupExpectationsForApplyingDefaultDirtyState();
+ // Test end succeeds
+ QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_);
- // 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)
+ .WillOnce(Return(GL_INVALID_VALUE))
.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));
+ 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());
-
- // 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));
+ EXPECT_FALSE(query->pending());
+ EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE),
+ static_cast<GLenum>(sync->result));
}
-TEST_F(GLES2DecoderManualInitTest, DrawWithGLImageExternal) {
+TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTCommandsCompletedCHROMIUM) {
InitState init;
- init.extensions = "GL_OES_EGL_image_external";
+ init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync";
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);
+ 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());
- SetupSamplerExternalProgram();
- SetupIndexBuffer();
- AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0);
- SetupExpectationsForApplyingDefaultDirtyState();
- EXPECT_TRUE(group().texture_manager()->CanRender(texture_ref));
+ 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());
- 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))
+ 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();
- EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
- .Times(1)
+#if DCHECK_IS_ON
+ EXPECT_CALL(*gl_, IsSync(kGlSync))
+ .WillOnce(Return(GL_TRUE))
.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());
+#endif
- cmd.Init(GL_TEXTURE_2D,
- GL_TEXTURE_POOL_CHROMIUM,
- GL_TEXTURE_POOL_MANAGED_CHROMIUM);
- 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());
+ EXPECT_TRUE(query->pending());
- 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);
+#if DCHECK_IS_ON
+ EXPECT_CALL(*gl_, IsSync(kGlSync))
+ .WillOnce(Return(GL_TRUE))
+ .RetiresOnSaturation();
+#endif
+ EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _))
+ .WillOnce(Return(GL_TIMEOUT_EXPIRED))
+ .RetiresOnSaturation();
+ bool process_success = query_manager->ProcessPendingQueries();
- // 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);
- AsyncTexSubImage2DCHROMIUM texsubimage_cmd;
- texsubimage_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGBA,
- GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset);
- WaitAsyncTexImage2DCHROMIUM wait_cmd;
- wait_cmd.Init(GL_TEXTURE_2D);
-
- // 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_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));
- }
- {
- // 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());
- }
+ EXPECT_TRUE(process_success);
+ EXPECT_TRUE(query->pending());
- // 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);
- }
+#if DCHECK_IS_ON
+ EXPECT_CALL(*gl_, IsSync(kGlSync))
+ .WillOnce(Return(GL_TRUE))
+ .RetiresOnSaturation();
+#endif
+ EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _))
+ .WillOnce(Return(GL_ALREADY_SIGNALED))
+ .RetiresOnSaturation();
+ process_success = query_manager->ProcessPendingQueries();
- // AsyncTexSubImage2D
- decoder_->GetAsyncPixelTransferManager()
- ->ClearPixelTransferDelegateForTest(texture_ref);
- 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());
- }
+ 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));
- // Delete delegate on DeleteTexture.
- {
- EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation();
- DoDeleteTexture(client_texture_id_, kServiceTextureId);
- EXPECT_FALSE(
- decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
- texture_ref));
- delegate = NULL;
- }
+#if DCHECK_IS_ON
+ EXPECT_CALL(*gl_, IsSync(kGlSync))
+ .WillOnce(Return(GL_TRUE))
+ .RetiresOnSaturation();
+#endif
+ EXPECT_CALL(*gl_, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation();
+ ResetDecoder();
+}
- // WaitAsyncTexImage2D
- {
- // Get a fresh texture since the existing texture cannot be respecified
- // asynchronously and AsyncTexSubImage2D does not involved 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());
+TEST_P(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, AsyncPixelTransferManager) {
+TEST_P(GLES2DecoderManualInitTest, GpuMemoryManagerCHROMIUM) {
InitState init;
- init.extensions = "GL_CHROMIUM_async_pixel_transfers";
+ init.extensions = "GL_ARB_texture_rectangle";
init.gl_version = "3.0";
init.bind_generates_resource = true;
InitDecoder(init);
- // Set up the texture.
+ 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);
- 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);
-
- // 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());
- }
+ 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());
- // Delegate is cached.
- EXPECT_EQ(delegate,
- decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate(
- texture_ref));
+ 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());
- // Delete delegate on manager teardown.
- {
- EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation();
- decoder_->ResetAsyncPixelTransferManagerForTest();
+ EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_MANAGED_CHROMIUM);
- // Texture ref still valid.
- EXPECT_EQ(texture_ref, GetTexture(client_texture_id_));
- }
+ cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROMIUM, GL_NONE);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
}
namespace {
const size_t kInitialManagedPoolSize = 0;
pool_infos_[MemoryTracker::kUnmanaged].initial_size =
kInitialUnmanagedPoolSize;
- pool_infos_[MemoryTracker::kManaged].initial_size =
- kInitialManagedPoolSize;
+ 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) {
+ virtual void TrackMemoryAllocatedChange(size_t old_size,
+ size_t new_size,
+ Pool pool) {
PoolInfo& info = pool_infos_[pool];
info.size += new_size - old_size;
}
}
private:
- virtual ~SizeOnlyMemoryTracker() {
- }
+ virtual ~SizeOnlyMemoryTracker() {}
struct PoolInfo {
- PoolInfo()
- : initial_size(0),
- size(0) {
- }
+ PoolInfo() : initial_size(0), size(0) {}
size_t initial_size;
size_t size;
};
} // anonymous namespace.
-TEST_F(GLES2DecoderManualInitTest, MemoryTrackerInitialSize) {
+TEST_P(GLES2DecoderManualInitTest, MemoryTrackerInitialSize) {
scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
new SizeOnlyMemoryTracker();
set_memory_tracker(memory_tracker.get());
EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kManaged));
}
-TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexImage2D) {
+TEST_P(GLES2DecoderManualInitTest, MemoryTrackerTexImage2D) {
scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
new SizeOnlyMemoryTracker();
set_memory_tracker(memory_tracker.get());
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);
+ .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);
+ .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();
+ .WillOnce(Return(false))
+ .RetiresOnSaturation();
TexImage2D cmd;
- cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
- kSharedMemoryId, kSharedMemoryOffset);
+ cmd.Init(GL_TEXTURE_2D,
+ 0,
+ GL_RGBA,
+ 4,
+ 4,
+ 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, MemoryTrackerTexStorage2DEXT) {
+TEST_P(GLES2DecoderManualInitTest, MemoryTrackerTexStorage2DEXT) {
scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
new SizeOnlyMemoryTracker();
set_memory_tracker(memory_tracker.get());
// 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();
+ .WillOnce(Return(false))
+ .RetiresOnSaturation();
TexStorage2DEXT cmd;
cmd.Init(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 4);
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
}
-TEST_F(GLES2DecoderManualInitTest, MemoryTrackerCopyTexImage2D) {
+TEST_P(GLES2DecoderManualInitTest, MemoryTrackerCopyTexImage2D) {
GLenum target = GL_TEXTURE_2D;
GLint level = 0;
GLenum internal_format = GL_RGBA;
InitDecoder(init);
DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
- .WillOnce(Return(true)).RetiresOnSaturation();
+ .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))
+ 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);
+ cmd.Init(target, level, internal_format, 0, 0, width, height);
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();
+ .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) {
+TEST_P(GLES2DecoderManualInitTest, MemoryTrackerRenderbufferStorage) {
scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
new SizeOnlyMemoryTracker();
set_memory_tracker(memory_tracker.get());
init.gl_version = "3.0";
init.bind_generates_resource = true;
InitDecoder(init);
- DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
- kServiceRenderbufferId);
+ DoBindRenderbuffer(
+ GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId);
+ EnsureRenderbufferBound(false);
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))
+ .WillOnce(Return(true))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, RenderbufferStorageEXT(GL_RENDERBUFFER, GL_RGBA, 8, 4))
.Times(1)
.RetiresOnSaturation();
RenderbufferStorage cmd;
// 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();
+ .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, MemoryTrackerBufferData) {
+TEST_P(GLES2DecoderManualInitTest, MemoryTrackerBufferData) {
scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
new SizeOnlyMemoryTracker();
set_memory_tracker(memory_tracker.get());
init.gl_version = "3.0";
init.bind_generates_resource = true;
InitDecoder(init);
- DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_,
- kServiceBufferId);
+ 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();
+ .WillOnce(Return(true))
+ .RetiresOnSaturation();
EXPECT_CALL(*gl_, BufferData(GL_ARRAY_BUFFER, 128, _, GL_STREAM_DRAW))
.Times(1)
.RetiresOnSaturation();
// 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();
+ .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));
}
-TEST_F(GLES2DecoderTest, DrawBuffersEXTImmediateSuccceeds) {
- const GLsizei count = 1;
- const GLenum bufs[] = { GL_COLOR_ATTACHMENT0 };
- DrawBuffersEXTImmediate& cmd =
- *GetImmediateAs<DrawBuffersEXTImmediate>();
- cmd.Init(count, bufs);
-
- DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
- kServiceFramebufferId);
- EXPECT_CALL(*gl_, DrawBuffersARB(count, _))
- .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);
-
- DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
- kServiceFramebufferId);
- EXPECT_EQ(error::kNoError,
- ExecuteImmediateCmd(cmd, sizeof(bufs)));
- 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);
-
- DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
- kServiceFramebufferId);
- EXPECT_EQ(error::kNoError,
- ExecuteImmediateCmd(cmd, sizeof(bufs)));
- EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
-
- DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); // unbind
-
- EXPECT_CALL(*gl_, DrawBuffersARB(count, _))
- .Times(1)
- .RetiresOnSaturation();
-
- EXPECT_EQ(error::kNoError,
- ExecuteImmediateCmd(cmd, sizeof(bufs)));
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
-}
-
-TEST_F(GLES2DecoderManualInitTest, InvalidateFramebufferBinding) {
- InitState init;
- init.gl_version = "opengl es 3.0";
- InitDecoder(init);
-
- // 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"));
-}
-
-TEST_F(GLES2DecoderManualInitTest, DiscardFramebufferEXT) {
- InitState init;
- init.extensions = "GL_EXT_discard_framebuffer";
- init.gl_version = "opengl es 2.0";
- InitDecoder(init);
-
- // EXPECT_EQ can't be used to compare function pointers
- EXPECT_TRUE(
- gfx::MockGLInterface::GetGLProcAddress("glDiscardFramebufferEXT") ==
- gfx::g_driver_gl.fn.glDiscardFramebufferEXTFn);
-
- const GLenum target = GL_FRAMEBUFFER;
- const GLsizei count = 1;
- const GLenum attachments[] = { GL_COLOR_ATTACHMENT0 };
-
- 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());
-
- EXPECT_CALL(*gl_, DiscardFramebufferEXT(target, count, _))
- .Times(1)
- .RetiresOnSaturation();
- DiscardFramebufferEXTImmediate& cmd =
- *GetImmediateAs<DiscardFramebufferEXTImmediate>();
- cmd.Init(target, count, attachments);
-
- EXPECT_EQ(error::kNoError,
- ExecuteImmediateCmd(cmd, sizeof(attachments)));
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
- EXPECT_FALSE(framebuffer->IsCleared());
-}
-
-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);
-
- // Should not result into a call into GL.
- EXPECT_EQ(error::kNoError,
- ExecuteImmediateCmd(cmd, sizeof(attachments)));
- EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
-}
-
-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,
- TestHelper::kServiceDefaultTextureCubemapId);
-
- // 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);
- }
-
- // Expect to restore the active texture unit to GL_TEXTURE0.
- AddExpectationsForActiveTexture(GL_TEXTURE0);
-
- GetDecoder()->RestoreAllTextureUnitBindings(NULL);
-}
-
-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(GLES2DecoderRestoreStateTest, ActiveUnit1) {
- InitState init;
- init.gl_version = "3.0";
- InitDecoder(init);
-
- // 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));
- 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);
-
- GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
-}
-
-TEST_F(GLES2DecoderRestoreStateTest, NonDefaultUnit0) {
- InitState init;
- init.gl_version = "3.0";
- InitDecoder(init);
-
- // 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();
-
- // 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);
-
- 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);
-
- // Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE1 unit to
- // non-default.
- AddExpectationsForActiveTexture(GL_TEXTURE1);
- AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
-
- // Expect to restore active texture unit to GL_TEXTURE1.
- AddExpectationsForActiveTexture(GL_TEXTURE1);
-
- GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
-}
-
-TEST_F(GLES2DecoderRestoreStateTest, NonDefaultUnit1) {
- InitState init;
- init.gl_version = "3.0";
- 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);
-
- // Expect to restore active texture unit to GL_TEXTURE0.
- AddExpectationsForActiveTexture(GL_TEXTURE0);
-
- GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
-}
-
-TEST_F(GLES2DecoderManualInitTest, ClearUniformsBeforeFirstProgramUse) {
- CommandLine command_line(0, NULL);
- command_line.AppendSwitchASCII(
- switches::kGpuDriverBugWorkarounds,
- base::IntToString(gpu::CLEAR_UNIFORMS_BEFORE_FIRST_PROGRAM_USE));
+TEST_P(GLES2DecoderManualInitTest, ImmutableCopyTexImage2D) {
+ const GLenum kTarget = GL_TEXTURE_2D;
+ const GLint kLevel = 0;
+ const GLenum kInternalFormat = GL_RGBA;
+ const GLenum kSizedInternalFormat = GL_RGBA8;
+ const GLsizei kWidth = 4;
+ const GLsizei kHeight = 8;
+ const GLint kBorder = 0;
InitState init;
+ init.extensions = "GL_EXT_texture_storage";
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);
-}
-TEST_F(GLES2DecoderManualInitTest, TexImage2DFloatOnGLES3) {
- InitState init;
- init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float";
- init.gl_version = "opengl es 3.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_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);
-}
+ // CopyTexImage2D will call arbitrary amount of GetErrors.
+ EXPECT_CALL(*gl_, GetError())
+ .Times(AtLeast(1));
-TEST_F(GLES2DecoderManualInitTest, TexSubImage2DFloatOnGLES3) {
- InitState init;
- init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float";
- init.gl_version = "opengl es 3.0";
- 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)
- .RetiresOnSaturation();
- TexSubImage2D cmd;
- cmd.Init(
- GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_RGBA, GL_FLOAT,
- kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_CALL(*gl_,
+ CopyTexImage2D(
+ kTarget, kLevel, kInternalFormat, 0, 0, kWidth, kHeight,
+ kBorder))
+ .Times(1);
+
+ EXPECT_CALL(*gl_,
+ TexStorage2DEXT(
+ kTarget, kLevel, kSizedInternalFormat, kWidth, kHeight))
+ .Times(1);
+ CopyTexImage2D copy_cmd;
+ copy_cmd.Init(kTarget, kLevel, kInternalFormat, 0, 0, kWidth, kHeight);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd));
EXPECT_EQ(GL_NO_ERROR, GetGLError());
-}
-TEST_F(GLES2DecoderManualInitTest, TexSubImage2DFloatDoesClearOnGLES3) {
- InitState init;
- init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float";
- init.gl_version = "opengl es 3.0";
- 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_))
- .Times(1)
- .RetiresOnSaturation();
- TexSubImage2D cmd;
- cmd.Init(
- GL_TEXTURE_2D, 0, 1, 0, kWidth - 1, kHeight, GL_RGBA, GL_FLOAT,
- kSharedMemoryId, kSharedMemoryOffset, GL_FALSE);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ TexStorage2DEXT storage_cmd;
+ storage_cmd.Init(kTarget, kLevel, kSizedInternalFormat, kWidth, kHeight);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(storage_cmd));
EXPECT_EQ(GL_NO_ERROR, GetGLError());
-}
-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);
+ // This should not invoke CopyTexImage2D.
+ copy_cmd.Init(kTarget, kLevel, kInternalFormat, 0, 0, kWidth, kHeight);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd));
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
}
-TEST_F(GLES2DecoderManualInitTest, ReadFormatExtension) {
- InitState init;
- init.extensions = "GL_OES_read_format";
- init.gl_version = "2.1";
- 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();
- 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))
- .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(1)
- .RetiresOnSaturation();
- cmd.Init(
- GL_IMPLEMENTATION_COLOR_READ_FORMAT,
- shared_memory_id_, shared_memory_offset_);
- 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)
- .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());
+TEST_P(GLES2DecoderTest, LoseContextCHROMIUMValidArgs) {
+ EXPECT_CALL(*mock_decoder_, LoseContext(GL_GUILTY_CONTEXT_RESET_ARB))
+ .Times(1);
+ cmds::LoseContextCHROMIUM cmd;
+ cmd.Init(GL_GUILTY_CONTEXT_RESET_ARB, GL_GUILTY_CONTEXT_RESET_ARB);
+ EXPECT_EQ(error::kLostContext, ExecuteCmd(cmd));
EXPECT_EQ(GL_NO_ERROR, GetGLError());
}
-TEST_F(GLES2DecoderManualInitTest, NoReadFormatExtension) {
- InitState init;
- init.gl_version = "2.1";
- 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;
- 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);
-
- result->size = 0;
- EXPECT_CALL(*gl_, GetIntegerv(_, _))
- .Times(0)
- .RetiresOnSaturation();
- cmd.Init(
- GL_IMPLEMENTATION_COLOR_READ_FORMAT,
- shared_memory_id_, shared_memory_offset_);
+TEST_P(GLES2DecoderTest, LoseContextCHROMIUMInvalidArgs0_0) {
+ EXPECT_CALL(*mock_decoder_, LoseContext(_))
+ .Times(0);
+ cmds::LoseContextCHROMIUM cmd;
+ cmd.Init(GL_NONE, GL_GUILTY_CONTEXT_RESET_ARB);
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(1, result->GetNumResults());
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
+}
- result->size = 0;
- EXPECT_CALL(*gl_, GetIntegerv(_, _))
- .Times(0)
- .RetiresOnSaturation();
- cmd.Init(
- GL_IMPLEMENTATION_COLOR_READ_TYPE,
- shared_memory_id_, shared_memory_offset_);
+TEST_P(GLES2DecoderTest, LoseContextCHROMIUMInvalidArgs1_0) {
+ EXPECT_CALL(*mock_decoder_, LoseContext(_))
+ .Times(0);
+ cmds::LoseContextCHROMIUM cmd;
+ cmd.Init(GL_GUILTY_CONTEXT_RESET_ARB, GL_NONE);
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(1, result->GetNumResults());
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
}
-// 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
+INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderTest, ::testing::Bool());
-// TODO(gman): TexSubImage2DImmediate
+INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderWithShaderTest, ::testing::Bool());
-// TODO(gman): UseProgram
+INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderManualInitTest, ::testing::Bool());
-// TODO(gman): SwapBuffers
+INSTANTIATE_TEST_CASE_P(Service,
+ GLES2DecoderRGBBackbufferTest,
+ ::testing::Bool());
} // namespace gles2
} // namespace gpu