tests:Add cmdbuffer methods to replace GenTriangle call
diff --git a/tests/xglrenderframework.cpp b/tests/xglrenderframework.cpp
index 1afc8d9..6ca0dba 100644
--- a/tests/xglrenderframework.cpp
+++ b/tests/xglrenderframework.cpp
@@ -1052,6 +1052,7 @@
XGL_RESULT err;
memset(&m_cmdInfo,0,sizeof(m_cmdInfo));
+ m_renderTargetCount = 0;
m_device = device;
m_cmdInfo.sType = XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO;
@@ -1084,3 +1085,153 @@
{
if (m_cmdBuffer != XGL_NULL_HANDLE) xglDestroyObject(m_cmdBuffer);
}
+void XglCommandBufferObj::ClearAllBuffers(XGL_DEPTH_STENCIL_BIND_INFO *depthStencilBinding, XGL_IMAGE depthStencilImage)
+{
+ XGL_UINT i;
+
+ // whatever we want to do, we do it to the whole buffer
+ XGL_IMAGE_SUBRESOURCE_RANGE srRange = {};
+ srRange.aspect = XGL_IMAGE_ASPECT_COLOR;
+ srRange.baseMipLevel = 0;
+ srRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
+ srRange.baseArraySlice = 0;
+ srRange.arraySize = XGL_LAST_MIP_OR_SLICE;
+
+ // clear the back buffer to dark grey
+ XGL_UINT clearColor[4] = {64, 64, 64, 0};
+ XGL_IMAGE_STATE_TRANSITION transitionToClear = {};
+ for (i = 0; i < m_renderTargetCount; i++) {
+ transitionToClear.image = m_renderTargets[i]->image();
+ transitionToClear.oldState = m_renderTargets[i]->state();
+ transitionToClear.newState = XGL_IMAGE_STATE_CLEAR;
+ transitionToClear.subresourceRange = srRange;
+ xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToClear );
+ m_renderTargets[i]->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
+
+ xglCmdClearColorImageRaw( m_cmdBuffer, m_renderTargets[i]->image(), clearColor, 1, &srRange );
+ }
+
+ if (depthStencilImage)
+ {
+ XGL_IMAGE_SUBRESOURCE_RANGE dsRange = {};
+ dsRange.aspect = XGL_IMAGE_ASPECT_DEPTH;
+ dsRange.baseMipLevel = 0;
+ dsRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
+ dsRange.baseArraySlice = 0;
+ dsRange.arraySize = XGL_LAST_MIP_OR_SLICE;
+
+ // prepare the depth buffer for clear
+ memset(&transitionToClear,0,sizeof(transitionToClear));
+ transitionToClear.image = depthStencilImage;
+ transitionToClear.oldState = depthStencilBinding->depthState;
+ transitionToClear.newState = XGL_IMAGE_STATE_CLEAR;
+ transitionToClear.subresourceRange = dsRange;
+ xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToClear );
+ depthStencilBinding->depthState = transitionToClear.newState;
+
+ xglCmdClearDepthStencil(m_cmdBuffer, depthStencilImage, 1.0f, 0, 1, &dsRange);
+
+ // prepare depth buffer for rendering
+ XGL_IMAGE_STATE_TRANSITION transitionToRender = {};
+ transitionToRender.image = depthStencilImage;
+ transitionToRender.oldState = XGL_IMAGE_STATE_CLEAR;
+ transitionToRender.newState = depthStencilBinding->depthState;
+ transitionToRender.subresourceRange = dsRange;
+ xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToRender );
+ depthStencilBinding->depthState = transitionToClear.newState;
+ }
+}
+
+void XglCommandBufferObj::BindAttachments(XGL_DEPTH_STENCIL_BIND_INFO *depthStencilBinding)
+{
+ XGL_UINT i;
+ XGL_COLOR_ATTACHMENT_BIND_INFO colorBindings[XGL_MAX_COLOR_ATTACHMENTS];
+ XGL_IMAGE_SUBRESOURCE_RANGE srRange = {};
+ srRange.aspect = XGL_IMAGE_ASPECT_COLOR;
+ srRange.baseMipLevel = 0;
+ srRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
+ srRange.baseArraySlice = 0;
+ srRange.arraySize = XGL_LAST_MIP_OR_SLICE;
+
+ XGL_IMAGE_STATE_TRANSITION transitionToRender = {};
+ for(i=0; i<m_renderTargetCount; i++)
+ {
+ transitionToRender.image = m_renderTargets[i]->image();
+ transitionToRender.oldState = m_renderTargets[i]->state();
+ transitionToRender.newState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
+ transitionToRender.subresourceRange = srRange;
+ xglCmdPrepareImages(m_cmdBuffer, 1, &transitionToRender );
+ m_renderTargets[i]->state(( XGL_IMAGE_STATE ) transitionToRender.newState);
+ }
+ for (i = 0; i < m_renderTargetCount; i++) {
+ colorBindings[i].view = m_renderTargets[i]->targetView();
+ colorBindings[i].colorAttachmentState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
+ }
+ if (depthStencilBinding) {
+ xglCmdBindAttachments(m_cmdBuffer, m_renderTargetCount, colorBindings, depthStencilBinding );
+ } else {
+ xglCmdBindAttachments(m_cmdBuffer, m_renderTargetCount, colorBindings, XGL_NULL_HANDLE );
+ }
+}
+
+void XglCommandBufferObj::BindState(XGL_RASTER_STATE_OBJECT stateRaster, XGL_VIEWPORT_STATE_OBJECT stateViewport,
+ XGL_COLOR_BLEND_STATE_OBJECT colorBlend, XGL_DEPTH_STENCIL_STATE_OBJECT stateDepthStencil,
+ XGL_MSAA_STATE_OBJECT stateMsaa)
+{
+ // set all states
+ xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_RASTER, stateRaster );
+ xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_VIEWPORT, stateViewport );
+ xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_COLOR_BLEND, colorBlend);
+ xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_DEPTH_STENCIL, stateDepthStencil );
+ xglCmdBindStateObject( m_cmdBuffer, XGL_STATE_BIND_MSAA, stateMsaa );
+}
+
+void XglCommandBufferObj::AddRenderTarget(XglImage *renderTarget)
+{
+ m_renderTargets.push_back(renderTarget);
+ m_renderTargetCount++;
+}
+
+void XglCommandBufferObj::DrawIndexed(XGL_UINT firstIndex, XGL_UINT indexCount, XGL_INT vertexOffset, XGL_UINT firstInstance, XGL_UINT instanceCount)
+{
+ xglCmdDrawIndexed(m_cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
+}
+
+void XglCommandBufferObj::Draw(XGL_UINT firstVertex, XGL_UINT vertexCount, XGL_UINT firstInstance, XGL_UINT instanceCount)
+{
+ xglCmdDraw(m_cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
+}
+
+void XglCommandBufferObj::QueueCommandBuffer(XGL_MEMORY_REF *memRefs, XGL_UINT32 numMemRefs)
+{
+ XGL_RESULT err = XGL_SUCCESS;
+
+ // submit the command buffer to the universal queue
+ err = xglQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer, numMemRefs, memRefs, NULL );
+ ASSERT_XGL_SUCCESS( err );
+
+ err = xglQueueWaitIdle( m_device->m_queue );
+ ASSERT_XGL_SUCCESS( err );
+
+ // Wait for work to finish before cleaning up.
+ xglDeviceWaitIdle(m_device->device());
+
+}
+void XglCommandBufferObj::BindPipeline(XGL_PIPELINE pipeline)
+{
+ xglCmdBindPipeline( m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, pipeline );
+}
+
+void XglCommandBufferObj::BindDescriptorSet(XGL_DESCRIPTOR_SET descriptorSet)
+{
+ // bind pipeline, vertex buffer (descriptor set) and WVP (dynamic memory view)
+ xglCmdBindDescriptorSet(m_cmdBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, descriptorSet, 0 );
+}
+void XglCommandBufferObj::BindIndexBuffer(XglIndexBufferObj *indexBuffer, XGL_UINT offset)
+{
+ xglCmdBindIndexData(m_cmdBuffer, indexBuffer->m_constantBufferMem, offset, indexBuffer->GetIndexType());
+}
+void XglCommandBufferObj::BindVertexBuffer(XglConstantBufferObj *vertexBuffer, XGL_UINT offset, XGL_UINT binding)
+{
+ xglCmdBindVertexData(m_cmdBuffer, vertexBuffer->m_constantBufferMem, offset, binding);
+}
diff --git a/tests/xglrenderframework.h b/tests/xglrenderframework.h
index 598f48f..6754638 100644
--- a/tests/xglrenderframework.h
+++ b/tests/xglrenderframework.h
@@ -97,6 +97,9 @@
}
};
+class XglIndexBufferObj;
+class XglConstantBufferObj;
+
class XglCommandBufferObj
{
public:
@@ -106,11 +109,29 @@
XGL_RESULT BeginCommandBuffer(XGL_FLAGS flags);
XGL_RESULT EndCommandBuffer();
void PrepareMemoryRegions(int transitionCount, XGL_MEMORY_STATE_TRANSITION *transitionPtr);
+ void AddRenderTarget(XglImage *renderTarget);
+ void AddDepthStencil();
+ void ClearAllBuffers();
+ void ClearAllBuffers(XGL_DEPTH_STENCIL_BIND_INFO *depthStencilBinding, XGL_IMAGE depthStencilImage);
+ void BindAttachments(XGL_DEPTH_STENCIL_BIND_INFO *depthStencilBinding);
+ void BindAttachments();
+ void BindPipeline(XGL_PIPELINE pipeline);
+ void BindDescriptorSet(XGL_DESCRIPTOR_SET descriptorSet);
+ void BindVertexBuffer(XglConstantBufferObj *vertexBuffer, XGL_UINT offset, XGL_UINT binding);
+ void BindIndexBuffer(XglIndexBufferObj *indexBuffer, XGL_UINT offset);
+ void BindState(XGL_RASTER_STATE_OBJECT stateRaster, XGL_VIEWPORT_STATE_OBJECT stateViewport,
+ XGL_COLOR_BLEND_STATE_OBJECT colorBlend, XGL_DEPTH_STENCIL_STATE_OBJECT stateDepthStencil,
+ XGL_MSAA_STATE_OBJECT stateMsaa);
+ void Draw(XGL_UINT firstVertex, XGL_UINT vertexCount, XGL_UINT firstInstance, XGL_UINT instanceCount);
+ void DrawIndexed(XGL_UINT firstIndex, XGL_UINT indexCount, XGL_INT vertexOffset, XGL_UINT firstInstance, XGL_UINT instanceCount);
+ void QueueCommandBuffer(XGL_MEMORY_REF *memRefs, XGL_UINT32 numMemRefs);
protected:
XglDevice *m_device;
XGL_CMD_BUFFER_CREATE_INFO m_cmdInfo;
XGL_CMD_BUFFER m_cmdBuffer;
+ vector<XglImage*> m_renderTargets;
+ XGL_UINT m_renderTargetCount;
};