Files
UnrealEngine/Engine/Source/Developer/StandaloneRenderer/Private/Windows/D3D/SlateD3DConstantBuffer.h
2025-05-18 13:04:45 +08:00

58 lines
1.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Templates/RefCounting.h"
#include "StandaloneRendererPlatformHeaders.h"
#include "Windows/D3D/SlateD3DRenderer.h"
template<typename BufferType>
class FSlateD3DConstantBuffer
{
public:
void Create()
{
D3D11_BUFFER_DESC Desc;
Desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
Desc.Usage = D3D11_USAGE_DYNAMIC;
Desc.ByteWidth = sizeof(BufferType);
Desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
Desc.MiscFlags = 0;
Desc.StructureByteStride = 0;
HRESULT Hr = GD3DDevice->CreateBuffer(&Desc, NULL, Buffer.GetInitReference() );
if (FAILED(Hr))
{
LogSlateD3DRendererFailure(TEXT("FSlateD3DConstantBuffer::Create() - ID3D11Device::CreateBuffer"), Hr);
GEncounteredCriticalD3DDeviceError = true;
return;
}
}
TRefCountPtr<ID3D11Buffer> GetResource() { return Buffer; }
BufferType& GetBufferData() { return BufferData; }
void UpdateBuffer()
{
void* Data = Lock();
FMemory::Memcpy(Data, &BufferData, sizeof(BufferType) );
Unlock();
}
private:
void* Lock()
{
D3D11_MAPPED_SUBRESOURCE Resource;
GD3DDeviceContext->Map( Buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &Resource );
return Resource.pData;
}
void Unlock()
{
GD3DDeviceContext->Unmap( Buffer, 0 );
}
private:
TRefCountPtr<ID3D11Buffer> Buffer;
BufferType BufferData;
};