|
|
@ -7,6 +7,7 @@ |
|
|
#include <array> |
|
|
#include <array> |
|
|
#include <type_traits> |
|
|
#include <type_traits> |
|
|
|
|
|
|
|
|
|
|
|
#include "common/bit_field.h" |
|
|
#include "common/common_types.h" |
|
|
#include "common/common_types.h" |
|
|
|
|
|
|
|
|
#include "video_core/engines/maxwell_3d.h" |
|
|
#include "video_core/engines/maxwell_3d.h" |
|
|
@ -18,48 +19,11 @@ using Maxwell = Tegra::Engines::Maxwell3D::Regs; |
|
|
|
|
|
|
|
|
// TODO(Rodrigo): Optimize this structure. |
|
|
// TODO(Rodrigo): Optimize this structure. |
|
|
|
|
|
|
|
|
struct FixedPipelineState { |
|
|
|
|
|
using PixelFormat = VideoCore::Surface::PixelFormat; |
|
|
|
|
|
|
|
|
|
|
|
struct VertexBinding { |
|
|
|
|
|
constexpr VertexBinding(u32 index, u32 stride, u32 divisor) |
|
|
|
|
|
: index{index}, stride{stride}, divisor{divisor} {} |
|
|
|
|
|
VertexBinding() = default; |
|
|
|
|
|
|
|
|
|
|
|
u32 index; |
|
|
|
|
|
u32 stride; |
|
|
|
|
|
u32 divisor; |
|
|
|
|
|
|
|
|
|
|
|
std::size_t Hash() const noexcept; |
|
|
|
|
|
|
|
|
|
|
|
bool operator==(const VertexBinding& rhs) const noexcept; |
|
|
|
|
|
|
|
|
|
|
|
bool operator!=(const VertexBinding& rhs) const noexcept { |
|
|
|
|
|
return !operator==(rhs); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
struct VertexAttribute { |
|
|
|
|
|
constexpr VertexAttribute(u32 index, u32 buffer, Maxwell::VertexAttribute::Type type, |
|
|
|
|
|
Maxwell::VertexAttribute::Size size, u32 offset) |
|
|
|
|
|
: index{index}, buffer{buffer}, type{type}, size{size}, offset{offset} {} |
|
|
|
|
|
VertexAttribute() = default; |
|
|
|
|
|
|
|
|
|
|
|
u32 index; |
|
|
|
|
|
u32 buffer; |
|
|
|
|
|
Maxwell::VertexAttribute::Type type; |
|
|
|
|
|
Maxwell::VertexAttribute::Size size; |
|
|
|
|
|
u32 offset; |
|
|
|
|
|
|
|
|
|
|
|
std::size_t Hash() const noexcept; |
|
|
|
|
|
|
|
|
|
|
|
bool operator==(const VertexAttribute& rhs) const noexcept; |
|
|
|
|
|
|
|
|
|
|
|
bool operator!=(const VertexAttribute& rhs) const noexcept { |
|
|
|
|
|
return !operator==(rhs); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
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 StencilFace { |
|
|
struct StencilFace { |
|
|
constexpr StencilFace(Maxwell::StencilOp action_stencil_fail, |
|
|
constexpr StencilFace(Maxwell::StencilOp action_stencil_fail, |
|
|
Maxwell::StencilOp action_depth_fail, |
|
|
Maxwell::StencilOp action_depth_fail, |
|
|
@ -114,10 +78,52 @@ struct FixedPipelineState { |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
struct VertexInput { |
|
|
struct VertexInput { |
|
|
std::size_t num_bindings = 0; |
|
|
|
|
|
std::size_t num_attributes = 0; |
|
|
|
|
|
std::array<VertexBinding, Maxwell::NumVertexArrays> bindings; |
|
|
|
|
|
std::array<VertexAttribute, Maxwell::NumVertexAttributes> attributes; |
|
|
|
|
|
|
|
|
union Binding { |
|
|
|
|
|
u16 raw; |
|
|
|
|
|
BitField<0, 1, u16> enabled; |
|
|
|
|
|
BitField<1, 12, u16> stride; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
union Attribute { |
|
|
|
|
|
u32 raw; |
|
|
|
|
|
BitField<0, 1, u32> enabled; |
|
|
|
|
|
BitField<1, 5, u32> buffer; |
|
|
|
|
|
BitField<6, 14, u32> offset; |
|
|
|
|
|
BitField<20, 3, u32> type; |
|
|
|
|
|
BitField<23, 6, u32> size; |
|
|
|
|
|
|
|
|
|
|
|
constexpr Maxwell::VertexAttribute::Type Type() const noexcept { |
|
|
|
|
|
return static_cast<Maxwell::VertexAttribute::Type>(type.Value()); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
constexpr Maxwell::VertexAttribute::Size Size() const noexcept { |
|
|
|
|
|
return static_cast<Maxwell::VertexAttribute::Size>(size.Value()); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
std::array<Binding, Maxwell::NumVertexArrays> bindings; |
|
|
|
|
|
std::array<u32, Maxwell::NumVertexArrays> binding_divisors; |
|
|
|
|
|
std::array<Attribute, Maxwell::NumVertexAttributes> attributes; |
|
|
|
|
|
|
|
|
|
|
|
void SetBinding(std::size_t index, bool enabled, u32 stride, u32 divisor) noexcept { |
|
|
|
|
|
auto& binding = bindings[index]; |
|
|
|
|
|
binding.raw = 0; |
|
|
|
|
|
binding.enabled.Assign(enabled ? 1 : 0); |
|
|
|
|
|
binding.stride.Assign(stride); |
|
|
|
|
|
binding_divisors[index] = divisor; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void SetAttribute(std::size_t index, bool enabled, u32 buffer, u32 offset, |
|
|
|
|
|
Maxwell::VertexAttribute::Type type, |
|
|
|
|
|
Maxwell::VertexAttribute::Size size) noexcept { |
|
|
|
|
|
auto& attribute = attributes[index]; |
|
|
|
|
|
attribute.raw = 0; |
|
|
|
|
|
attribute.enabled.Assign(enabled ? 1 : 0); |
|
|
|
|
|
attribute.buffer.Assign(buffer); |
|
|
|
|
|
attribute.offset.Assign(offset); |
|
|
|
|
|
attribute.type.Assign(static_cast<u32>(type)); |
|
|
|
|
|
attribute.size.Assign(static_cast<u32>(size)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
std::size_t Hash() const noexcept; |
|
|
std::size_t Hash() const noexcept; |
|
|
|
|
|
|
|
|
@ -127,6 +133,7 @@ struct FixedPipelineState { |
|
|
return !operator==(rhs); |
|
|
return !operator==(rhs); |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
static_assert(IsHashable<VertexInput>); |
|
|
|
|
|
|
|
|
struct InputAssembly { |
|
|
struct InputAssembly { |
|
|
constexpr InputAssembly(Maxwell::PrimitiveTopology topology, bool primitive_restart_enable, |
|
|
constexpr InputAssembly(Maxwell::PrimitiveTopology topology, bool primitive_restart_enable, |
|
|
@ -256,8 +263,6 @@ struct FixedPipelineState { |
|
|
DepthStencil depth_stencil; |
|
|
DepthStencil depth_stencil; |
|
|
ColorBlending color_blending; |
|
|
ColorBlending color_blending; |
|
|
}; |
|
|
}; |
|
|
static_assert(std::is_trivially_copyable_v<FixedPipelineState::VertexBinding>); |
|
|
|
|
|
static_assert(std::is_trivially_copyable_v<FixedPipelineState::VertexAttribute>); |
|
|
|
|
|
static_assert(std::is_trivially_copyable_v<FixedPipelineState::StencilFace>); |
|
|
static_assert(std::is_trivially_copyable_v<FixedPipelineState::StencilFace>); |
|
|
static_assert(std::is_trivially_copyable_v<FixedPipelineState::BlendingAttachment>); |
|
|
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::VertexInput>); |
|
|
|