From 1c5d235c4da4cf7a7df6757f11e80035bc4fd1c7 Mon Sep 17 00:00:00 2001 From: ExMix Date: Fri, 15 Nov 2013 16:55:06 +0300 Subject: [PATCH] Test for insert triangle list into batcher --- drape/drape_tests/batcher_tests.cpp | 164 ++++++++++++++++++++++++++++ drape/drape_tests/drape_tests.pro | 3 +- 2 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 drape/drape_tests/batcher_tests.cpp diff --git a/drape/drape_tests/batcher_tests.cpp b/drape/drape_tests/batcher_tests.cpp new file mode 100644 index 0000000000..1b7752bbbc --- /dev/null +++ b/drape/drape_tests/batcher_tests.cpp @@ -0,0 +1,164 @@ +#include "../../testing/testing.hpp" + +#include "../glconstants.hpp" +#include "../batcher.hpp" +#include "../gpu_program_manager.hpp" + +#include "glmock_functions.hpp" + +#include + +using testing::_; +using testing::Return; +using testing::InSequence; +using testing::Invoke; +using testing::IgnoreResult; +using testing::AnyOf; + +namespace +{ + class VAOAcceptor : public IBatchFlush + { + public: + VAOAcceptor(ReferencePoiner program) + : m_program(program) + { + } + + virtual void FlushFullBucket(const GLState & state, OwnedPointer bucket) + { + bucket->Build(m_program); + bucket.Destroy(); + } + + private: + ReferencePoiner m_program; + }; + + struct MemoryComparer + { + void * m_mem; + int m_size; + + MemoryComparer(void * memory, int size) + : m_mem(memory) + , m_size(size) + { + } + + void cmp(glConst /*type*/, uint32_t size, void const * data, uint32_t /*offset*/) + { + TEST_EQUAL(size, m_size, ()); + TEST_EQUAL(memcmp(m_mem, data, size), 0, ()); + } + }; +} + +UNIT_TEST(BatchLists_Test) +{ + const uint32_t VertexShaderID = 10; + const uint32_t FragmentShaderID = 11; + const uint32_t ProgramID = 20; + + const uint32_t IndexBufferID = 1; + const uint32_t DataBufferID = 2; + const uint32_t VaoID = 3; + + const int VERTEX_COUNT = 10; + float data[3 * VERTEX_COUNT]; + for (int i = 0; i < VERTEX_COUNT * 3; ++i) + data[i] = (float)i; + + unsigned short indexes[VERTEX_COUNT]; + for (int i = 0; i < VERTEX_COUNT; ++i) + indexes[i] = i; + + MemoryComparer dataCmp(data, 3 * VERTEX_COUNT * sizeof(float)); + MemoryComparer indexCmp(indexes, VERTEX_COUNT * sizeof(unsigned short)); + + { + InSequence shaderSeq; + EXPECTGL(glCreateShader(GLConst::GLVertexShader)).WillOnce(Return(VertexShaderID)); + EXPECTGL(glShaderSource(VertexShaderID, _)); + EXPECTGL(glCompileShader(VertexShaderID, _)).WillOnce(Return(true)); + + EXPECTGL(glCreateShader(GLConst::GLFragmentShader)).WillOnce(Return(FragmentShaderID)); + EXPECTGL(glShaderSource(FragmentShaderID, _)); + EXPECTGL(glCompileShader(FragmentShaderID, _)).WillOnce(Return(true)); + + EXPECTGL(glCreateProgram()).WillOnce(Return(ProgramID)); + EXPECTGL(glAttachShader(ProgramID, VertexShaderID)); + EXPECTGL(glAttachShader(ProgramID, FragmentShaderID)); + EXPECTGL(glLinkProgram(ProgramID, _)).WillOnce(Return(true)); + EXPECTGL(glDetachShader(ProgramID, VertexShaderID)); + EXPECTGL(glDetachShader(ProgramID, FragmentShaderID)); + + EXPECTGL(glDeleteShader(AnyOf(10, 11))).Times(2); + } + + GpuProgramManager * pm = new GpuProgramManager(); + VAOAcceptor acceptor(pm->GetProgram(0)); + Batcher batcher(ReferencePoiner((IBatchFlush *)&acceptor)); + + { + InSequence vaoSeq; + // Index buffer creation + EXPECTGL(glGenBuffer()).WillOnce(Return(IndexBufferID)); + EXPECTGL(glBindBuffer(IndexBufferID, GLConst::GLElementArrayBuffer)); + EXPECTGL(glBufferData(GLConst::GLElementArrayBuffer, _, NULL, _)); + + // upload indexes + EXPECTGL(glBindBuffer(IndexBufferID, GLConst::GLElementArrayBuffer)); + EXPECTGL(glBufferSubData(GLConst::GLElementArrayBuffer, VERTEX_COUNT * sizeof(unsigned short), _, 0)) + .WillOnce(Invoke(&indexCmp, &MemoryComparer::cmp)); + + // data buffer creation + EXPECTGL(glGenBuffer()).WillOnce(Return(DataBufferID)); + EXPECTGL(glBindBuffer(DataBufferID, GLConst::GLArrayBuffer)); + EXPECTGL(glBufferData(GLConst::GLArrayBuffer, _, NULL, _)); + + // upload data + EXPECTGL(glBindBuffer(DataBufferID, GLConst::GLArrayBuffer)); + EXPECTGL(glBufferSubData(GLConst::GLArrayBuffer, 3 * VERTEX_COUNT * sizeof(float), _, 0)) + .WillOnce(Invoke(&dataCmp, &MemoryComparer::cmp)); + + // build VertexArrayBuffer + EXPECTGL(glHasExtension("GL_OES_vertex_array_object")).WillOnce(Return(true)); + EXPECTGL(glGenVertexArray()).WillOnce(Return(VaoID)); + EXPECTGL(glBindVertexArray(VaoID)); + + // bind buffer pointer to program attribute + EXPECTGL(glBindBuffer(DataBufferID, GLConst::GLArrayBuffer)); + EXPECTGL(glGetAttribLocation(ProgramID, "position")).WillOnce(Return(1)); + EXPECTGL(glEnableVertexAttribute(1)); + EXPECTGL(glVertexAttributePointer(1, 3, GLConst::GLFloatType, false, 0, 0)); + + // bind index buffer + EXPECTGL(glBindBuffer(IndexBufferID, GLConst::GLElementArrayBuffer)); + + // delete bucket + EXPECTGL(glDeleteBuffer(IndexBufferID)); + EXPECTGL(glDeleteBuffer(DataBufferID)); + EXPECTGL(glDeleteVertexArray(VaoID)); + EXPECTGL(glUseProgram(0)); + EXPECTGL(glDeleteProgram(ProgramID)); + } + + GLState state(0, 0, TextureBinding("", false, 0, ReferencePoiner(NULL))); + + BindingInfo binding(1); + BindingDecl & decl = binding.GetBindingDecl(0); + decl.m_attributeName = "position"; + decl.m_componentCount = 3; + decl.m_componentType = GLConst::GLFloatType; + decl.m_offset = 0; + decl.m_stride = 0; + + AttributeProvider provider(1, 10); + provider.InitStream(0, binding, ReferencePoiner(data)); + + batcher.InsertTriangleList(state, ReferencePoiner(&provider)); + batcher.Flush(); + + delete pm; +} diff --git a/drape/drape_tests/drape_tests.pro b/drape/drape_tests/drape_tests.pro index c50c58d23a..e7a4657c95 100644 --- a/drape/drape_tests/drape_tests.pro +++ b/drape/drape_tests/drape_tests.pro @@ -34,7 +34,8 @@ SOURCES += \ buffer_tests.cpp \ uniform_value_tests.cpp \ attribute_provides_tests.cpp \ - compile_shaders_test.cpp + compile_shaders_test.cpp \ + batcher_tests.cpp HEADERS += \ glmock_functions.hpp \