dxvk/src/dxvk/dxvk_shader.h

123 lines
3.1 KiB
C++

#pragma once
#include <vector>
#include "dxvk_include.h"
#include "../spirv/spirv_code_buffer.h"
#include "../spirv/spirv_id_counter.h"
namespace dxvk {
/**
* \brief Resource access mode
*
* Defines whether a resource will be
* used for reading, writing, or both.
*/
enum class DxvkResourceModeBit : uint32_t {
Read = 0,
Write = 1,
};
using DxvkResourceMode = Flags<DxvkResourceModeBit>;
/**
* \brief Shader resource type
*
* Enumerates the types of resources
* that can be accessed by shaders.
*/
enum class DxvkResourceType : uint32_t {
UniformBuffer = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
ImageSampler = VK_DESCRIPTOR_TYPE_SAMPLER,
SampledImage = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
StorageBuffer = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
StorageImage = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
};
/**
* \brief Resource slot
*/
struct DxvkResourceSlot{
DxvkResourceMode mode;
DxvkResourceType type;
uint32_t slot;
};
/**
* \brief Shader module
*
* Manages a Vulkan shader module. This will not
* perform any sort of shader compilation. Instead,
* the context will create pipeline objects on the
* fly when executing draw calls.
*/
class DxvkShader : public RcObject {
public:
DxvkShader(
VkShaderStageFlagBits stage,
DxvkSpirvCodeBuffer&& code,
uint32_t numResourceSlots,
const DxvkResourceSlot* resourceSlots);
~DxvkShader();
/**
* \brief Retrieves shader code
*
* Since the exact binding IDs are not known by the
* time the shader is created, we need to offset them
* by the first binding index reserved for the shader
* stage that this shader belongs to.
* \param [in] bindingOffset First binding ID
* \returns Modified code buffer
*/
DxvkSpirvCodeBuffer code(
uint32_t bindingOffset) const;
/**
* \brief Number of resource slots
* \returns Number of enabled slots
*/
uint32_t slotCount() const;
/**
* \brief Retrieves resource slot properties
*
* Resource slots store which resources that are bound
* to a DXVK context are used by the shader. The slot
* ID corresponds to the binding index relative to the
* first binding index within the shader.
* \param [in] slotId Slot index
* \returns The resource slot
*/
DxvkResourceSlot slot(
uint32_t slotId) const;
/**
* \brief Descriptor set layout binding
*
* Creates Vulkan-compatible binding information for
* a single resource slot. Each resource slot used
* by the shader corresponds to one binding in Vulkan.
* \param [in] slotId Shader binding slot ID
* \param [in] bindingOffset Binding index offset
* \returns Binding info
*/
VkDescriptorSetLayoutBinding slotBinding(
uint32_t slotId, uint32_t bindingOffset) const;
private:
VkShaderStageFlagBits m_stage;
DxvkSpirvCodeBuffer m_code;
std::vector<DxvkResourceSlot> m_slots;
};
}