mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	vk_rasterizer: Pass Maxwell registers to dynamic updates
This commit is contained in:
		@@ -726,13 +726,13 @@ void RasterizerVulkan::SetupImageTransitions(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerVulkan::UpdateDynamicStates() {
 | 
			
		||||
    auto& gpu = system.GPU().Maxwell3D();
 | 
			
		||||
    UpdateViewportsState(gpu);
 | 
			
		||||
    UpdateScissorsState(gpu);
 | 
			
		||||
    UpdateDepthBias(gpu);
 | 
			
		||||
    UpdateBlendConstants(gpu);
 | 
			
		||||
    UpdateDepthBounds(gpu);
 | 
			
		||||
    UpdateStencilFaces(gpu);
 | 
			
		||||
    auto& regs = system.GPU().Maxwell3D().regs;
 | 
			
		||||
    UpdateViewportsState(regs);
 | 
			
		||||
    UpdateScissorsState(regs);
 | 
			
		||||
    UpdateDepthBias(regs);
 | 
			
		||||
    UpdateBlendConstants(regs);
 | 
			
		||||
    UpdateDepthBounds(regs);
 | 
			
		||||
    UpdateStencilFaces(regs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerVulkan::SetupVertexArrays(FixedPipelineState::VertexInput& vertex_input,
 | 
			
		||||
@@ -978,11 +978,10 @@ void RasterizerVulkan::SetupImage(const Tegra::Texture::TICEntry& tic, const Ima
 | 
			
		||||
    image_views.push_back(ImageView{std::move(view), image_layout});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerVulkan::UpdateViewportsState(Tegra::Engines::Maxwell3D& gpu) {
 | 
			
		||||
void RasterizerVulkan::UpdateViewportsState(Tegra::Engines::Maxwell3D::Regs& regs) {
 | 
			
		||||
    if (!state_tracker.TouchViewports()) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    const auto& regs = gpu.regs;
 | 
			
		||||
    const std::array viewports{
 | 
			
		||||
        GetViewportState(device, regs, 0),  GetViewportState(device, regs, 1),
 | 
			
		||||
        GetViewportState(device, regs, 2),  GetViewportState(device, regs, 3),
 | 
			
		||||
@@ -997,11 +996,10 @@ void RasterizerVulkan::UpdateViewportsState(Tegra::Engines::Maxwell3D& gpu) {
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D& gpu) {
 | 
			
		||||
void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs) {
 | 
			
		||||
    if (!state_tracker.TouchScissors()) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    const auto& regs = gpu.regs;
 | 
			
		||||
    const std::array scissors = {
 | 
			
		||||
        GetScissorState(regs, 0),  GetScissorState(regs, 1),  GetScissorState(regs, 2),
 | 
			
		||||
        GetScissorState(regs, 3),  GetScissorState(regs, 4),  GetScissorState(regs, 5),
 | 
			
		||||
@@ -1014,42 +1012,39 @@ void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D& gpu) {
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D& gpu) {
 | 
			
		||||
void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs) {
 | 
			
		||||
    if (!state_tracker.TouchDepthBias()) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    const auto& regs = gpu.regs;
 | 
			
		||||
    scheduler.Record([constant = regs.polygon_offset_units, clamp = regs.polygon_offset_clamp,
 | 
			
		||||
                      factor = regs.polygon_offset_factor](auto cmdbuf, auto& dld) {
 | 
			
		||||
        cmdbuf.setDepthBias(constant, clamp, factor / 2.0f, dld);
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerVulkan::UpdateBlendConstants(Tegra::Engines::Maxwell3D& gpu) {
 | 
			
		||||
void RasterizerVulkan::UpdateBlendConstants(Tegra::Engines::Maxwell3D::Regs& regs) {
 | 
			
		||||
    if (!state_tracker.TouchBlendConstants()) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    const std::array blend_color = {gpu.regs.blend_color.r, gpu.regs.blend_color.g,
 | 
			
		||||
                                    gpu.regs.blend_color.b, gpu.regs.blend_color.a};
 | 
			
		||||
    const std::array blend_color = {regs.blend_color.r, regs.blend_color.g, regs.blend_color.b,
 | 
			
		||||
                                    regs.blend_color.a};
 | 
			
		||||
    scheduler.Record([blend_color](auto cmdbuf, auto& dld) {
 | 
			
		||||
        cmdbuf.setBlendConstants(blend_color.data(), dld);
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerVulkan::UpdateDepthBounds(Tegra::Engines::Maxwell3D& gpu) {
 | 
			
		||||
void RasterizerVulkan::UpdateDepthBounds(Tegra::Engines::Maxwell3D::Regs& regs) {
 | 
			
		||||
    if (!state_tracker.TouchDepthBounds()) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    const auto& regs = gpu.regs;
 | 
			
		||||
    scheduler.Record([min = regs.depth_bounds[0], max = regs.depth_bounds[1]](
 | 
			
		||||
                         auto cmdbuf, auto& dld) { cmdbuf.setDepthBounds(min, max, dld); });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerVulkan::UpdateStencilFaces(Tegra::Engines::Maxwell3D& gpu) {
 | 
			
		||||
void RasterizerVulkan::UpdateStencilFaces(Tegra::Engines::Maxwell3D::Regs& regs) {
 | 
			
		||||
    if (!state_tracker.TouchStencilProperties()) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    const auto& regs = gpu.regs;
 | 
			
		||||
    if (regs.stencil_two_side_enable) {
 | 
			
		||||
        // Separate values per face
 | 
			
		||||
        scheduler.Record(
 | 
			
		||||
 
 | 
			
		||||
@@ -217,12 +217,12 @@ private:
 | 
			
		||||
 | 
			
		||||
    void SetupImage(const Tegra::Texture::TICEntry& tic, const ImageEntry& entry);
 | 
			
		||||
 | 
			
		||||
    void UpdateViewportsState(Tegra::Engines::Maxwell3D& gpu);
 | 
			
		||||
    void UpdateScissorsState(Tegra::Engines::Maxwell3D& gpu);
 | 
			
		||||
    void UpdateDepthBias(Tegra::Engines::Maxwell3D& gpu);
 | 
			
		||||
    void UpdateBlendConstants(Tegra::Engines::Maxwell3D& gpu);
 | 
			
		||||
    void UpdateDepthBounds(Tegra::Engines::Maxwell3D& gpu);
 | 
			
		||||
    void UpdateStencilFaces(Tegra::Engines::Maxwell3D& gpu);
 | 
			
		||||
    void UpdateViewportsState(Tegra::Engines::Maxwell3D::Regs& regs);
 | 
			
		||||
    void UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs);
 | 
			
		||||
    void UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs);
 | 
			
		||||
    void UpdateBlendConstants(Tegra::Engines::Maxwell3D::Regs& regs);
 | 
			
		||||
    void UpdateDepthBounds(Tegra::Engines::Maxwell3D::Regs& regs);
 | 
			
		||||
    void UpdateStencilFaces(Tegra::Engines::Maxwell3D::Regs& regs);
 | 
			
		||||
 | 
			
		||||
    std::size_t CalculateGraphicsStreamBufferSize(bool is_indexed) const;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user