mirror of
https://github.com/skyline-emu/skyline.git
synced 2024-12-23 17:01:49 +01:00
Implement Maxwell3D Vertex Buffer Limit
Sets the end of VBOs based on the `vertexArrayLimits` register array which provides an IOVA to the end of the VBO.
This commit is contained in:
parent
d8890f13e1
commit
c2a6da6431
@ -766,7 +766,10 @@ namespace skyline::gpu::interconnect {
|
||||
|
||||
/* Vertex Buffers */
|
||||
private:
|
||||
std::array<IOVA, maxwell3d::VertexBufferCount> vertexBindingIovas{};
|
||||
struct VertexBuffer {
|
||||
IOVA start{}, end{}; //!< IOVAs covering a contiguous region in GPU AS with the vertex buffer
|
||||
};
|
||||
std::array<VertexBuffer, maxwell3d::VertexBufferCount> vertexBuffers{};
|
||||
std::array<vk::VertexInputBindingDescription, maxwell3d::VertexBufferCount> vertexBindings{};
|
||||
std::array<vk::VertexInputBindingDivisorDescriptionEXT, maxwell3d::VertexBufferCount> vertexBindingDivisors{};
|
||||
vk::StructureChain<vk::PipelineVertexInputStateCreateInfo, vk::PipelineVertexInputDivisorStateCreateInfoEXT> vertexState{
|
||||
@ -788,12 +791,20 @@ namespace skyline::gpu::interconnect {
|
||||
vertexBindings[index].inputRate = isPerInstance ? vk::VertexInputRate::eInstance : vk::VertexInputRate::eVertex;
|
||||
}
|
||||
|
||||
void SetVertexBufferIovaHigh(u32 index, u32 high) {
|
||||
vertexBindingIovas[index].high = high;
|
||||
void SetVertexBufferStartIovaHigh(u32 index, u32 high) {
|
||||
vertexBuffers[index].start.high = high;
|
||||
}
|
||||
|
||||
void SetVertexBufferIovaLow(u32 index, u32 low) {
|
||||
vertexBindingIovas[index].low = low;
|
||||
void SetVertexBufferStartIovaLow(u32 index, u32 low) {
|
||||
vertexBuffers[index].start.low = low;
|
||||
}
|
||||
|
||||
void SetVertexBufferEndIovaHigh(u32 index, u32 high) {
|
||||
vertexBuffers[index].end.high = high;
|
||||
}
|
||||
|
||||
void SetVertexBufferEndIovaLow(u32 index, u32 low) {
|
||||
vertexBuffers[index].end.low = low;
|
||||
}
|
||||
|
||||
void SetVertexBufferDivisor(u32 index, u32 divisor) {
|
||||
|
@ -329,16 +329,22 @@ namespace skyline::soc::gm20b::engine::maxwell3d {
|
||||
context.SetVertexBufferStride(index, config.stride); \
|
||||
}) \
|
||||
MAXWELL3D_ARRAY_STRUCT_STRUCT_CASE(vertexBuffers, index, iova, high, { \
|
||||
context.SetVertexBufferIovaHigh(index, high); \
|
||||
context.SetVertexBufferStartIovaHigh(index, high); \
|
||||
}) \
|
||||
MAXWELL3D_ARRAY_STRUCT_STRUCT_CASE(vertexBuffers, index, iova, low, { \
|
||||
context.SetVertexBufferIovaLow(index, low); \
|
||||
context.SetVertexBufferStartIovaLow(index, low); \
|
||||
}) \
|
||||
MAXWELL3D_ARRAY_STRUCT_CASE(vertexBuffers, index, divisor, { \
|
||||
context.SetVertexBufferDivisor(index, divisor); \
|
||||
}) \
|
||||
MAXWELL3D_ARRAY_CASE(isVertexInputRatePerInstance, index, { \
|
||||
context.SetVertexBufferInputRate(index, isVertexInputRatePerInstance); \
|
||||
}) \
|
||||
MAXWELL3D_ARRAY_STRUCT_CASE(vertexBufferLimits, index, high, { \
|
||||
context.SetVertexBufferEndIovaHigh(index, high); \
|
||||
}) \
|
||||
MAXWELL3D_ARRAY_STRUCT_CASE(vertexBufferLimits, index, low, { \
|
||||
context.SetVertexBufferEndIovaLow(index, low); \
|
||||
})
|
||||
|
||||
BOOST_PP_REPEAT(16, VERTEX_BUFFER_CALLBACKS, 0)
|
||||
|
@ -258,6 +258,8 @@ namespace skyline::soc::gm20b::engine::maxwell3d {
|
||||
};
|
||||
Register<0x780, std::array<IndependentBlend, type::RenderTargetCount>> independentBlend;
|
||||
|
||||
Register<0x7C0, std::array<type::Address, type::VertexBufferCount>> vertexBufferLimits; //!< A per-VBO IOVA denoting the end of the vertex buffer
|
||||
|
||||
Register<0x800, std::array<type::SetProgramInfo, type::StageCount>> setProgram;
|
||||
|
||||
Register<0x8C0, u32[0x20]> firmwareCall;
|
||||
|
Loading…
Reference in New Issue
Block a user