|
|
|
@ -1384,39 +1384,44 @@ void RasterizerVulkan::UpdateSampleLocations(Tegra::Engines::Maxwell3D::Regs& re |
|
|
|
|
|
|
|
const auto msaa_mode = regs.anti_alias_samples_mode; |
|
|
|
const u32 sample_count = static_cast<u32>(VideoCommon::NumSamples(msaa_mode)); |
|
|
|
if (sample_count <= 1) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
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, 16> locations{}; |
|
|
|
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 sample_index = 0; sample_index < sample_count; ++sample_index) { |
|
|
|
const auto& packed = regs.multisample_sample_locations[sample_index / 4]; |
|
|
|
const auto [raw_x, raw_y] = packed.Location(sample_index % 4); |
|
|
|
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[sample_index] = VkSampleLocationEXT{.x = x, .y = y}; |
|
|
|
locations[index] = VkSampleLocationEXT{.x = x, .y = y}; |
|
|
|
} |
|
|
|
|
|
|
|
VkSampleLocationsInfoEXT info{ |
|
|
|
.sType = VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT, |
|
|
|
.pNext = nullptr, |
|
|
|
.sampleLocationsPerPixel = vk_samples, |
|
|
|
.sampleLocationGridSize = {1u, 1u}, |
|
|
|
.sampleLocationsCount = sample_count, |
|
|
|
.sampleLocationGridSize = {grid_width, grid_height}, |
|
|
|
.sampleLocationsCount = total_locations, |
|
|
|
.pSampleLocations = nullptr, |
|
|
|
}; |
|
|
|
|
|
|
|
|