Added some more wrappers.
This commit is contained in:
parent
31af297bab
commit
2f77ed5ef5
@ -29,8 +29,7 @@ int main(int, char**)
|
||||
|
||||
gpuDevice.claimWindow(window);
|
||||
|
||||
const SDL_GPUTextureFormat texForm = SDL_GetGPUSwapchainTextureFormat(gpuDevice, window);
|
||||
(void) texForm;
|
||||
|
||||
|
||||
bool running = true;
|
||||
while(running)
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
#include <stdexcept>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include <mijin/debug/assert.hpp>
|
||||
#include <mijin/util/bitflags.hpp>
|
||||
|
@ -74,6 +74,400 @@ public:
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
enum class GPUVertexInputRate
|
||||
{
|
||||
VERTEX = SDL_GPU_VERTEXINPUTRATE_VERTEX,
|
||||
INSTANCE = SDL_GPU_VERTEXINPUTRATE_INSTANCE
|
||||
};
|
||||
|
||||
struct GPUVertexBinding
|
||||
{
|
||||
Uint32 index;
|
||||
Uint32 pitch;
|
||||
GPUVertexInputRate inputRate = GPUVertexInputRate::VERTEX;
|
||||
Uint32 instanceStepRate;
|
||||
};
|
||||
static_assert(sizeof(GPUVertexBinding) == sizeof(SDL_GPUVertexBinding)
|
||||
&& alignof(GPUVertexBinding) == alignof(SDL_GPUVertexBinding));
|
||||
|
||||
enum class GPUVertexElementFormat
|
||||
{
|
||||
INT = SDL_GPU_VERTEXELEMENTFORMAT_INT,
|
||||
INT2 = SDL_GPU_VERTEXELEMENTFORMAT_INT2,
|
||||
INT3 = SDL_GPU_VERTEXELEMENTFORMAT_INT3,
|
||||
INT4 = SDL_GPU_VERTEXELEMENTFORMAT_INT4,
|
||||
UINT = SDL_GPU_VERTEXELEMENTFORMAT_UINT,
|
||||
UINT2 = SDL_GPU_VERTEXELEMENTFORMAT_UINT2,
|
||||
UINT3 = SDL_GPU_VERTEXELEMENTFORMAT_UINT3,
|
||||
UINT4 = SDL_GPU_VERTEXELEMENTFORMAT_UINT4,
|
||||
FLOAT = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT,
|
||||
FLOAT2 = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2,
|
||||
FLOAT3 = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3,
|
||||
FLOAT4 = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT4,
|
||||
BYTE2 = SDL_GPU_VERTEXELEMENTFORMAT_BYTE2,
|
||||
BYTE4 = SDL_GPU_VERTEXELEMENTFORMAT_BYTE4,
|
||||
UBYTE2 = SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2,
|
||||
UBYTE4 = SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4,
|
||||
BYTE2_NORM = SDL_GPU_VERTEXELEMENTFORMAT_BYTE2_NORM,
|
||||
BYTE4_NORM = SDL_GPU_VERTEXELEMENTFORMAT_BYTE4_NORM,
|
||||
UBYTE2_NORM = SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2_NORM,
|
||||
UBYTE4_NORM = SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4_NORM,
|
||||
SHORT2 = SDL_GPU_VERTEXELEMENTFORMAT_SHORT2,
|
||||
SHORT4 = SDL_GPU_VERTEXELEMENTFORMAT_SHORT4,
|
||||
USHORT2 = SDL_GPU_VERTEXELEMENTFORMAT_USHORT2,
|
||||
USHORT4 = SDL_GPU_VERTEXELEMENTFORMAT_USHORT4,
|
||||
SHORT2_NORM = SDL_GPU_VERTEXELEMENTFORMAT_SHORT2_NORM,
|
||||
SHORT4_NORM = SDL_GPU_VERTEXELEMENTFORMAT_SHORT4_NORM,
|
||||
USHORT2_NORM = SDL_GPU_VERTEXELEMENTFORMAT_USHORT2_NORM,
|
||||
USHORT4_NORM = SDL_GPU_VERTEXELEMENTFORMAT_USHORT4_NORM,
|
||||
HALF2 = SDL_GPU_VERTEXELEMENTFORMAT_HALF2,
|
||||
HALF4 = SDL_GPU_VERTEXELEMENTFORMAT_HALF4
|
||||
};
|
||||
|
||||
struct GPUVertexAttribute
|
||||
{
|
||||
Uint32 location;
|
||||
Uint32 bindingIndex;
|
||||
GPUVertexElementFormat format;
|
||||
Uint32 offset;
|
||||
};
|
||||
static_assert(sizeof(GPUVertexAttribute) == sizeof(SDL_GPUVertexAttribute)
|
||||
&& alignof(GPUVertexAttribute) == alignof(SDL_GPUVertexAttribute));
|
||||
|
||||
struct GPUVertexInputState
|
||||
{
|
||||
std::vector<GPUVertexBinding> vertexBindings;
|
||||
std::vector<GPUVertexAttribute> vertexAttributes;
|
||||
};
|
||||
|
||||
enum class GPUPrimitiveType
|
||||
{
|
||||
POINTLIST = SDL_GPU_PRIMITIVETYPE_POINTLIST,
|
||||
LINELIST = SDL_GPU_PRIMITIVETYPE_LINELIST,
|
||||
LINESTRIP = SDL_GPU_PRIMITIVETYPE_LINESTRIP,
|
||||
TRIANGLELIST = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST,
|
||||
TRIANGLESTRIP = SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP
|
||||
};
|
||||
|
||||
enum class GPUFillMode
|
||||
{
|
||||
FILL = SDL_GPU_FILLMODE_FILL,
|
||||
LINE = SDL_GPU_FILLMODE_LINE
|
||||
};
|
||||
|
||||
enum class GPUCullMode
|
||||
{
|
||||
NONE = SDL_GPU_CULLMODE_NONE,
|
||||
FRONT = SDL_GPU_CULLMODE_FRONT,
|
||||
BACK = SDL_GPU_CULLMODE_BACK
|
||||
};
|
||||
|
||||
enum class GPUFrontFace
|
||||
{
|
||||
COUNTER_CLOCKWISE = SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE,
|
||||
CLOCKWISE = SDL_GPU_FRONTFACE_CLOCKWISE
|
||||
};
|
||||
|
||||
struct GPURasterizerState
|
||||
{
|
||||
GPUFillMode fillMode = GPUFillMode::FILL;
|
||||
GPUCullMode cullMode = GPUCullMode::NONE;
|
||||
GPUFrontFace frontFace = GPUFrontFace::COUNTER_CLOCKWISE;
|
||||
bool enableDepthBias = false;
|
||||
float depthBiasConstantFactor;
|
||||
float depthBiasClamp;
|
||||
float depthBiasSlopeFactor;
|
||||
};
|
||||
|
||||
enum class GPUSampleCount
|
||||
{
|
||||
ONE = SDL_GPU_SAMPLECOUNT_1,
|
||||
TWO = SDL_GPU_SAMPLECOUNT_2,
|
||||
FOUR = SDL_GPU_SAMPLECOUNT_4,
|
||||
EIGHT = SDL_GPU_SAMPLECOUNT_8
|
||||
};
|
||||
|
||||
struct GPUMultisampleState
|
||||
{
|
||||
GPUSampleCount sampleCount = GPUSampleCount::ONE;
|
||||
Uint32 sampleMask = 0xFFFFFFFF;
|
||||
};
|
||||
|
||||
enum class GPUCompareOp
|
||||
{
|
||||
NEVER = SDL_GPU_COMPAREOP_NEVER,
|
||||
LESS = SDL_GPU_COMPAREOP_LESS,
|
||||
EQUAL = SDL_GPU_COMPAREOP_EQUAL,
|
||||
LESS_OR_EQUAL = SDL_GPU_COMPAREOP_LESS_OR_EQUAL,
|
||||
GREATER = SDL_GPU_COMPAREOP_GREATER,
|
||||
NOT_EQUAL = SDL_GPU_COMPAREOP_NOT_EQUAL,
|
||||
GREATER_OR_EQUAL = SDL_GPU_COMPAREOP_GREATER_OR_EQUAL,
|
||||
ALWAYS = SDL_GPU_COMPAREOP_ALWAYS
|
||||
};
|
||||
|
||||
enum class GPUStencilOp
|
||||
{
|
||||
KEEP = SDL_GPU_STENCILOP_KEEP,
|
||||
ZERO = SDL_GPU_STENCILOP_ZERO,
|
||||
REPLACE = SDL_GPU_STENCILOP_REPLACE,
|
||||
INCREMENT_AND_CLAMP = SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP,
|
||||
DECREMENT_AND_CLAMP = SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP,
|
||||
INVERT = SDL_GPU_STENCILOP_INVERT,
|
||||
INCREMENT_AND_WRAP = SDL_GPU_STENCILOP_INCREMENT_AND_WRAP,
|
||||
DECREMENT_AND_WRAP = SDL_GPU_STENCILOP_DECREMENT_AND_WRAP
|
||||
};
|
||||
|
||||
struct GPUStencilOpState
|
||||
{
|
||||
GPUStencilOp failOp;
|
||||
GPUStencilOp passOp;
|
||||
GPUStencilOp depthFailOp;
|
||||
GPUCompareOp compareOp;
|
||||
|
||||
explicit operator SDL_GPUStencilOpState() const noexcept
|
||||
{
|
||||
return {
|
||||
.fail_op = static_cast<SDL_GPUStencilOp>(failOp),
|
||||
.pass_op = static_cast<SDL_GPUStencilOp>(passOp),
|
||||
.depth_fail_op = static_cast<SDL_GPUStencilOp>(depthFailOp),
|
||||
.compare_op = static_cast<SDL_GPUCompareOp>(compareOp),
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
struct GPUDepthStencilState
|
||||
{
|
||||
bool enableDepthTest = false;
|
||||
bool enableDepthWrite = false;
|
||||
bool enableStencilTest = false;
|
||||
GPUCompareOp compareOp = GPUCompareOp::LESS_OR_EQUAL;
|
||||
GPUStencilOpState backStencilState;
|
||||
GPUStencilOpState frontStencilState;
|
||||
Uint8 compareMask;
|
||||
Uint8 writeMask;
|
||||
};
|
||||
|
||||
enum class GPUBlendFactor
|
||||
{
|
||||
ZERO = SDL_GPU_BLENDFACTOR_ZERO,
|
||||
ONE = SDL_GPU_BLENDFACTOR_ONE,
|
||||
SRC_COLOR = SDL_GPU_BLENDFACTOR_SRC_COLOR,
|
||||
ONE_MINUS_SRC_COLOR = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR,
|
||||
DST_COLOR = SDL_GPU_BLENDFACTOR_DST_COLOR,
|
||||
ONE_MINUS_DST_COLOR = SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR,
|
||||
SRC_ALPHA = SDL_GPU_BLENDFACTOR_SRC_ALPHA,
|
||||
ONE_MINUS_SRC_ALPHA = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
|
||||
DST_ALPHA = SDL_GPU_BLENDFACTOR_DST_ALPHA,
|
||||
ONE_MINUS_DST_ALPHA = SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA,
|
||||
CONSTANT_COLOR = SDL_GPU_BLENDFACTOR_CONSTANT_COLOR,
|
||||
ONE_MINUS_CONSTANT_COLOR = SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR,
|
||||
SRC_ALPHA_SATURATE = SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE
|
||||
};
|
||||
|
||||
enum class GPUBlendOp
|
||||
{
|
||||
ADD = SDL_GPU_BLENDOP_ADD,
|
||||
SUBTRACT = SDL_GPU_BLENDOP_SUBTRACT,
|
||||
REVERSE_SUBTRACT = SDL_GPU_BLENDOP_REVERSE_SUBTRACT,
|
||||
MIN = SDL_GPU_BLENDOP_MIN,
|
||||
MAX = SDL_GPU_BLENDOP_MAX
|
||||
};
|
||||
|
||||
struct GPUColorComponentFlags : mijin::BitFlags<GPUColorComponentFlags>
|
||||
{
|
||||
bool r : 1 = false;
|
||||
bool g : 1 = false;
|
||||
bool b : 1 = false;
|
||||
bool a : 1 = false;
|
||||
};
|
||||
|
||||
struct GPUColorTargetBlendState
|
||||
{
|
||||
bool enableBlend = false;
|
||||
GPUBlendFactor srcColorBlendfactor;
|
||||
GPUBlendFactor dstColorBlendfactor;
|
||||
GPUBlendOp colorBlendOp;
|
||||
GPUBlendFactor srcAlphaBlendfactor;
|
||||
GPUBlendFactor dstAlphaBlendfactor;
|
||||
GPUBlendOp alphaBlendOp;
|
||||
GPUColorComponentFlags colorWriteMask = {.r = true, .g = true, .b = true, .a = true};
|
||||
};
|
||||
|
||||
enum class GPUTextureFormat
|
||||
{
|
||||
INVALID = SDL_GPU_TEXTUREFORMAT_INVALID,
|
||||
A8_UNORM = SDL_GPU_TEXTUREFORMAT_A8_UNORM,
|
||||
R8_UNORM = SDL_GPU_TEXTUREFORMAT_R8_UNORM,
|
||||
R8G8_UNORM = SDL_GPU_TEXTUREFORMAT_R8G8_UNORM,
|
||||
R8G8B8A8_UNORM = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM,
|
||||
R16_UNORM = SDL_GPU_TEXTUREFORMAT_R16_UNORM,
|
||||
R16G16_UNORM = SDL_GPU_TEXTUREFORMAT_R16G16_UNORM,
|
||||
R16G16B16A16_UNORM = SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM,
|
||||
R10G10B10A2_UNORM = SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM,
|
||||
B5G6R5_UNORM = SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM,
|
||||
B5G5R5A1_UNORM = SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM,
|
||||
B4G4R4A4_UNORM = SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM,
|
||||
B8G8R8A8_UNORM = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM,
|
||||
BC1_RGBA_UNORM = SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM,
|
||||
BC2_RGBA_UNORM = SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM,
|
||||
BC3_RGBA_UNORM = SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM,
|
||||
BC4_R_UNORM = SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM,
|
||||
BC5_RG_UNORM = SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM,
|
||||
BC7_RGBA_UNORM = SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM,
|
||||
BC6H_RGB_FLOAT = SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT,
|
||||
BC6H_RGB_UFLOAT = SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT,
|
||||
R8_SNORM = SDL_GPU_TEXTUREFORMAT_R8_SNORM,
|
||||
R8G8_SNORM = SDL_GPU_TEXTUREFORMAT_R8G8_SNORM,
|
||||
R8G8B8A8_SNORM = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM,
|
||||
R16_SNORM = SDL_GPU_TEXTUREFORMAT_R16_SNORM,
|
||||
R16G16_SNORM = SDL_GPU_TEXTUREFORMAT_R16G16_SNORM,
|
||||
R16G16B16A16_SNORM = SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM,
|
||||
R16_FLOAT = SDL_GPU_TEXTUREFORMAT_R16_FLOAT,
|
||||
R16G16_FLOAT = SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT,
|
||||
R16G16B16A16_FLOAT = SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT,
|
||||
R32_FLOAT = SDL_GPU_TEXTUREFORMAT_R32_FLOAT,
|
||||
R32G32_FLOAT = SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT,
|
||||
R32G32B32A32_FLOAT = SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT,
|
||||
R11G11B10_UFLOAT = SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT,
|
||||
R8_UINT = SDL_GPU_TEXTUREFORMAT_R8_UINT,
|
||||
R8G8_UINT = SDL_GPU_TEXTUREFORMAT_R8G8_UINT,
|
||||
R8G8B8A8_UINT = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT,
|
||||
R16_UINT = SDL_GPU_TEXTUREFORMAT_R16_UINT,
|
||||
R16G16_UINT = SDL_GPU_TEXTUREFORMAT_R16G16_UINT,
|
||||
R16G16B16A16_UINT = SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT,
|
||||
R8_INT = SDL_GPU_TEXTUREFORMAT_R8_INT,
|
||||
R8G8_INT = SDL_GPU_TEXTUREFORMAT_R8G8_INT,
|
||||
R8G8B8A8_INT = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT,
|
||||
R16_INT = SDL_GPU_TEXTUREFORMAT_R16_INT,
|
||||
R16G16_INT = SDL_GPU_TEXTUREFORMAT_R16G16_INT,
|
||||
R16G16B16A16_INT = SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT,
|
||||
R8G8B8A8_UNORM_SRGB = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB,
|
||||
B8G8R8A8_UNORM_SRGB = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB,
|
||||
BC1_RGBA_UNORM_SRGB = SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB,
|
||||
BC2_RGBA_UNORM_SRGB = SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB,
|
||||
BC3_RGBA_UNORM_SRGB = SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB,
|
||||
BC7_RGBA_UNORM_SRGB = SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB,
|
||||
D16_UNORM = SDL_GPU_TEXTUREFORMAT_D16_UNORM,
|
||||
D24_UNORM = SDL_GPU_TEXTUREFORMAT_D24_UNORM,
|
||||
D32_FLOAT = SDL_GPU_TEXTUREFORMAT_D32_FLOAT,
|
||||
D24_UNORM_S8_UINT = SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT,
|
||||
D32_FLOAT_S8_UINT = SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT
|
||||
};
|
||||
|
||||
struct GPUColorTargetDescription
|
||||
{
|
||||
GPUTextureFormat format = GPUTextureFormat::INVALID;
|
||||
GPUColorTargetBlendState blendState;
|
||||
};
|
||||
|
||||
static_assert(sizeof(GPUColorTargetDescription) == sizeof(SDL_GPUColorTargetDescription)
|
||||
&& alignof(GPUColorTargetDescription) == alignof(SDL_GPUColorTargetDescription));
|
||||
|
||||
struct GPUGraphicsPipelineTargetInfo
|
||||
{
|
||||
std::vector<GPUColorTargetDescription> colorTargetDescriptions;
|
||||
bool hasDepthStencilTarget = false;
|
||||
GPUTextureFormat depthStencilFormat = GPUTextureFormat::INVALID;
|
||||
|
||||
explicit operator SDL_GpuGraphicsPipelineTargetInfo() const noexcept
|
||||
{
|
||||
return {
|
||||
.color_target_descriptions = std::bit_cast<const SDL_GPUColorTargetDescription*>(colorTargetDescriptions.data()),
|
||||
.num_color_targets = static_cast<Uint32>(colorTargetDescriptions.size()),
|
||||
.has_depth_stencil_target = hasDepthStencilTarget,
|
||||
.depth_stencil_format = static_cast<SDL_GPUTextureFormat>(depthStencilFormat)
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
struct GPUGraphicsPipelineCreateArgs
|
||||
{
|
||||
SDL_GPUShader* vertexShader;
|
||||
SDL_GPUShader* fragmentShader;
|
||||
GPUVertexInputState vertexInputState;
|
||||
GPUPrimitiveType primitiveType = GPUPrimitiveType::TRIANGLELIST;
|
||||
GPURasterizerState rasterizerState;
|
||||
GPUMultisampleState multisampleState;
|
||||
GPUDepthStencilState depthStencilState;
|
||||
GPUGraphicsPipelineTargetInfo targetInfo;
|
||||
};
|
||||
|
||||
class GPUGraphicsPipeline : public Base<SDL_GPUGraphicsPipeline, GPUGraphicsPipeline>
|
||||
{
|
||||
private:
|
||||
SDL_GPUDevice* mDevice = nullptr;
|
||||
public:
|
||||
GPUGraphicsPipeline() noexcept = default;
|
||||
GPUGraphicsPipeline(const GPUGraphicsPipeline&) = delete;
|
||||
GPUGraphicsPipeline(GPUGraphicsPipeline&& other) noexcept : Base(std::move(other)) {}
|
||||
|
||||
GPUGraphicsPipeline& operator=(const GPUGraphicsPipeline&) = delete;
|
||||
GPUGraphicsPipeline& operator=(GPUGraphicsPipeline&& other) noexcept
|
||||
{
|
||||
Base::operator=(std::move(other));
|
||||
return *this;
|
||||
}
|
||||
auto operator<=>(const GPUGraphicsPipeline& other) const noexcept = default;
|
||||
|
||||
void create(SDL_GPUDevice* device, const GPUGraphicsPipelineCreateArgs& args)
|
||||
{
|
||||
MIJIN_ASSERT(mHandle == nullptr, "GPUGraphicsPipeline has already been created.");
|
||||
const SDL_GPUGraphicsPipelineCreateInfo createInfo =
|
||||
{
|
||||
.vertex_shader = args.vertexShader,
|
||||
.fragment_shader = args.fragmentShader,
|
||||
.vertex_input_state = {
|
||||
.vertex_bindings = std::bit_cast<SDL_GPUVertexBinding*>(args.vertexInputState.vertexBindings.data()),
|
||||
.num_vertex_bindings = static_cast<Uint32>(args.vertexInputState.vertexBindings.size()),
|
||||
.vertex_attributes = std::bit_cast<SDL_GPUVertexAttribute*>(args.vertexInputState.vertexAttributes.data()),
|
||||
.num_vertex_attributes = static_cast<Uint32>(args.vertexInputState.vertexAttributes.size())
|
||||
},
|
||||
.primitive_type = static_cast<SDL_GPUPrimitiveType>(args.primitiveType),
|
||||
.rasterizer_state = {
|
||||
.fill_mode = static_cast<SDL_GPUFillMode>(args.rasterizerState.fillMode),
|
||||
.cull_mode = static_cast<SDL_GPUCullMode>(args.rasterizerState.cullMode),
|
||||
.front_face = static_cast<SDL_GPUFrontFace>(args.rasterizerState.frontFace),
|
||||
.enable_depth_bias = args.rasterizerState.enableDepthBias,
|
||||
.depth_bias_constant_factor = args.rasterizerState.depthBiasConstantFactor,
|
||||
.depth_bias_clamp = args.rasterizerState.depthBiasClamp,
|
||||
.depth_bias_slope_factor = args.rasterizerState.depthBiasSlopeFactor
|
||||
},
|
||||
.multisample_state = {
|
||||
.sample_count = static_cast<SDL_GPUSampleCount>(args.multisampleState.sampleCount),
|
||||
.sample_mask = args.multisampleState.sampleMask
|
||||
},
|
||||
.depth_stencil_state = {
|
||||
.enable_depth_test = args.depthStencilState.enableDepthTest,
|
||||
.enable_depth_write = args.depthStencilState.enableDepthWrite,
|
||||
.enable_stencil_test = args.depthStencilState.enableStencilTest,
|
||||
.compare_op = static_cast<SDL_GPUCompareOp>(args.depthStencilState.compareOp),
|
||||
.back_stencil_state = static_cast<SDL_GPUStencilOpState>(args.depthStencilState.backStencilState),
|
||||
.front_stencil_state = static_cast<SDL_GPUStencilOpState>(args.depthStencilState.frontStencilState),
|
||||
.compare_mask = args.depthStencilState.compareMask,
|
||||
.write_mask = args.depthStencilState.writeMask
|
||||
},
|
||||
.target_info = static_cast<SDL_GpuGraphicsPipelineTargetInfo>(args.targetInfo),
|
||||
.props = 0
|
||||
};
|
||||
mHandle = SDL_CreateGPUGraphicsPipeline(device, &createInfo);
|
||||
if (mHandle == nullptr)
|
||||
{
|
||||
throw SDLError();
|
||||
}
|
||||
mDevice = device;
|
||||
}
|
||||
|
||||
void destroy() noexcept
|
||||
{
|
||||
if (mHandle != nullptr)
|
||||
{
|
||||
SDL_ReleaseGPUGraphicsPipeline(mDevice, mHandle);
|
||||
mDevice = nullptr;
|
||||
mHandle = nullptr;
|
||||
}
|
||||
}
|
||||
};
|
||||
} // namespace sdlpp
|
||||
|
||||
#endif // !defined(SDL_GPU_TEST_PRIVATE_SDL_GPU_TEST_SDLPP_GPU_HPP_INCLUDED)
|
||||
|
Loading…
x
Reference in New Issue
Block a user