1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-01-23 08:52:12 +01:00
dxvk/src/d3d9/d3d9_constant_buffer.h
Philip Rebohle 459758c6ff [d3d9] Don't set storage buffer usage unless necessary
This actually matters now to some degree.
2023-01-15 15:36:05 +01:00

90 lines
2.0 KiB
C++

#pragma once
#include "../dxvk/dxvk_buffer.h"
#include "../dxso/dxso_util.h"
#include "../util/util_math.h"
#include "d3d9_include.h"
namespace dxvk {
class D3D9DeviceEx;
/**
* \brief Constant buffer
*/
class D3D9ConstantBuffer {
public:
D3D9ConstantBuffer();
D3D9ConstantBuffer(
D3D9DeviceEx* pDevice,
DxsoProgramType ShaderStage,
DxsoConstantBuffers BufferType,
VkDeviceSize Size);
D3D9ConstantBuffer(
D3D9DeviceEx* pDevice,
VkBufferUsageFlags Usage,
VkShaderStageFlags Stages,
uint32_t ResourceSlot,
VkDeviceSize Size);
~D3D9ConstantBuffer();
/**
* \brief Queries alignment
*
* Useful to pad copies with initialized data.
* \returns Data alignment
*/
VkDeviceSize GetAlignment() const {
return m_align;
}
/**
* \brief Allocates a given amount of memory
*
* \param [in] size Number of bytes to allocate
* \returns Map pointer of the allocated region
*/
void* Alloc(VkDeviceSize size);
/**
* \brief Allocates a full buffer slice
*
* This must not be called if \ref Alloc is used.
* \returns Map pointer of the allocated region
*/
void* AllocSlice();
private:
D3D9DeviceEx* m_device = nullptr;
uint32_t m_binding = 0u;
VkBufferUsageFlags m_usage = 0u;
VkShaderStageFlags m_stages = 0u;
VkDeviceSize m_size = 0ull;
VkDeviceSize m_align = 0ull;
VkDeviceSize m_offset = 0ull;
Rc<DxvkBuffer> m_buffer = nullptr;
DxvkBufferSliceHandle m_slice = { };
void createBuffer();
VkDeviceSize getAlignment(const Rc<DxvkDevice>& device) const;
static VkBufferUsageFlags getBufferUsage(
D3D9DeviceEx* pDevice,
DxsoProgramType ShaderStage,
DxsoConstantBuffers BufferType);
};
}