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

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

Issue 521018: A bunch of unit tests for GLES2 (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
===================================================================
--- gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc (revision 35431)
+++ gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc (working copy)
@@ -5,35 +5,139 @@
#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
#include "gpu/command_buffer/common/gles2_cmd_format.h"
#include "gpu/command_buffer/service/gl_mock.h"
+#include "gpu/command_buffer/service/cmd_buffer_engine.h"
#include "testing/gtest/include/gtest/gtest.h"
using ::testing::_;
using ::testing::Return;
using ::testing::SetArgumentPointee;
+using ::testing::InSequence;
+using ::testing::Pointee;
namespace gpu {
namespace gles2 {
class GLES2DecoderTest : public testing::Test {
+ public:
+ GLES2DecoderTest()
+ : client_buffer_id_(100),
+ client_framebuffer_id_(101),
+ client_program_id_(102),
+ client_renderbuffer_id_(103),
+ client_shader_id_(104),
+ client_texture_id_(105) {
+ memset(immediate_buffer_, 0xEE, sizeof(immediate_buffer_));
+ }
+
protected:
+ static const GLint kNumVertexAttribs = 16;
+
+ static const GLuint kServiceBufferId = 301;
+ static const GLuint kServiceFramebufferId = 302;
+ static const GLuint kServiceRenderbufferId = 303;
+ static const GLuint kServiceTextureId = 304;
+ static const GLuint kServiceProgramId = 305;
+ static const GLuint kServiceShaderId = 306;
+
+ static const int32 kSharedMemoryId = 401;
+ static const size_t kSharedBufferSize = 2048;
+ static const uint32 kSharedMemoryOffset = 132;
+ static const int32 kInvalidSharedMemoryId = 402;
+ static const uint32 kInvalidSharedMemoryOffset = kSharedBufferSize + 1;
+
+ static const uint32 kNewClientId = 501;
+ static const uint32 kNewServiceId = 502;
+ static const uint32 kInvalidClientId = 601;
+
+ // Template to call glGenXXX functions.
+ template <typename T>
+ void GenHelper(GLuint client_id) {
+ int8 buffer[sizeof(T) + sizeof(client_id)];
+ T& cmd = *reinterpret_cast<T*>(&buffer);
+ cmd.Init(1, &client_id);
+ EXPECT_EQ(parse_error::kParseNoError,
+ ExecuteImmediateCmd(cmd, sizeof(client_id)));
+ }
+
+ // This template exists solely so we can specialize it for
+ // certain commands.
+ template <typename T, int id>
+ void SpecializedSetup() {
+ }
+
+ template <typename T>
+ T* GetImmediateAs() {
+ return reinterpret_cast<T*>(immediate_buffer_);
+ }
+
+ template <typename T, typename Command>
+ T GetImmediateDataAs(Command* cmd) {
+ reinterpret_cast<T>(ImmediateDataAddress(cmd));
+ }
+
virtual void SetUp() {
- gl_ = new ::gles2::MockGLInterface();
- ::gles2::GLInterface::SetGLInterface(gl_);
+ gl_.reset(new ::gles2::MockGLInterface());
+ ::gles2::GLInterface::SetGLInterface(gl_.get());
- EXPECT_CALL(*gl_, GetIntegerv(_, _))
- .WillOnce(SetArgumentPointee<1>(16));
+ EXPECT_CALL(*gl_, GetIntegerv(GL_MAX_VERTEX_ATTRIBS, _))
+ .WillOnce(SetArgumentPointee<1>(kNumVertexAttribs))
+ .RetiresOnSaturation();
EXPECT_CALL(*gl_, GetError())
.WillRepeatedly(Return(GL_NO_ERROR));
- decoder_ = GLES2Decoder::Create();
+ engine_.reset(new MockCommandBufferEngine());
+ Buffer buffer = engine_->GetSharedMemoryBuffer(kSharedMemoryId);
+ shared_memory_offset_ = kSharedMemoryOffset;
+ shared_memory_address_ = reinterpret_cast<int8*>(buffer.ptr) +
+ shared_memory_offset_;
+ shared_memory_id_ = kSharedMemoryId;
+
+ decoder_.reset(GLES2Decoder::Create());
decoder_->Initialize();
+ decoder_->set_engine(engine_.get());
+
+ EXPECT_CALL(*gl_, GenBuffersARB(_, _))
+ .WillOnce(SetArgumentPointee<1>(kServiceBufferId))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GenFramebuffersEXT(_, _))
+ .WillOnce(SetArgumentPointee<1>(kServiceFramebufferId))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GenRenderbuffersEXT(_, _))
+ .WillOnce(SetArgumentPointee<1>(kServiceRenderbufferId))
+ .RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GenTextures(_, _))
+ .WillOnce(SetArgumentPointee<1>(kServiceTextureId))
+ .RetiresOnSaturation();
+
+ GenHelper<GenBuffersImmediate>(client_buffer_id_);
+ GenHelper<GenFramebuffersImmediate>(client_framebuffer_id_);
+ GenHelper<GenRenderbuffersImmediate>(client_renderbuffer_id_);
+ GenHelper<GenTexturesImmediate>(client_texture_id_);
+
+ {
+ EXPECT_CALL(*gl_, CreateProgram())
+ .Times(1)
+ .WillOnce(Return(kServiceProgramId))
+ .RetiresOnSaturation();
+ CreateProgram cmd;
+ cmd.Init(client_program_id_);
+ EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(cmd));
+ }
+
+ {
+ EXPECT_CALL(*gl_, CreateShader(_))
+ .Times(1)
+ .WillOnce(Return(kServiceShaderId))
+ .RetiresOnSaturation();
+ CreateShader cmd;
+ cmd.Init(GL_VERTEX_SHADER, client_shader_id_);
+ EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(cmd));
+ }
}
virtual void TearDown() {
decoder_->Destroy();
- delete decoder_;
::gles2::GLInterface::SetGLInterface(NULL);
- delete gl_;
}
template <typename T>
@@ -47,22 +151,77 @@
template <typename T>
parse_error::ParseError ExecuteImmediateCmd(const T& cmd, size_t data_size) {
COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN);
- return decoder_.DoCommand(cmd.kCmdId,
- ComputeNumEntries(sizeof(cmd) + data_size) - 1,
- &cmd);
+ return decoder_->DoCommand(cmd.kCmdId,
+ ComputeNumEntries(sizeof(cmd) + data_size) - 1,
+ &cmd);
}
- ::gles2::MockGLInterface* gl_;
- GLES2Decoder* decoder_;
+ template <typename T>
+ T GetSharedMemoryAs() {
+ return reinterpret_cast<T>(shared_memory_address_);
+ }
+
+ uint32 GetServiceId(uint32 client_id) {
+ return decoder_->GetServiceIdForTesting(client_id);
+ }
+
+ scoped_ptr<::gles2::MockGLInterface> gl_;
+ scoped_ptr<GLES2Decoder> decoder_;
+
+ GLuint client_buffer_id_;
+ GLuint client_framebuffer_id_;
+ GLuint client_program_id_;
+ GLuint client_renderbuffer_id_;
+ GLuint client_shader_id_;
+ GLuint client_texture_id_;
+
+ uint32 shared_memory_id_;
+ uint32 shared_memory_offset_;
+ void* shared_memory_address_;
+
+ int8 immediate_buffer_[256];
+
+ private:
+ class MockCommandBufferEngine : public CommandBufferEngine {
+ public:
+ MockCommandBufferEngine() {
+ data_.reset(new int8[kSharedBufferSize]);
+ valid_buffer_.ptr = data_.get();
+ valid_buffer_.size = kSharedBufferSize;
+ }
+
+ virtual ~MockCommandBufferEngine() {
+ }
+
+ Buffer GetSharedMemoryBuffer(int32 shm_id) {
+ return shm_id == kSharedMemoryId ? valid_buffer_ : invalid_buffer_;
+ }
+
+ void set_token(int32 token) {
+ DCHECK(false);
+ }
+
+ private:
+ scoped_array<int8> data_;
+ Buffer valid_buffer_;
+ Buffer invalid_buffer_;
+ };
+
+ scoped_ptr<MockCommandBufferEngine> engine_;
};
-TEST_F(GLES2DecoderTest, Enable) {
- EXPECT_CALL(*gl_, Enable(GL_BLEND));
+template <>
+void GLES2DecoderTest::SpecializedSetup<LinkProgram, 0>() {
+ InSequence dummy;
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_ACTIVE_ATTRIBUTES, _))
+ .WillOnce(SetArgumentPointee<2>(0));
+ EXPECT_CALL(
+ *gl_,
+ GetProgramiv(kServiceProgramId, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, _))
+ .WillOnce(SetArgumentPointee<2>(0));
+};
- Enable cmd;
- cmd.Init(GL_BLEND);
- EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(cmd));
-}
+#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_autogen.h"
} // namespace gles2
} // namespace gpu

Powered by Google App Engine
This is Rietveld 408576698