// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
#pragma once
#if GRAPHICS_API_DIRECTX11
#include "Engine/Graphics/GPUBuffer.h"
#include "GPUDeviceDX11.h"
#include "../IncludeDirectXHeaders.h"
#include "IShaderResourceDX11.h"
///
/// The buffer view for DirectX 11 backend.
///
///
///
class GPUBufferViewDX11 : public GPUBufferView, public IShaderResourceDX11
{
private:
ID3D11ShaderResourceView* _srv = nullptr;
ID3D11UnorderedAccessView* _uav = nullptr;
public:
///
/// Initializes a new instance of the class.
///
GPUBufferViewDX11()
{
}
///
/// Finalizes an instance of the class.
///
~GPUBufferViewDX11()
{
Release();
}
public:
///
/// Release the view.
///
void Release()
{
DX_SAFE_RELEASE_CHECK(_srv, 0);
DX_SAFE_RELEASE_CHECK(_uav, 0);
}
public:
///
/// Sets new shader resource view.
///
/// A new shader resource view.
void SetSRV(ID3D11ShaderResourceView* srv)
{
DX_SAFE_RELEASE_CHECK(_srv, 0);
_srv = srv;
}
///
/// Sets new unordered access view.
///
/// A new unordered access view.
void SetUAV(ID3D11UnorderedAccessView* uav)
{
DX_SAFE_RELEASE_CHECK(_uav, 0);
_uav = uav;
}
public:
// [GPUResourceView]
void* GetNativePtr() const override
{
return (void*)(IShaderResourceDX11*)this;
}
// [IShaderResourceDX11]
ID3D11ShaderResourceView* SRV() const override
{
return _srv;
}
ID3D11UnorderedAccessView* UAV() const override
{
return _uav;
}
};
///
/// GPU buffer for DirectX 11 backend.
///
///
class GPUBufferDX11 : public GPUResourceDX11
{
private:
ID3D11Buffer* _resource = nullptr;
GPUBufferViewDX11 _view;
bool _mapped = false;
public:
///
/// Initializes a new instance of the class.
///
/// The graphics device.
/// The resource name.
GPUBufferDX11(GPUDeviceDX11* device, const StringView& name);
public:
///
/// Gets DirectX 11 buffer object handle
///
/// Buffer
FORCE_INLINE ID3D11Buffer* GetBuffer() const
{
return _resource;
}
public:
// [GPUBuffer]
GPUBufferView* View() const override;
void* Map(GPUResourceMapMode mode) override;
void Unmap() override;
// [GPUResourceDX11]
ID3D11Resource* GetResource() override
{
return _resource;
}
protected:
// [GPUBuffer]
bool OnInit() override;
void OnReleaseGPU() override;
};
#endif