summaryrefslogtreecommitdiffstats
path: root/Tests/TestApp/src/TestBufferAccess.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/TestApp/src/TestBufferAccess.cpp')
-rw-r--r--Tests/TestApp/src/TestBufferAccess.cpp277
1 files changed, 0 insertions, 277 deletions
diff --git a/Tests/TestApp/src/TestBufferAccess.cpp b/Tests/TestApp/src/TestBufferAccess.cpp
deleted file mode 100644
index 6e139f9..0000000
--- a/Tests/TestApp/src/TestBufferAccess.cpp
+++ /dev/null
@@ -1,277 +0,0 @@
-/* Copyright 2019 Diligent Graphics LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS.
- *
- * In no event and under no legal theory, whether in tort (including negligence),
- * contract, or otherwise, unless required by applicable law (such as deliberate
- * and grossly negligent acts) or agreed to in writing, shall any Contributor be
- * liable for any damages, including any direct, indirect, special, incidental,
- * or consequential damages of any character arising as a result of this License or
- * out of the use or inability to use the software (including but not limited to damages
- * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
- * all other commercial damages or losses), even if such Contributor has been advised
- * of the possibility of such damages.
- */
-
-#include "pch.h"
-#include <math.h>
-#include "TestBufferAccess.h"
-#include "MapHelper.h"
-
-using namespace Diligent;
-
-TestBufferAccess::TestBufferAccess() :
- UnitTestBase("Buffer access test"),
- m_fXExtent(0),
- m_fYExtent(0)
-{}
-
-void TestBufferAccess::Init( IRenderDevice *pDevice, IDeviceContext *pContext, ISwapChain *pSwapChain, float fMinXCoord, float fMinYCoord, float fXExtent, float fYExtent )
-{
- m_pRenderDevice = pDevice;
- m_pDeviceContext = pContext;
- auto DevType = m_pRenderDevice->GetDeviceCaps().DevType;
- bool bUseGLSL = DevType == DeviceType::OpenGL || DevType == DeviceType::OpenGLES || DevType == DeviceType::Vulkan;
-
- m_fXExtent = fXExtent;
- m_fYExtent = fYExtent;
-
- float vertices[] = { 0.0f,0.0f,0.0f, 0.5f, 0.9f, 0.1f,
- 0.5f,1.f,0.0f, 0.9f, 0.3f, 0.7f,
- 1.f,0.0f,0.0f, 0.2f, 0.4f, 0.9f };
- for(int iVert=0; iVert < 3; ++iVert)
- {
- vertices[iVert*6] = (vertices[iVert*6]) / (float)(NumRows+1) * fXExtent + fMinXCoord;
- vertices[iVert*6+1] = (vertices[iVert*6+1]) / (float)(NumRows+1) * fYExtent + fMinYCoord;
- }
-
- {
- Diligent::BufferDesc BuffDesc;
- BuffDesc.uiSizeInBytes = sizeof(vertices);
- BuffDesc.BindFlags = BIND_VERTEX_BUFFER;
- Diligent::BufferData BuffData;
- BuffData.pData = vertices;
- BuffData.DataSize = BuffDesc.uiSizeInBytes;
- m_pRenderDevice->CreateBuffer(BuffDesc, &BuffData, &m_pVertexBuff);
- }
-
- for(int InstBuff = 0; InstBuff < _countof(m_pInstBuff); ++InstBuff)
- {
- float instance_offsets[NumInstances*2] =
- {
- 1.f * fXExtent / (float)(NumRows+1), InstBuff*fYExtent / (float)(NumRows+1),
- 2.f * fXExtent / (float)(NumRows+1), InstBuff*fYExtent / (float)(NumRows+1),
- 3.f * fXExtent / (float)(NumRows+1), InstBuff*fYExtent / (float)(NumRows+1),
- };
-
- Diligent::BufferDesc BuffDesc;
- BuffDesc.uiSizeInBytes = sizeof(instance_offsets);
- BuffDesc.BindFlags = BIND_VERTEX_BUFFER;
- if( InstBuff == 3 )
- {
- BuffDesc.Usage = USAGE_DYNAMIC;
- BuffDesc.CPUAccessFlags = CPU_ACCESS_WRITE;
- }
- else if( InstBuff == 4 )
- {
- BuffDesc.Usage = USAGE_STAGING;
- BuffDesc.BindFlags = BIND_NONE;
- BuffDesc.CPUAccessFlags = CPU_ACCESS_READ;
- }
- else if( InstBuff == 5 )
- {
- BuffDesc.Usage = USAGE_STAGING;
- BuffDesc.BindFlags = BIND_NONE;
- BuffDesc.CPUAccessFlags = CPU_ACCESS_WRITE;
- }
- else if( InstBuff == 6 )
- {
- BuffDesc.Usage = USAGE_STAGING;
- BuffDesc.BindFlags = BIND_NONE;
- BuffDesc.CPUAccessFlags = CPU_ACCESS_READ;
- }
-
- Diligent::BufferData BuffData;
- if(BuffDesc.Usage != USAGE_DYNAMIC && !(BuffDesc.Usage == USAGE_STAGING && (BuffDesc.CPUAccessFlags & CPU_ACCESS_WRITE) != 0))
- {
- BuffData.pData = instance_offsets;
- BuffData.DataSize = sizeof(instance_offsets);
- }
- m_pRenderDevice->CreateBuffer(BuffDesc, &BuffData, &m_pInstBuff[InstBuff]);
- }
-
- ShaderCreateInfo CreationAttrs;
- RefCntAutoPtr<IShaderSourceInputStreamFactory> pShaderSourceFactory;
- pDevice->GetEngineFactory()->CreateDefaultShaderSourceStreamFactory(nullptr, &pShaderSourceFactory);
- CreationAttrs.pShaderSourceStreamFactory = pShaderSourceFactory;
- CreationAttrs.UseCombinedTextureSamplers = true;
-
- RefCntAutoPtr<Diligent::IShader> pVSInst, pPS;
-
- {
- CreationAttrs.FilePath = bUseGLSL ? "Shaders\\minimalInstGL.vsh" : "Shaders\\minimalInstDX.vsh";
- CreationAttrs.Desc.ShaderType = SHADER_TYPE_VERTEX;
- m_pRenderDevice->CreateShader( CreationAttrs, &pVSInst );
- }
-
- {
- CreationAttrs.FilePath = bUseGLSL ? "Shaders\\minimalGL.psh" : "Shaders\\minimalDX.psh";
- CreationAttrs.Desc.ShaderType = SHADER_TYPE_PIXEL;
- m_pRenderDevice->CreateShader( CreationAttrs, &pPS );
- }
-
-
- PipelineStateDesc PSODesc;
- PSODesc.Name = "Test buffer access PSO";
- PSODesc.GraphicsPipeline.DepthStencilDesc.DepthEnable = False;
- PSODesc.GraphicsPipeline.RasterizerDesc.CullMode = CULL_MODE_NONE;
- PSODesc.GraphicsPipeline.BlendDesc.IndependentBlendEnable = False;
- PSODesc.GraphicsPipeline.BlendDesc.RenderTargets[0].BlendEnable = False;
- PSODesc.GraphicsPipeline.NumRenderTargets = 1;
- PSODesc.GraphicsPipeline.RTVFormats[0] = pSwapChain->GetDesc().ColorBufferFormat;
- PSODesc.GraphicsPipeline.DSVFormat = pSwapChain->GetDesc().DepthBufferFormat;
- PSODesc.GraphicsPipeline.pVS = pVSInst;
- PSODesc.GraphicsPipeline.pPS = pPS;
-
- LayoutElement Elems[] =
- {
- LayoutElement{ 1, 1, 3, Diligent::VT_FLOAT32, false, sizeof(float) * 3, sizeof(float) * 6 },
- LayoutElement{ 0, 1, 3, Diligent::VT_FLOAT32, false, 0, sizeof(float) * 6 },
- LayoutElement{ 2, 3, 2, Diligent::VT_FLOAT32, false, LayoutElement::AutoOffset, LayoutElement::AutoStride, LayoutElement::FREQUENCY_PER_INSTANCE }
- };
- PSODesc.GraphicsPipeline.InputLayout.LayoutElements = Elems;
- PSODesc.GraphicsPipeline.InputLayout.NumElements = _countof( Elems );
- PSODesc.GraphicsPipeline.PrimitiveTopology = PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
- pDevice->CreatePipelineState(PSODesc, &m_pPSO);
-}
-
-void TestBufferAccess::Draw(float fTime)
-{
- m_pDeviceContext->SetPipelineState(m_pPSO);
- // No shader resources needed
- //m_pDeviceContext->TransitionShaderResources(m_pPSO, nullptr);
- //m_pDeviceContext->CommitShaderResources(nullptr);
-
- IBuffer *pBuffs[] = {nullptr, m_pVertexBuff, nullptr, m_pInstBuff[0], nullptr};
- Uint32 Offsets[_countof( pBuffs )] = {0, 0, 0, 0, 0};
- m_pDeviceContext->SetVertexBuffers( 0, _countof( pBuffs ), pBuffs, Offsets, RESOURCE_STATE_TRANSITION_MODE_TRANSITION, SET_VERTEX_BUFFERS_FLAG_RESET );
-
- DrawAttribs DrawAttrs(3, DRAW_FLAG_VERIFY_ALL);
- DrawAttrs.NumVertices = 3;
- DrawAttrs.NumInstances = NumInstances;
- m_pDeviceContext->Draw(DrawAttrs);
-
-
- float fDX = m_fXExtent / (float)(NumRows+1);
- float fDY = m_fYExtent / (float)(NumRows+1);
-
- float instance_offsets[NumInstances*2];
- for(int Inst = 0; Inst < NumInstances; ++Inst)
- {
- instance_offsets[Inst*2] = (1+Inst) * fDX;
- instance_offsets[Inst*2+1] = 1.f * fDY + sin(fTime) * fDY * 0.3f;
- }
- m_pDeviceContext->UpdateBuffer(m_pInstBuff[1], sizeof( float ) * 2, sizeof( float ) * 4, &instance_offsets[2], RESOURCE_STATE_TRANSITION_MODE_TRANSITION );
-
- pBuffs[3] = m_pInstBuff[1];
- m_pDeviceContext->SetVertexBuffers( 0, _countof( pBuffs ), pBuffs, Offsets, RESOURCE_STATE_TRANSITION_MODE_TRANSITION, SET_VERTEX_BUFFERS_FLAG_RESET );
-
- m_pDeviceContext->Draw(DrawAttrs);
-
-
- for(int Inst = 0; Inst < NumInstances; ++Inst)
- {
- instance_offsets[Inst*2] = (1+Inst) * fDX;
- instance_offsets[Inst*2+1] = 2.f * fDY + sin(fTime*0.8f) * fDY * 0.3f;
- }
- m_pDeviceContext->UpdateBuffer(m_pInstBuff[2], sizeof( float ) * 2, sizeof( float ) * 4, &instance_offsets[2], RESOURCE_STATE_TRANSITION_MODE_TRANSITION );
- m_pDeviceContext->CopyBuffer(m_pInstBuff[2], sizeof( float ) * 2, RESOURCE_STATE_TRANSITION_MODE_TRANSITION, m_pInstBuff[1], sizeof( float ) * 2, sizeof( float ) * 4, RESOURCE_STATE_TRANSITION_MODE_TRANSITION );
- StateTransitionDesc Barrier(m_pInstBuff[1], RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_VERTEX_BUFFER, true);
- m_pDeviceContext->TransitionResourceStates(1, &Barrier);
- m_pDeviceContext->Draw(DrawAttrs);
-
- for(int Inst = 0; Inst < NumInstances; ++Inst)
- {
- instance_offsets[Inst*2] = (1+Inst) * fDX;
- instance_offsets[Inst*2+1] = 3.f * fDY + sin(fTime*1.2f) * fDY * 0.3f;
- }
-
- // Test updating dynamic buffer
- {
- MapHelper<float> pInstData( m_pDeviceContext, m_pInstBuff[3], MAP_WRITE, MAP_FLAG_DISCARD );
- memcpy(pInstData, instance_offsets, sizeof(instance_offsets));
- }
-
- pBuffs[3] = m_pInstBuff[3];
- m_pDeviceContext->SetVertexBuffers( 0, _countof( pBuffs ), pBuffs, Offsets, RESOURCE_STATE_TRANSITION_MODE_TRANSITION, SET_VERTEX_BUFFERS_FLAG_RESET );
-
- m_pDeviceContext->Draw(DrawAttrs);
-
- bool TestStagingBuffers = false;
- if(TestStagingBuffers)
- {
- MapHelper<float> pStagingData;
- // Test reading data from staging resource
- {
- m_pDeviceContext->CopyBuffer(m_pInstBuff[3], 0, RESOURCE_STATE_TRANSITION_MODE_TRANSITION, m_pInstBuff[4], 0, sizeof( instance_offsets ), RESOURCE_STATE_TRANSITION_MODE_TRANSITION );
- pStagingData.Map( m_pDeviceContext, m_pInstBuff[4], MAP_READ, MAP_FLAG_NONE );
- for(int i = 0; i < _countof(instance_offsets); ++i)
- assert(pStagingData[i] == instance_offsets[i]);
- pStagingData.Unmap();
- }
-
- // D3D12 does not allow writing to the CPU-readable buffers
- if(m_pRenderDevice->GetDeviceCaps().DevType != DeviceType::D3D12)
- {
- // Test writing data to staging resource
- {
- pStagingData.Map( m_pDeviceContext, m_pInstBuff[5], MAP_WRITE, MAP_FLAG_NONE );
- for(int Inst = 0; Inst < NumInstances; ++Inst)
- {
- pStagingData[Inst*2] = (1+Inst) * fDX;
- pStagingData[Inst*2+1] = 4.f * fDY + sin(fTime*1.3f) * fDY * 0.3f;
- }
- pStagingData.Unmap();
- }
-
- StateTransitionDesc Barriers[2] =
- {
- StateTransitionDesc{m_pInstBuff[5], RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_COPY_SOURCE, true},
- StateTransitionDesc{m_pInstBuff[2], RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_COPY_DEST, true},
- };
- m_pDeviceContext->TransitionResourceStates(2, Barriers);
- m_pDeviceContext->CopyBuffer(m_pInstBuff[5], 0, RESOURCE_STATE_TRANSITION_MODE_VERIFY, m_pInstBuff[2], 0, sizeof( instance_offsets ), RESOURCE_STATE_TRANSITION_MODE_VERIFY );
- pBuffs[3] = m_pInstBuff[2];
- m_pDeviceContext->SetVertexBuffers( 0, _countof( pBuffs ), pBuffs, Offsets, RESOURCE_STATE_TRANSITION_MODE_TRANSITION, SET_VERTEX_BUFFERS_FLAG_RESET );
- m_pDeviceContext->Draw(DrawAttrs);
-
-
- // Test reading & writing data to the staging resource
- /*{
- MapHelper<float> pInstData2( m_pDeviceContext, m_pInstBuff[6], MAP_READ_WRITE, 0 );
- MapHelper<float> pInstData3( std::move(pInstData2) );
- MapHelper<float> pInstData;
- pInstData = std::move(pInstData3);
- static float fPrevTime = fTime;
- for(int Inst = 0; Inst < NumInstances; ++Inst)
- {
- pInstData[Inst*2] += (fTime-fPrevTime) * sin(fTime)*0.1f * m_fXExtent;
- }
- fPrevTime = fTime;
- }*/
-
- m_pDeviceContext->CopyBuffer(m_pInstBuff[6], 0, RESOURCE_STATE_TRANSITION_MODE_TRANSITION, m_pInstBuff[2], 0, sizeof( instance_offsets ), RESOURCE_STATE_TRANSITION_MODE_TRANSITION );
- m_pDeviceContext->Draw(DrawAttrs);
- }
- }
-
- SetStatus(TestResult::Succeeded);
-}