115 lines
2.7 KiB
C++
115 lines
2.7 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "Windows/D3D/SlateD3DVertexBuffer.h"
|
|
#include "Windows/D3D/SlateD3DRenderer.h"
|
|
#include "StandaloneRendererPrivate.h"
|
|
|
|
FSlateD3DVertexBuffer::FSlateD3DVertexBuffer()
|
|
: BufferSize(0), Stride(0)
|
|
{
|
|
|
|
}
|
|
|
|
FSlateD3DVertexBuffer::~FSlateD3DVertexBuffer()
|
|
{
|
|
|
|
}
|
|
|
|
/** Initializes the vertex buffers RHI resource. */
|
|
void FSlateD3DVertexBuffer::CreateBuffer( uint32 InStride )
|
|
{
|
|
Stride = InStride;
|
|
|
|
if( BufferSize == 0 )
|
|
{
|
|
// @todo: better default size. Probably should be based on how much we know will always bee needed by the editor
|
|
BufferSize = 2000 * Stride;
|
|
}
|
|
|
|
D3D11_BUFFER_DESC BufferDesc;
|
|
|
|
BufferDesc.Usage = D3D11_USAGE_DYNAMIC;
|
|
BufferDesc.ByteWidth = BufferSize;
|
|
BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
|
|
BufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE ;
|
|
BufferDesc.MiscFlags = 0;
|
|
|
|
HRESULT Hr = GD3DDevice->CreateBuffer( &BufferDesc, NULL, Buffer.GetInitReference() );
|
|
if (FAILED(Hr))
|
|
{
|
|
LogSlateD3DRendererFailure(TEXT("FSlateD3DVertexBuffer::CreateBuffer() - ID3D11Device::CreateBuffer"), Hr);
|
|
GEncounteredCriticalD3DDeviceError = true;
|
|
}
|
|
}
|
|
|
|
/** Releases the vertex buffers RHI resource. */
|
|
void FSlateD3DVertexBuffer::DestroyBuffer()
|
|
{
|
|
Buffer.SafeRelease();
|
|
}
|
|
|
|
/** Resizes the buffer to the passed in size. Preserves internal data*/
|
|
void FSlateD3DVertexBuffer::ResizeBuffer( uint32 NewSize )
|
|
{
|
|
// Buffer should be created first
|
|
check( BufferSize > 0 );
|
|
|
|
if( NewSize > BufferSize )
|
|
{
|
|
uint8 *SavedVertices = NULL;
|
|
|
|
{
|
|
void *Vertices = Lock(0);
|
|
|
|
SavedVertices = new uint8[BufferSize];
|
|
FMemory::Memcpy( SavedVertices, Vertices, BufferSize );
|
|
|
|
Unlock();
|
|
}
|
|
|
|
D3D11_BUFFER_DESC BufferDesc;
|
|
BufferDesc.Usage = D3D11_USAGE_DYNAMIC;
|
|
BufferDesc.ByteWidth = NewSize;
|
|
BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
|
|
BufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE ;
|
|
BufferDesc.MiscFlags = 0;
|
|
|
|
HRESULT Hr = GD3DDevice->CreateBuffer( &BufferDesc, NULL, Buffer.GetInitReference() );
|
|
if (SUCCEEDED(Hr))
|
|
{
|
|
if (SavedVertices)
|
|
{
|
|
void *Vertices = Lock(0);
|
|
|
|
FMemory::Memcpy(Vertices, SavedVertices, BufferSize);
|
|
|
|
Unlock();
|
|
}
|
|
|
|
BufferSize = NewSize;
|
|
}
|
|
else
|
|
{
|
|
LogSlateD3DRendererFailure(TEXT("FSlateD3DVertexBuffer::ResizeBuffer() - ID3D11Device::CreateBuffer"), Hr);
|
|
GEncounteredCriticalD3DDeviceError = true;
|
|
}
|
|
|
|
delete[] SavedVertices;
|
|
}
|
|
}
|
|
|
|
/** Locks the index buffer, returning a pointer to the indices */
|
|
void* FSlateD3DVertexBuffer::Lock( uint32 Offset )
|
|
{
|
|
D3D11_MAPPED_SUBRESOURCE Resource;
|
|
GD3DDeviceContext->Map( Buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &Resource );
|
|
void* Data = Resource.pData;
|
|
|
|
return (void*)((uint8*)Data + Offset);
|
|
}
|
|
|
|
void FSlateD3DVertexBuffer::Unlock()
|
|
{
|
|
GD3DDeviceContext->Unmap( Buffer, 0 );
|
|
}
|