mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-04-27 17:58:59 +02:00
[vk] Removed Sample Locations
This commit is contained in:
parent
29d9629f0d
commit
b7213c1282
6 changed files with 9 additions and 119 deletions
|
|
@ -798,30 +798,6 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) {
|
|||
key.state.alpha_to_one_enabled != 0 ? VK_TRUE : VK_FALSE,
|
||||
};
|
||||
|
||||
const auto [sample_grid_width, sample_grid_height] =
|
||||
VideoCommon::SampleLocationGridSize(msaa_mode);
|
||||
const u32 sample_count = static_cast<u32>(VideoCommon::NumSamples(msaa_mode));
|
||||
const u32 total_sample_locations = sample_count * sample_grid_width * sample_grid_height;
|
||||
std::array<VkSampleLocationEXT, VideoCommon::MaxSampleLocationSlots> default_sample_locations{};
|
||||
VkSampleLocationsInfoEXT sample_locations_info{
|
||||
.sType = VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT,
|
||||
.pNext = nullptr,
|
||||
.sampleLocationsPerPixel = vk_samples,
|
||||
.sampleLocationGridSize = {sample_grid_width, sample_grid_height},
|
||||
.sampleLocationsCount = total_sample_locations,
|
||||
.pSampleLocations = default_sample_locations.data(),
|
||||
};
|
||||
VkPipelineSampleLocationsStateCreateInfoEXT sample_locations_ci{
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT,
|
||||
.pNext = nullptr,
|
||||
.sampleLocationsEnable = VK_FALSE,
|
||||
.sampleLocationsInfo = sample_locations_info,
|
||||
};
|
||||
if (device.IsExtSampleLocationsSupported() && total_sample_locations > 0 &&
|
||||
device.SupportsSampleLocationsFor(vk_samples)) {
|
||||
sample_locations_ci.sampleLocationsEnable = VK_TRUE;
|
||||
sample_locations_ci.pNext = std::exchange(multisample_ci.pNext, &sample_locations_ci);
|
||||
}
|
||||
const VkPipelineDepthStencilStateCreateInfo depth_stencil_ci{
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
|
||||
.pNext = nullptr,
|
||||
|
|
@ -960,10 +936,6 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) {
|
|||
}
|
||||
}
|
||||
|
||||
if (sample_locations_ci.sampleLocationsEnable) {
|
||||
dynamic_states.push_back(VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT);
|
||||
}
|
||||
|
||||
const VkPipelineDynamicStateCreateInfo dynamic_state_ci{
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
|
||||
.pNext = nullptr,
|
||||
|
|
|
|||
|
|
@ -1029,7 +1029,6 @@ void RasterizerVulkan::UpdateDynamicStates() {
|
|||
UpdateDepthBounds(regs);
|
||||
UpdateStencilFaces(regs);
|
||||
UpdateLineWidth(regs);
|
||||
UpdateSampleLocations(regs);
|
||||
|
||||
// EDS1: CullMode, DepthCompare, FrontFace, StencilOp, DepthBoundsTest, DepthTest, DepthWrite, StencilTest
|
||||
if (device.IsExtExtendedDynamicStateSupported()) {
|
||||
|
|
@ -1279,15 +1278,15 @@ void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs) {
|
|||
});
|
||||
}
|
||||
|
||||
void RasterizerVulkan::UpdateBlendConstants(Tegra::Engines::Maxwell3D::Regs& regs) {
|
||||
if (!state_tracker.TouchBlendConstants()) {
|
||||
return;
|
||||
}
|
||||
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](vk::CommandBuffer cmdbuf) { cmdbuf.SetBlendConstants(blend_color.data()); });
|
||||
}
|
||||
// void RasterizerVulkan::UpdateLineWidth(Tegra::Engines::Maxwell3D::Regs& regs) {
|
||||
// if (!state_tracker.TouchLineWidth()) {
|
||||
// return;
|
||||
// }
|
||||
// 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](vk::CommandBuffer cmdbuf) { cmdbuf.SetBlendConstants(blend_color.data()); });
|
||||
// }
|
||||
|
||||
void RasterizerVulkan::UpdateDepthBounds(Tegra::Engines::Maxwell3D::Regs& regs) {
|
||||
if (!state_tracker.TouchDepthBounds()) {
|
||||
|
|
@ -1398,66 +1397,6 @@ void RasterizerVulkan::UpdateLineWidth(Tegra::Engines::Maxwell3D::Regs& regs) {
|
|||
scheduler.Record([width](vk::CommandBuffer cmdbuf) { cmdbuf.SetLineWidth(width); });
|
||||
}
|
||||
|
||||
void RasterizerVulkan::UpdateSampleLocations(Tegra::Engines::Maxwell3D::Regs& regs) {
|
||||
if (!device.IsExtSampleLocationsSupported()) {
|
||||
state_tracker.TouchSampleLocations();
|
||||
return;
|
||||
}
|
||||
if (!state_tracker.TouchSampleLocations()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto msaa_mode = regs.anti_alias_samples_mode;
|
||||
const u32 sample_count = static_cast<u32>(VideoCommon::NumSamples(msaa_mode));
|
||||
|
||||
const VkSampleCountFlagBits vk_samples = MaxwellToVK::MsaaMode(msaa_mode);
|
||||
if (!device.SupportsSampleLocationsFor(vk_samples)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto [grid_width, grid_height] = VideoCommon::SampleLocationGridSize(msaa_mode);
|
||||
const u32 total_locations = sample_count * grid_width * grid_height;
|
||||
if (total_locations == 0 || total_locations > VideoCommon::MaxSampleLocationSlots) {
|
||||
LOG_WARNING(Render_Vulkan, "Unsupported sample-location grid configuration: samples={}, grid={}x{}",
|
||||
sample_count, grid_width, grid_height);
|
||||
return;
|
||||
}
|
||||
|
||||
const auto& props = device.SampleLocationProperties();
|
||||
std::array<VkSampleLocationEXT, VideoCommon::MaxSampleLocationSlots> locations{};
|
||||
constexpr float unit = 1.0f / 16.0f;
|
||||
const auto clamp_coord = [&](float coord) {
|
||||
return std::clamp(coord, props.sampleLocationCoordinateRange[0],
|
||||
props.sampleLocationCoordinateRange[1]);
|
||||
};
|
||||
|
||||
for (u32 index = 0; index < total_locations; ++index) {
|
||||
const auto& packed = regs.multisample_sample_locations[index / 4];
|
||||
const auto [raw_x, raw_y] = packed.Location(index % 4);
|
||||
const float offset_x = static_cast<float>(static_cast<int>(raw_x) - 8);
|
||||
const float offset_y = static_cast<float>(static_cast<int>(raw_y) - 8);
|
||||
const float x = clamp_coord(offset_x * unit);
|
||||
const float y = clamp_coord(offset_y * unit);
|
||||
locations[index] = VkSampleLocationEXT{.x = x, .y = y};
|
||||
}
|
||||
|
||||
VkSampleLocationsInfoEXT info{
|
||||
.sType = VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT,
|
||||
.pNext = nullptr,
|
||||
.sampleLocationsPerPixel = vk_samples,
|
||||
.sampleLocationGridSize = {grid_width, grid_height},
|
||||
.sampleLocationsCount = total_locations,
|
||||
.pSampleLocations = nullptr,
|
||||
};
|
||||
|
||||
const auto sample_locations = locations;
|
||||
scheduler.Record([info, sample_locations](vk::CommandBuffer cmdbuf) {
|
||||
auto info_copy = info;
|
||||
info_copy.pSampleLocations = sample_locations.data();
|
||||
cmdbuf.SetSampleLocationsEXT(info_copy);
|
||||
});
|
||||
}
|
||||
|
||||
void RasterizerVulkan::UpdateCullMode(Tegra::Engines::Maxwell3D::Regs& regs) {
|
||||
if (!state_tracker.TouchCullMode()) {
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -169,7 +169,6 @@ private:
|
|||
void UpdateDepthBounds(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||
void UpdateStencilFaces(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||
void UpdateLineWidth(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||
void UpdateSampleLocations(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||
|
||||
void UpdateCullMode(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||
void UpdateDepthBoundsTestEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
||||
|
|
|
|||
|
|
@ -40,7 +40,6 @@ Flags MakeInvalidationFlags() {
|
|||
StencilWriteMask,
|
||||
StencilCompare,
|
||||
LineWidth,
|
||||
SampleLocations,
|
||||
CullMode,
|
||||
DepthBoundsEnable,
|
||||
DepthTestEnable,
|
||||
|
|
@ -131,12 +130,6 @@ void SetupDirtyLineWidth(Tables& tables) {
|
|||
tables[0][OFF(line_width_aliased)] = LineWidth;
|
||||
}
|
||||
|
||||
void SetupDirtySampleLocations(Tables& tables) {
|
||||
tables[0][OFF(anti_alias_samples_mode)] = SampleLocations;
|
||||
FillBlock(tables[0], OFF(multisample_sample_locations),
|
||||
NUM(multisample_sample_locations), SampleLocations);
|
||||
}
|
||||
|
||||
void SetupDirtyCullMode(Tables& tables) {
|
||||
auto& table = tables[0];
|
||||
table[OFF(gl_cull_face)] = CullMode;
|
||||
|
|
@ -254,7 +247,6 @@ void StateTracker::SetupTables(Tegra::Control::ChannelState& channel_state) {
|
|||
SetupDirtyDepthBounds(tables);
|
||||
SetupDirtyStencilProperties(tables);
|
||||
SetupDirtyLineWidth(tables);
|
||||
SetupDirtySampleLocations(tables);
|
||||
SetupDirtyCullMode(tables);
|
||||
SetupDirtyStateEnable(tables);
|
||||
SetupDirtyDepthCompareOp(tables);
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@ enum : u8 {
|
|||
StencilWriteMask,
|
||||
StencilCompare,
|
||||
LineWidth,
|
||||
SampleLocations,
|
||||
|
||||
CullMode,
|
||||
DepthBoundsEnable,
|
||||
|
|
@ -186,10 +185,6 @@ public:
|
|||
return Exchange(Dirty::LineWidth, false);
|
||||
}
|
||||
|
||||
bool TouchSampleLocations() {
|
||||
return Exchange(Dirty::SampleLocations, false);
|
||||
}
|
||||
|
||||
bool TouchCullMode() {
|
||||
return Exchange(Dirty::CullMode, false);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -139,13 +139,6 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
|
|||
if (info.type == ImageType::e3D) {
|
||||
flags |= VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT;
|
||||
}
|
||||
if (device.IsExtSampleLocationsSupported()) {
|
||||
const auto surface_type = VideoCore::Surface::GetFormatType(info.format);
|
||||
if (surface_type == VideoCore::Surface::SurfaceType::Depth ||
|
||||
surface_type == VideoCore::Surface::SurfaceType::DepthStencil) {
|
||||
flags |= VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT;
|
||||
}
|
||||
}
|
||||
const auto [samples_x, samples_y] = VideoCommon::SamplesLog2(info.num_samples);
|
||||
return VkImageCreateInfo{
|
||||
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue