Add more tests and move classes to header file
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 63bcc09..7e69642 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -15,6 +15,7 @@
xglgpu.cpp
xgldevice.cpp
xglimage.cpp
+ tony_objs.cpp
xglrenderframework.cpp
xgltestframework.cpp
)
diff --git a/tests/tony_objs.c b/tests/tony_objs.cpp
similarity index 71%
rename from tests/tony_objs.c
rename to tests/tony_objs.cpp
index f8c8fa9..7f3454d 100644
--- a/tests/tony_objs.c
+++ b/tests/tony_objs.cpp
@@ -1,26 +1,4 @@
-class XglDescriptorSetObj
-{
-public:
- XglDescriptorSetObj(XglDevice *device);
- void AttachMemoryView( XGL_MEMORY_VIEW_ATTACH_INFO* memoryView);
- void AttachSampler( XGL_SAMPLER* sampler);
- void AttachImageView( XGL_IMAGE_VIEW_ATTACH_INFO* imageView);
- void BindCommandBuffer(XGL_CMD_BUFFER commandBuffer);
- XGL_DESCRIPTOR_SLOT_INFO * GetSlotInfo(vector<int>slots, vector<XGL_DESCRIPTOR_SET_SLOT_TYPE>types, vector<XGL_OBJECT>objs );
-
-protected:
- XGL_DESCRIPTOR_SET_CREATE_INFO m_descriptorInfo;
- XGL_DESCRIPTOR_SET m_rsrcDescSet;
- XGL_GPU_MEMORY m_descriptor_set_mem;
- XglDevice *m_device;
- int m_nextSlot;
- vector<int> m_memorySlots;
- vector<XGL_MEMORY_VIEW_ATTACH_INFO*> m_memoryViews;
- vector<int> m_samplerSlots;
- vector<XGL_SAMPLER*> m_samplers;
- vector<int> m_imageSlots;
- vector<XGL_IMAGE_VIEW_ATTACH_INFO*> m_imageViews;
-};
+#include "xglrenderframework.h"
XglDescriptorSetObj::XglDescriptorSetObj(XglDevice *device)
{
@@ -106,7 +84,7 @@
XGL_RESULT err;
// Create descriptor set for a uniform resource
- m_descriptorInfo = {};
+ memset(&m_descriptorInfo,0,sizeof(m_descriptorInfo));
m_descriptorInfo.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
m_descriptorInfo.slots = m_nextSlot;
@@ -136,19 +114,7 @@
xglCmdBindDescriptorSet(commandBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
}
-class XglTextureObj
-{
-public:
- XglTextureObj(XglDevice *device);
- XGL_IMAGE m_texture;
- XGL_IMAGE_VIEW_ATTACH_INFO m_textureViewInfo;
- XGL_GPU_MEMORY m_textureMem;
-protected:
- XglDevice *m_device;
- XGL_IMAGE_VIEW m_textureView;
-
-};
XglTextureObj::XglTextureObj(XglDevice *device):
m_texture(XGL_NULL_HANDLE),
m_textureMem(XGL_NULL_HANDLE),
@@ -268,23 +234,14 @@
}
-class XglSamplerObj
-{
-public:
- XglSamplerObj(XglDevice *device);
- XGL_SAMPLER m_sampler;
-protected:
- XGL_SAMPLER_CREATE_INFO m_samplerCreateInfo = {};
- XglDevice *m_device;
-
-};
XglSamplerObj::XglSamplerObj(XglDevice *device)
{
XGL_RESULT err = XGL_SUCCESS;
m_device = device;
+ memset(&m_samplerCreateInfo,0,sizeof(m_samplerCreateInfo));
m_samplerCreateInfo.sType = XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
m_samplerCreateInfo.magFilter = XGL_TEX_FILTER_NEAREST;
m_samplerCreateInfo.minFilter = XGL_TEX_FILTER_NEAREST;
@@ -303,19 +260,6 @@
}
-class XglConstantBufferObj
-{
-public:
- XglConstantBufferObj(XglDevice *device, int constantCount, int constantSize, const void* data);
- void SetMemoryState(XGL_CMD_BUFFER cmdBuffer, XGL_MEMORY_STATE newState);
- XGL_MEMORY_VIEW_ATTACH_INFO m_constantBufferView;
- XGL_GPU_MEMORY m_constantBufferMem;
-
-protected:
- XglDevice *m_device;
- int m_numVertices;
- int m_stride;
-};
XglConstantBufferObj::XglConstantBufferObj(XglDevice *device, int constantCount, int constantSize, const void* data)
{
XGL_RESULT err = XGL_SUCCESS;
@@ -390,31 +334,6 @@
ASSERT_XGL_SUCCESS(err);
}
-class XglShaderObj
-{
-public:
- XglShaderObj(XglDevice *device, const char * shaderText, XGL_PIPELINE_SHADER_STAGE stage );
- XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* GetStageCreateInfo(XglDescriptorSetObj descriptorSet);
- void BindShaderEntitySlotToMemory(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XGL_OBJECT object);
- void BindShaderEntitySlotToImage(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XGL_OBJECT object);
- void BindShaderEntitySlotToSampler(int slot, XGL_OBJECT object);
-
-protected:
- XGL_PIPELINE_SHADER_STAGE_CREATE_INFO stage_info;
- XGL_SHADER m_shader;
- XGL_PIPELINE_SHADER_STAGE m_stage;
- XglDevice *m_device;
- vector<int> m_memSlots;
- vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> m_memTypes;
- vector<XGL_OBJECT> m_memObjs;
- vector<int> m_samplerSlots;
- vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> m_samplerTypes;
- vector<XGL_OBJECT> m_samplerObjs;
- vector<int> m_imageSlots;
- vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> m_imageTypes;
- vector<XGL_OBJECT> m_imageObjs;
-
-};
XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* XglShaderObj::GetStageCreateInfo(XglDescriptorSetObj descriptorSet)
{
@@ -541,36 +460,6 @@
*pshader = shader;
}
#endif
-class XglPipelineObj
-{
-public:
- XglPipelineObj(XglDevice *device);
- void BindPipelineCommandBuffer(XGL_CMD_BUFFER m_cmdBuffer, XglDescriptorSetObj descriptorSet);
- void AddShader(XglShaderObj* shaderObj);
- void AddVertexInputAttribs(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* vi_attrib, int count);
- void AddVertexInputBindings(XGL_VERTEX_INPUT_BINDING_DESCRIPTION* vi_binding, int count);
- void AddVertexDataBuffer(XglConstantBufferObj* vertexDataBuffer, int binding);
-
-protected:
- XGL_PIPELINE pipeline;
- XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO vi_state;
- XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state;
- XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state;
- XGL_PIPELINE_CB_STATE cb_state;
- XGL_PIPELINE_DB_STATE_CREATE_INFO db_state;
- XGL_FORMAT render_target_format;
- XGL_GPU_MEMORY m_pipe_mem;
- XglDevice *m_device;
- XGL_VERTEX_INPUT_BINDING_DESCRIPTION *m_vi_binding;
- int m_vi_binding_count;
- XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION *m_vi_attribs;
- int m_vi_attrib_count;
- vector<XglShaderObj*> m_shaderObjs;
- vector<XglConstantBufferObj*> m_vertexBufferObjs;
- vector<int> m_vertexBufferBindings;
- int m_vertexBufferCount;
-
-};
XglPipelineObj::XglPipelineObj(XglDevice *device)
{
@@ -579,46 +468,39 @@
m_device = device;
m_vi_attrib_count = m_vi_binding_count = m_vertexBufferCount = 0;
- ia_state = {
- XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO, // sType
- XGL_NULL_HANDLE, // pNext
- XGL_TOPOLOGY_TRIANGLE_LIST, // XGL_PRIMITIVE_TOPOLOGY
- XGL_FALSE, // disableVertexReuse
- XGL_PROVOKING_VERTEX_LAST, // XGL_PROVOKING_VERTEX_CONVENTION
- XGL_FALSE, // primitiveRestartEnable
- 0 // primitiveRestartIndex
- };
+ m_ia_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO;
+ m_ia_state.pNext = XGL_NULL_HANDLE;
+ m_ia_state.topology = XGL_TOPOLOGY_TRIANGLE_LIST;
+ m_ia_state.disableVertexReuse = XGL_FALSE;
+ m_ia_state.provokingVertex = XGL_PROVOKING_VERTEX_LAST;
+ m_ia_state.primitiveRestartEnable = XGL_FALSE;
+ m_ia_state.primitiveRestartIndex = 0;
- rs_state = {
- XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
- &ia_state,
- XGL_FALSE, // depthClipEnable
- XGL_FALSE, // rasterizerDiscardEnable
- 1.0 // pointSize
- };
+ m_rs_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO;
+ m_rs_state.pNext = &m_ia_state;
+ m_rs_state.depthClipEnable = XGL_FALSE;
+ m_rs_state.rasterizerDiscardEnable = XGL_FALSE;
+ m_rs_state.pointSize = 1.0;
- render_target_format.channelFormat = XGL_CH_FMT_R8G8B8A8;
- render_target_format.numericFormat = XGL_NUM_FMT_UNORM;
- cb_state = {
- XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
- &rs_state,
- XGL_FALSE, // alphaToCoverageEnable
- XGL_FALSE, // dualSourceBlendEnable
- XGL_LOGIC_OP_COPY, // XGL_LOGIC_OP
- { // XGL_PIPELINE_CB_ATTACHMENT_STATE
- {
- XGL_FALSE, // blendEnable
- render_target_format, // XGL_FORMAT
- 0xF // channelWriteMask
- }
- }
- };
+ m_render_target_format.channelFormat = XGL_CH_FMT_R8G8B8A8;
+ m_render_target_format.numericFormat = XGL_NUM_FMT_UNORM;
- db_state = {
- XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
- &cb_state,
- {XGL_CH_FMT_R32, XGL_NUM_FMT_DS} // XGL_FORMAT
- };
+ memset(&m_cb_state,0,sizeof(m_cb_state));
+ m_cb_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO;
+ m_cb_state.pNext = &m_rs_state;
+ m_cb_state.alphaToCoverageEnable = XGL_FALSE;
+ m_cb_state.dualSourceBlendEnable = XGL_FALSE;
+ m_cb_state.logicOp = XGL_LOGIC_OP_COPY;
+
+ m_cb_attachment_state.blendEnable = XGL_FALSE;
+ m_cb_attachment_state.format = m_render_target_format;
+ m_cb_attachment_state.channelWriteMask = 0xF;
+ m_cb_state.attachment[0] = m_cb_attachment_state;
+
+ m_db_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
+ m_db_state.pNext = &m_cb_state,
+ m_db_state.format.channelFormat = XGL_CH_FMT_R32;
+ m_db_state.format.numericFormat = XGL_NUM_FMT_DS;
};
@@ -650,7 +532,7 @@
void XglPipelineObj::BindPipelineCommandBuffer(XGL_CMD_BUFFER m_cmdBuffer, XglDescriptorSetObj descriptorSet)
{
XGL_RESULT err;
- XGL_VOID* head_ptr = &db_state;
+ XGL_VOID* head_ptr = &m_db_state;
XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* shaderCreateInfo;
@@ -665,26 +547,24 @@
if (m_vi_attrib_count && m_vi_binding_count)
{
- vi_state = {
- XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO, // sType;
- head_ptr, // pNext;
- m_vi_binding_count, // bindingCount
- m_vi_binding, // pVertexBindingDescriptions;
- m_vi_attrib_count, // attributeCount; // number of attributes
- m_vi_attribs // pVertexAttributeDescriptions;
- };
- head_ptr = &vi_state;
+ m_vi_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO;
+ m_vi_state.pNext = head_ptr;
+ m_vi_state.bindingCount = m_vi_binding_count;
+ m_vi_state.pVertexBindingDescriptions = m_vi_binding;
+ m_vi_state.attributeCount = m_vi_attrib_count;
+ m_vi_state.pVertexAttributeDescriptions = m_vi_attribs;
+ head_ptr = &m_vi_state;
}
info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
info.pNext = head_ptr;
info.flags = 0;
- err = xglCreateGraphicsPipeline(m_device->device(), &info, &pipeline);
+ err = xglCreateGraphicsPipeline(m_device->device(), &info, &m_pipeline);
- err = m_device->AllocAndBindGpuMemory(pipeline, "Pipeline", &m_pipe_mem);
+ err = m_device->AllocAndBindGpuMemory(m_pipeline, "Pipeline", &m_pipe_mem);
- xglCmdBindPipeline( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, pipeline );
+ xglCmdBindPipeline( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline );
for (int i=0; i < m_vertexBufferCount; i++)
@@ -692,22 +572,9 @@
xglCmdBindVertexData(m_cmdBuffer, m_vertexBufferObjs[i]->m_constantBufferView.mem, m_vertexBufferObjs[i]->m_constantBufferView.offset, m_vertexBufferBindings[i]);
}
-
- // xglCmdBindVertexData(m_cmdBuffer, meshBuffer.m_constantBufferView.mem, meshBuffer.m_constantBufferView.offset, 0);
}
-class XglMemoryRefManager{
-public:
- XglMemoryRefManager();
- void AddMemoryRef(XGL_GPU_MEMORY* memoryRef);
- XGL_MEMORY_REF* GetMemoryRefList();
- int GetNumRefs();
-protected:
- int m_numRefs;
- vector<XGL_GPU_MEMORY*> m_bufferObjs;
-
-};
XglMemoryRefManager::XglMemoryRefManager() {
}
diff --git a/tests/tony_render_tests.cpp b/tests/tony_render_tests.cpp
index 0787b53..8c691d4 100644
--- a/tests/tony_render_tests.cpp
+++ b/tests/tony_render_tests.cpp
@@ -72,7 +72,6 @@
#include <glm/gtc/matrix_transform.hpp>
#include "xglrenderframework.h"
-#include "tony_objs.c"
#undef ASSERT_NO_FATAL_FAILURE
#define ASSERT_NO_FATAL_FAILURE(x) x
@@ -181,7 +180,6 @@
class XglRenderTest : public XglRenderFramework
{
public:
- void UploadMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride, const void* vertices );
void InitTexture();
void InitSampler();
void DrawTriangleTest(const char *vertShaderText, const char *fragShaderText);
@@ -212,26 +210,6 @@
XGL_DEPTH_STENCIL_VIEW m_depthStencilView;
XglMemoryRefManager m_memoryRefManager;
-// XGL_APPLICATION_INFO app_info;
-// XGL_PHYSICAL_GPU objs[MAX_GPUS];
-// XGL_UINT gpu_count;
-// XGL_GPU_MEMORY m_descriptor_set_mem;
-// XGL_GPU_MEMORY m_pipe_mem;
-// XglDevice *m_device;
-// XGL_CMD_BUFFER m_cmdBuffer;
-// XGL_UINT32 m_numVertices;
-// XGL_MEMORY_VIEW_ATTACH_INFO m_vtxBufferView;
-// XGL_MEMORY_VIEW_ATTACH_INFO m_constantBufferView;
-// XGL_GPU_MEMORY m_vtxBufferMem;
-// XGL_GPU_MEMORY m_constantBufferMem;
-// XGL_UINT32 m_numMemRefs;
-// XGL_MEMORY_REF m_memRefs[5];
-// XGL_RASTER_STATE_OBJECT m_stateRaster;
-// XGL_COLOR_BLEND_STATE_OBJECT m_colorBlend;
-// XGL_VIEWPORT_STATE_OBJECT m_stateViewport;
-// XGL_DEPTH_STENCIL_STATE_OBJECT m_stateDepthStencil;
-// XGL_MSAA_STATE_OBJECT m_stateMsaa;
-// XGL_DESCRIPTOR_SET m_rsrcDescSet;
virtual void SetUp() {
@@ -255,26 +233,6 @@
}
};
-// this function will create the vertex buffer and fill it with the mesh data
-void XglRenderTest::UploadMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride,
- const void* vertices )
-{
- XGL_UINT8 *pData;
- XGL_RESULT err = XGL_SUCCESS;
-
- assert( numVertices * vbStride > 0 );
- m_numVertices = numVertices;
-
- err = xglMapMemory(m_vtxBufferMem, 0, (XGL_VOID **) &pData);
- ASSERT_XGL_SUCCESS(err);
-
- memcpy(pData, vertices, numVertices * vbStride);
-
- err = xglUnmapMemory(m_vtxBufferMem);
- ASSERT_XGL_SUCCESS(err);
-}
-
-
void XglRenderTest::DrawRotatedTriangleTest()
{
@@ -1014,7 +972,6 @@
XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX );
XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT);
- // vs.BindShaderEntitySlotToMemory(0, XGL_SLOT_VERTEX_INPUT, (XGL_OBJECT) &constantBuffer.m_constantBufferView);
XglPipelineObj pipelineobj(m_device);
pipelineobj.AddShader(&vs);
@@ -1042,7 +999,7 @@
pipelineobj.AddVertexInputBindings(&vi_binding,1);
pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
- GenericDrawTriangleTest(pipelineobj, descriptorSet, 12);
+ GenericDrawTriangleTest(pipelineobj, descriptorSet, 2);
QueueCommandBuffer(NULL, 0);
}
@@ -1102,6 +1059,128 @@
RotateTriangleVSUniform(Projection, View, Model, MVPBuffer);
}
+TEST_F(XglRenderTest, MixTriangle)
+{
+ // This tests location applied to varyings. Notice that we have switched foo
+ // and bar in the FS. The triangle should be blended with red, green and blue
+ // corners.
+ static const char *vertShaderText =
+ "#version 140\n"
+ "#extension GL_ARB_separate_shader_objects : enable\n"
+ "#extension GL_ARB_shading_language_420pack : enable\n"
+ "layout (location=0) out vec4 bar;\n"
+ "layout (location=1) out vec4 foo;\n"
+ "layout (location=2) out float scale;\n"
+ "vec2 vertices[3];\n"
+ "void main() {\n"
+ " vertices[0] = vec2(-1.0, -1.0);\n"
+ " vertices[1] = vec2( 1.0, -1.0);\n"
+ " vertices[2] = vec2( 0.0, 1.0);\n"
+ "vec4 colors[3];\n"
+ " colors[0] = vec4(1.0, 0.0, 0.0, 1.0);\n"
+ " colors[1] = vec4(0.0, 1.0, 0.0, 1.0);\n"
+ " colors[2] = vec4(0.0, 0.0, 1.0, 1.0);\n"
+ " foo = colors[gl_VertexID % 3];\n"
+ " bar = vec4(1.0, 1.0, 1.0, 1.0);\n"
+ " scale = 1.0;\n"
+ " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
+ "}\n";
+
+ static const char *fragShaderText =
+ "#version 140\n"
+ "#extension GL_ARB_separate_shader_objects : enable\n"
+ "#extension GL_ARB_shading_language_420pack : enable\n"
+ "layout (location = 1) in vec4 bar;\n"
+ "layout (location = 0) in vec4 foo;\n"
+ "layout (location = 2) in float scale;\n"
+ "void main() {\n"
+ " gl_FragColor = bar * scale + foo * (1.0-scale);\n"
+ "}\n";
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+
+ XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX );
+ XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT);
+
+ XglPipelineObj pipelineobj(m_device);
+ pipelineobj.AddShader(&vs);
+ pipelineobj.AddShader(&ps);
+
+ XglDescriptorSetObj descriptorSet(m_device);
+
+ GenericDrawTriangleTest(pipelineobj, descriptorSet, 1);
+ QueueCommandBuffer(NULL, 0);
+}
+
+TEST_F(XglRenderTest, TriVertFetchAndVertID)
+{
+ // This tests that attributes work in the presence of gl_VertexID
+
+ static const char *vertShaderText =
+ "#version 140\n"
+ "#extension GL_ARB_separate_shader_objects : enable\n"
+ "#extension GL_ARB_shading_language_420pack : enable\n"
+ //XYZ1( -1, -1, -1 )
+ "layout (location = 0) in vec4 pos;\n"
+ //XYZ1( 0.f, 0.f, 0.f )
+ "layout (location = 1) in vec4 inColor;\n"
+ "layout (location = 0) out vec4 outColor;\n"
+ "void main() {\n"
+ " outColor = inColor;\n"
+ " vec4 vertices[3];"
+ " vertices[gl_VertexID % 3] = pos;\n"
+ " gl_Position = vertices[(gl_VertexID + 3) % 3];\n"
+ "}\n";
+
+
+ static const char *fragShaderText =
+ "#version 140\n"
+ "#extension GL_ARB_separate_shader_objects : enable\n"
+ "#extension GL_ARB_shading_language_420pack : enable\n"
+ "layout (location = 0) in vec4 color;\n"
+ "void main() {\n"
+ " gl_FragColor = color;\n"
+ "}\n";
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+
+ XglConstantBufferObj meshBuffer(m_device,sizeof(g_vbData)/sizeof(g_vbData[0]),sizeof(g_vbData[0]), g_vbData);
+ meshBuffer.SetMemoryState(m_cmdBuffer,XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY);
+
+ XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX );
+ XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT);
+
+ XglPipelineObj pipelineobj(m_device);
+ pipelineobj.AddShader(&vs);
+ pipelineobj.AddShader(&ps);
+
+ XglDescriptorSetObj descriptorSet(m_device);
+ descriptorSet.AttachMemoryView(&meshBuffer.m_constantBufferView);
+
+ XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
+ sizeof(g_vbData[0]), // strideInBytes; Distance between vertices in bytes (0 = no advancement)
+ XGL_VERTEX_INPUT_STEP_RATE_VERTEX // stepRate; // Rate at which binding is incremented
+ };
+
+ XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attribs[2];
+ vi_attribs[0].binding = 0; // index into vertexBindingDescriptions
+ vi_attribs[0].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
+ vi_attribs[0].format.numericFormat = XGL_NUM_FMT_FLOAT;
+ vi_attribs[0].offsetInBytes = 0; // Offset of first element in bytes from base of vertex
+ vi_attribs[1].binding = 0; // index into vertexBindingDescriptions
+ vi_attribs[1].format.channelFormat = XGL_CH_FMT_R32G32B32A32; // format of source data
+ vi_attribs[1].format.numericFormat = XGL_NUM_FMT_FLOAT;
+ vi_attribs[1].offsetInBytes = 16; // Offset of first element in bytes from base of vertex
+
+ pipelineobj.AddVertexInputAttribs(vi_attribs,2);
+ pipelineobj.AddVertexInputBindings(&vi_binding,1);
+ pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
+
+ GenericDrawTriangleTest(pipelineobj, descriptorSet, 2);
+ QueueCommandBuffer(NULL, 0);
+}
TEST_F(XglRenderTest, CubeWithVertexFetchAndMVP)
{
static const char *vertShaderText =
@@ -1142,10 +1221,6 @@
XglConstantBufferObj meshBuffer(m_device,sizeof(g_vb_solid_face_colors_Data)/sizeof(g_vb_solid_face_colors_Data[0]),
sizeof(g_vb_solid_face_colors_Data[0]), g_vb_solid_face_colors_Data);
- // What part of thisv do I still need to do? See 144b1763e9b300f62b45077d21dd20ca3a2f838b
- // meshBuffer.SetMemoryState(m_cmdBuffer,XGL_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY);
-
-
const int buf_size = sizeof(MVP) / sizeof(XGL_FLOAT);
XglConstantBufferObj MVPBuffer(m_device, buf_size, sizeof(MVP[0]), (const void*) &MVP[0][0]);
@@ -1245,7 +1320,131 @@
QueueCommandBuffer(NULL, 0);
}
+TEST_F(XglRenderTest, TexturedTriangle)
+{
+ // The expected result from this test is a red and green checkered triangle
+ static const char *vertShaderText =
+ "#version 140\n"
+ "#extension GL_ARB_separate_shader_objects : enable\n"
+ "#extension GL_ARB_shading_language_420pack : enable\n"
+ "layout (location = 0) out vec2 samplePos;\n"
+ "void main() {\n"
+ " vec2 vertices[3];"
+ " vertices[0] = vec2(-0.5, -0.5);\n"
+ " vertices[1] = vec2( 0.5, -0.5);\n"
+ " vertices[2] = vec2( 0.5, 0.5);\n"
+ " vec2 positions[3];"
+ " positions[0] = vec2( 0.0, 0.0);\n"
+ " positions[1] = vec2( 1.0, 0.0);\n"
+ " positions[2] = vec2( 1.0, 1.0);\n"
+ " samplePos = positions[gl_VertexID % 3];\n"
+ " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
+ "}\n";
+ static const char *fragShaderText =
+ "#version 140\n"
+ "#extension GL_ARB_separate_shader_objects : enable\n"
+ "#extension GL_ARB_shading_language_420pack : enable\n"
+ "layout (location = 0) in vec2 samplePos;\n"
+ "layout (binding = 0) uniform sampler2D surface;\n"
+ "layout (location=0) out vec4 outColor;\n"
+ "void main() {\n"
+ " vec4 texColor = textureLod(surface, samplePos, 0.0);\n"
+ " outColor = texColor;\n"
+ "}\n";
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+
+ XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX );
+ XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT);
+ XglSamplerObj sampler(m_device);
+ XglTextureObj texture(m_device);
+
+ ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_RESOURCE, (XGL_OBJECT) &texture.m_textureViewInfo);
+ ps.BindShaderEntitySlotToSampler(0, (XGL_OBJECT) &sampler.m_sampler);
+
+ XglPipelineObj pipelineobj(m_device);
+ pipelineobj.AddShader(&vs);
+ pipelineobj.AddShader(&ps);
+
+ XglDescriptorSetObj descriptorSet(m_device);
+ descriptorSet.AttachImageView(&texture.m_textureViewInfo);
+ descriptorSet.AttachSampler(&sampler.m_sampler);
+
+ m_memoryRefManager.AddMemoryRef(&texture.m_textureMem);
+
+ GenericDrawTriangleTest(pipelineobj, descriptorSet, 1);
+ QueueCommandBuffer(NULL, 0);
+}
+TEST_F(XglRenderTest, TexturedTriangleClip)
+{
+ // The expected result from this test is a red and green checkered triangle
+ static const char *vertShaderText =
+ "#version 330\n"
+ "#extension GL_ARB_separate_shader_objects : enable\n"
+ "#extension GL_ARB_shading_language_420pack : enable\n"
+ "layout (location = 0) out vec2 samplePos;\n"
+ "out gl_PerVertex {\n"
+ " vec4 gl_Position;\n"
+ " float gl_ClipDistance[1];\n"
+ "};\n"
+ "void main() {\n"
+ " vec2 vertices[3];"
+ " vertices[0] = vec2(-0.5, -0.5);\n"
+ " vertices[1] = vec2( 0.5, -0.5);\n"
+ " vertices[2] = vec2( 0.5, 0.5);\n"
+ " vec2 positions[3];"
+ " positions[0] = vec2( 0.0, 0.0);\n"
+ " positions[1] = vec2( 1.0, 0.0);\n"
+ " positions[2] = vec2( 1.0, 1.0);\n"
+ " float dists[3];\n"
+ " dists[0] = 1.0;\n"
+ " dists[1] = 1.0;\n"
+ " dists[2] = -1.0;\n"
+ " gl_ClipDistance[0] = dists[gl_VertexID % 3];\n"
+ " samplePos = positions[gl_VertexID % 3];\n"
+ " gl_Position = vec4(vertices[gl_VertexID % 3], 0.0, 1.0);\n"
+ "}\n";
+
+ static const char *fragShaderText =
+ "#version 140\n"
+ "#extension GL_ARB_separate_shader_objects : enable\n"
+ "#extension GL_ARB_shading_language_420pack : enable\n"
+ "layout (location = 0) in vec2 samplePos;\n"
+ "layout (binding = 0) uniform sampler2D surface;\n"
+ "layout (location=0) out vec4 outColor;\n"
+ "void main() {\n"
+ //" vec4 texColor = textureLod(surface, samplePos, 0.0 + gl_ClipDistance[0]);\n"
+ " vec4 texColor = textureLod(surface, samplePos, 0.0);\n"
+ " outColor = texColor;\n"
+ "}\n";
+
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+
+ XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX );
+ XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT);
+ XglSamplerObj sampler(m_device);
+ XglTextureObj texture(m_device);
+
+ ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_RESOURCE, (XGL_OBJECT) &texture.m_textureViewInfo);
+ ps.BindShaderEntitySlotToSampler(0, (XGL_OBJECT) &sampler.m_sampler);
+
+ XglPipelineObj pipelineobj(m_device);
+ pipelineobj.AddShader(&vs);
+ pipelineobj.AddShader(&ps);
+
+ XglDescriptorSetObj descriptorSet(m_device);
+ descriptorSet.AttachImageView(&texture.m_textureViewInfo);
+ descriptorSet.AttachSampler(&sampler.m_sampler);
+
+ m_memoryRefManager.AddMemoryRef(&texture.m_textureMem);
+
+ GenericDrawTriangleTest(pipelineobj, descriptorSet, 1);
+ QueueCommandBuffer(NULL, 0);
+}
TEST_F(XglRenderTest, FSTriangle)
{
// The expected result from this test is a red and green checkered triangle
diff --git a/tests/xglrenderframework.cpp b/tests/xglrenderframework.cpp
index 695da92..688a41b 100644
--- a/tests/xglrenderframework.cpp
+++ b/tests/xglrenderframework.cpp
@@ -464,12 +464,12 @@
xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_MSAA, m_stateMsaa );
// bind pipeline and WVP (dynamic memory view)
- // xglCmdBindPipeline( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, *pipeline );
+ xglCmdBindPipeline( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, *pipeline );
// bind pipeline and WVP (dynamic memory view)
- // xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
+ xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, m_rsrcDescSet, 0 );
- // xglCmdBindVertexData(m_cmdBuffer, m_vtxBufferView.mem, m_vtxBufferView.offset, 0);
+ xglCmdBindVertexData(m_cmdBuffer, m_vtxBufferView.mem, m_vtxBufferView.offset, 0);
}
void XglRenderFramework::GenerateClearAndPrepareBufferCmds()
diff --git a/tests/xglrenderframework.h b/tests/xglrenderframework.h
index 0b6277b..da1e204 100644
--- a/tests/xglrenderframework.h
+++ b/tests/xglrenderframework.h
@@ -120,4 +120,138 @@
}
};
+class XglDescriptorSetObj
+{
+public:
+ XglDescriptorSetObj(XglDevice *device);
+ void AttachMemoryView( XGL_MEMORY_VIEW_ATTACH_INFO* memoryView);
+ void AttachSampler( XGL_SAMPLER* sampler);
+ void AttachImageView( XGL_IMAGE_VIEW_ATTACH_INFO* imageView);
+ void BindCommandBuffer(XGL_CMD_BUFFER commandBuffer);
+ XGL_DESCRIPTOR_SLOT_INFO * GetSlotInfo(vector<int>slots, vector<XGL_DESCRIPTOR_SET_SLOT_TYPE>types, vector<XGL_OBJECT>objs );
+
+protected:
+ XGL_DESCRIPTOR_SET_CREATE_INFO m_descriptorInfo;
+ XGL_DESCRIPTOR_SET m_rsrcDescSet;
+ XGL_GPU_MEMORY m_descriptor_set_mem;
+ XglDevice *m_device;
+ int m_nextSlot;
+ vector<int> m_memorySlots;
+ vector<XGL_MEMORY_VIEW_ATTACH_INFO*> m_memoryViews;
+ vector<int> m_samplerSlots;
+ vector<XGL_SAMPLER*> m_samplers;
+ vector<int> m_imageSlots;
+ vector<XGL_IMAGE_VIEW_ATTACH_INFO*> m_imageViews;
+};
+
+class XglTextureObj
+{
+public:
+ XglTextureObj(XglDevice *device);
+ XGL_IMAGE m_texture;
+ XGL_IMAGE_VIEW_ATTACH_INFO m_textureViewInfo;
+ XGL_GPU_MEMORY m_textureMem;
+
+protected:
+ XglDevice *m_device;
+ XGL_IMAGE_VIEW m_textureView;
+
+};
+
+class XglSamplerObj
+{
+public:
+ XglSamplerObj(XglDevice *device);
+ XGL_SAMPLER m_sampler;
+
+protected:
+ XGL_SAMPLER_CREATE_INFO m_samplerCreateInfo;
+ XglDevice *m_device;
+
+};
+
+class XglConstantBufferObj
+{
+public:
+ XglConstantBufferObj(XglDevice *device, int constantCount, int constantSize, const void* data);
+ void SetMemoryState(XGL_CMD_BUFFER cmdBuffer, XGL_MEMORY_STATE newState);
+ XGL_MEMORY_VIEW_ATTACH_INFO m_constantBufferView;
+ XGL_GPU_MEMORY m_constantBufferMem;
+
+protected:
+ XglDevice *m_device;
+ int m_numVertices;
+ int m_stride;
+};
+class XglShaderObj
+{
+public:
+ XglShaderObj(XglDevice *device, const char * shaderText, XGL_PIPELINE_SHADER_STAGE stage );
+ XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* GetStageCreateInfo(XglDescriptorSetObj descriptorSet);
+ void BindShaderEntitySlotToMemory(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XGL_OBJECT object);
+ void BindShaderEntitySlotToImage(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XGL_OBJECT object);
+ void BindShaderEntitySlotToSampler(int slot, XGL_OBJECT object);
+
+protected:
+ XGL_PIPELINE_SHADER_STAGE_CREATE_INFO stage_info;
+ XGL_SHADER m_shader;
+ XGL_PIPELINE_SHADER_STAGE m_stage;
+ XglDevice *m_device;
+ vector<int> m_memSlots;
+ vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> m_memTypes;
+ vector<XGL_OBJECT> m_memObjs;
+ vector<int> m_samplerSlots;
+ vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> m_samplerTypes;
+ vector<XGL_OBJECT> m_samplerObjs;
+ vector<int> m_imageSlots;
+ vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> m_imageTypes;
+ vector<XGL_OBJECT> m_imageObjs;
+
+};
+
+class XglPipelineObj
+{
+public:
+ XglPipelineObj(XglDevice *device);
+ void BindPipelineCommandBuffer(XGL_CMD_BUFFER m_cmdBuffer, XglDescriptorSetObj descriptorSet);
+ void AddShader(XglShaderObj* shaderObj);
+ void AddVertexInputAttribs(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION* vi_attrib, int count);
+ void AddVertexInputBindings(XGL_VERTEX_INPUT_BINDING_DESCRIPTION* vi_binding, int count);
+ void AddVertexDataBuffer(XglConstantBufferObj* vertexDataBuffer, int binding);
+
+protected:
+ XGL_PIPELINE m_pipeline;
+ XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO m_vi_state;
+ XGL_PIPELINE_IA_STATE_CREATE_INFO m_ia_state;
+ XGL_PIPELINE_RS_STATE_CREATE_INFO m_rs_state;
+ XGL_PIPELINE_CB_STATE m_cb_state;
+ XGL_PIPELINE_DB_STATE_CREATE_INFO m_db_state;
+ XGL_FORMAT m_render_target_format;
+ XGL_PIPELINE_CB_ATTACHMENT_STATE m_cb_attachment_state;
+ XGL_GPU_MEMORY m_pipe_mem;
+ XglDevice *m_device;
+ XGL_VERTEX_INPUT_BINDING_DESCRIPTION *m_vi_binding;
+ int m_vi_binding_count;
+ XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION *m_vi_attribs;
+ int m_vi_attrib_count;
+ vector<XglShaderObj*> m_shaderObjs;
+ vector<XglConstantBufferObj*> m_vertexBufferObjs;
+ vector<int> m_vertexBufferBindings;
+ int m_vertexBufferCount;
+
+};
+class XglMemoryRefManager{
+public:
+ XglMemoryRefManager();
+ void AddMemoryRef(XGL_GPU_MEMORY* memoryRef);
+ XGL_MEMORY_REF* GetMemoryRefList();
+ int GetNumRefs();
+
+protected:
+ int m_numRefs;
+ vector<XGL_GPU_MEMORY*> m_bufferObjs;
+
+};
+
+
#endif // XGLRENDERFRAMEWORK_H