diff options
Diffstat (limited to 'src/video_core/renderer_vulkan/fixed_pipeline_state.h')
-rw-r--r-- | src/video_core/renderer_vulkan/fixed_pipeline_state.h | 54 |
1 files changed, 5 insertions, 49 deletions
diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.h b/src/video_core/renderer_vulkan/fixed_pipeline_state.h index 9393cb24c..9fe6bdbf9 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.h +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.h @@ -17,13 +17,7 @@ namespace Vulkan { using Maxwell = Tegra::Engines::Maxwell3D::Regs; -// TODO(Rodrigo): Optimize this structure. - -template <class T> -inline constexpr bool IsHashable = std::has_unique_object_representations_v<T>&& - std::is_trivially_copyable_v<T>&& std::is_trivially_constructible_v<T>; - -struct FixedPipelineState { +struct alignas(32) FixedPipelineState { static u32 PackComparisonOp(Maxwell::ComparisonOp op) noexcept; static Maxwell::ComparisonOp UnpackComparisonOp(u32 packed) noexcept; @@ -102,7 +96,6 @@ struct FixedPipelineState { return UnpackBlendFactor(factor_dest_a.Value()); } }; - static_assert(IsHashable<BlendingAttachment>); struct VertexInput { union Binding { @@ -151,16 +144,7 @@ struct FixedPipelineState { attribute.type.Assign(static_cast<u32>(type)); attribute.size.Assign(static_cast<u32>(size)); } - - std::size_t Hash() const noexcept; - - bool operator==(const VertexInput& rhs) const noexcept; - - bool operator!=(const VertexInput& rhs) const noexcept { - return !operator==(rhs); - } }; - static_assert(IsHashable<VertexInput>); struct Rasterizer { union { @@ -187,14 +171,6 @@ struct FixedPipelineState { void Fill(const Maxwell& regs) noexcept; - std::size_t Hash() const noexcept; - - bool operator==(const Rasterizer& rhs) const noexcept; - - bool operator!=(const Rasterizer& rhs) const noexcept { - return !operator==(rhs); - } - constexpr Maxwell::PrimitiveTopology Topology() const noexcept { return static_cast<Maxwell::PrimitiveTopology>(topology.Value()); } @@ -207,7 +183,6 @@ struct FixedPipelineState { return UnpackFrontFace(front_face.Value()); } }; - static_assert(IsHashable<Rasterizer>); struct DepthStencil { template <std::size_t Position> @@ -247,39 +222,22 @@ struct FixedPipelineState { void Fill(const Maxwell& regs) noexcept; - std::size_t Hash() const noexcept; - - bool operator==(const DepthStencil& rhs) const noexcept; - - bool operator!=(const DepthStencil& rhs) const noexcept { - return !operator==(rhs); - } - Maxwell::ComparisonOp DepthTestFunc() const noexcept { return UnpackComparisonOp(depth_test_func); } }; - static_assert(IsHashable<DepthStencil>); struct ColorBlending { std::array<BlendingAttachment, Maxwell::NumRenderTargets> attachments; void Fill(const Maxwell& regs) noexcept; - - std::size_t Hash() const noexcept; - - bool operator==(const ColorBlending& rhs) const noexcept; - - bool operator!=(const ColorBlending& rhs) const noexcept { - return !operator==(rhs); - } }; - static_assert(IsHashable<ColorBlending>); VertexInput vertex_input; Rasterizer rasterizer; DepthStencil depth_stencil; ColorBlending color_blending; + std::array<u8, 20> padding; std::size_t Hash() const noexcept; @@ -289,12 +247,10 @@ struct FixedPipelineState { return !operator==(rhs); } }; -static_assert(std::is_trivially_copyable_v<FixedPipelineState::BlendingAttachment>); -static_assert(std::is_trivially_copyable_v<FixedPipelineState::VertexInput>); -static_assert(std::is_trivially_copyable_v<FixedPipelineState::Rasterizer>); -static_assert(std::is_trivially_copyable_v<FixedPipelineState::DepthStencil>); -static_assert(std::is_trivially_copyable_v<FixedPipelineState::ColorBlending>); +static_assert(std::has_unique_object_representations_v<FixedPipelineState>); static_assert(std::is_trivially_copyable_v<FixedPipelineState>); +static_assert(std::is_trivially_constructible_v<FixedPipelineState>); +static_assert(sizeof(FixedPipelineState) % 32 == 0, "Size is not aligned"); FixedPipelineState GetFixedPipelineState(const Maxwell& regs); |