Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion core/libs/prx/libSceAgcDriver/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1191,8 +1191,12 @@ configure_windows_unwind(agc_driver_recorder_tests)
if(BUILD_TESTING)
set_target_properties(agc_driver_recorder_tests PROPERTIES EXCLUDE_FROM_ALL OFF)
add_test(NAME agc_recorder_device_selection COMMAND agc_driver_recorder_tests --device-selection-only)
add_test(NAME agc_gpu_timing_complete COMMAND agc_driver_recorder_tests --gpu-timing-complete-only)
add_test(NAME agc_gpu_timing_incomplete COMMAND agc_driver_recorder_tests --gpu-timing-incomplete-only)
set_tests_properties(agc_gpu_timing_complete agc_gpu_timing_incomplete PROPERTIES
ENVIRONMENT "APS5_PROFILE_GPU=1" TIMEOUT 15 SKIP_RETURN_CODE 77)
if(WIN32)
set_tests_properties(agc_recorder_device_selection PROPERTIES ENVIRONMENT_MODIFICATION
set_tests_properties(agc_recorder_device_selection agc_gpu_timing_complete agc_gpu_timing_incomplete PROPERTIES ENVIRONMENT_MODIFICATION
"PATH=path_list_prepend:$<TARGET_FILE_DIR:libc>")
endif()
add_test(NAME agc_pipeline_cache COMMAND agc_driver_recorder_tests --pipeline-cache-only)
Expand Down
49 changes: 49 additions & 0 deletions core/libs/prx/libSceAgcDriver/tests/Recorder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,14 @@ class Device {
bool NullDescriptors() const { return nullDescriptors; }
const Context& GetContext() const { return context; }
bool Graphics() const { return graphics; }
bool Timestamps() const {
std::uint32_t count = 0;
const auto queues = function<PFN_vkGetPhysicalDeviceQueueFamilyProperties>("vkGetPhysicalDeviceQueueFamilyProperties");
queues(context.physical, &count, nullptr);
std::vector<VkQueueFamilyProperties> families(count);
queues(context.physical, &count, families.data());
return families.at(context.queueFamily).timestampValidBits != 0;
}
VkPhysicalDeviceProperties Properties() const {
VkPhysicalDeviceProperties properties{};
function<PFN_vkGetPhysicalDeviceProperties>("vkGetPhysicalDeviceProperties")(context.physical, &properties);
Expand Down Expand Up @@ -1194,6 +1202,44 @@ void afterRecordedWorkTests(const Device& device, Recorder& recorder) {
Require(seen == 1, "an action ran before the completion label recorded ahead of it");
}

int gpuTimingCompletionTests(const Device& device, bool incomplete) {
const auto& context = device.GetContext();
if (!device.Timestamps()) {
std::cout << "skipped, queue timestamp queries unavailable\n";
return 77;
}
Require(Recorder::GpuTimingEnabled(), "GPU timing completion test requires APS5_PROFILE_GPU");
std::unique_lock gpu(GpuMutex());
int completed = 0;
Recorder recorder(context);
recorder.Activate();
for (int round = 0; round < 3; ++round) {
const bool missingEnd = incomplete && round == 1;
const auto first = recorder.BeginGpuTiming(0x12340);
Require(first != Recorder::NoTiming, "first GPU timing range was not allocated");
if (!missingEnd) recorder.EndGpuTiming(first);
const auto second = recorder.BeginGpuTiming(0x12341);
Require(second != Recorder::NoTiming && second != first, "second GPU timing range was not allocated");
recorder.EndGpuTiming(second);
recorder.OnComplete([&] { ++completed; });
const auto serial = recorder.Submissions() + 1;
recorder.Submit();
recorder.Sync();
Require(completed == round + 1 && recorder.Idle(), "GPU timing prevented batch completion");
std::size_t missing = 0;
const auto batches = recorder.CompletedBatches(serial - 1, serial, missing);
Require(missing == 0 && batches.size() == 1 && batches.front().serial == serial, "GPU timing batch completion record is missing");
const auto& batch = batches.front();
if (missingEnd) {
Require(batch.gpuStartNs == 0 && batch.gpuEndNs == 0, "incomplete query batch published GPU timings");
} else {
Require(batch.gpuStartNs > 0 && batch.gpuEndNs >= batch.gpuStartNs, "complete query batch lost GPU timings");
}
}
std::cout << "GPU timing batch completion checked, incomplete=" << incomplete << '\n';
return 0;
}

void batchStampTests(Recorder& recorder) {
Require(recorder.Idle(), "batch stamps: the recorder is busy");
double previousEnd = 0;
Expand Down Expand Up @@ -8917,6 +8963,9 @@ int main(int argc, char** argv) {
Device& device = *created;
if (argc == 2 && std::string_view(argv[1]) == "--host-import-lifetime-only") return RunHostImportLifetimeTests(device.GetContext());
if (argc == 2 && std::string_view(argv[1]) == "--host-import-mutation-race-only") return RunHostImportMutationRaceTests(device.GetContext());
if (argc == 2 && (std::string_view(argv[1]) == "--gpu-timing-complete-only" || std::string_view(argv[1]) == "--gpu-timing-incomplete-only")) {
return gpuTimingCompletionTests(device, std::string_view(argv[1]) == "--gpu-timing-incomplete-only");
}
if (argc == 2 && std::string_view(argv[1]) == "--import-watch-only") {
importWatchTests(device);
return 0;
Expand Down
Loading