diff --git a/src/wgvk.c b/src/wgvk.c index 1606866..58d0625 100644 --- a/src/wgvk.c +++ b/src/wgvk.c @@ -5691,6 +5691,46 @@ static inline VkColorSpaceKHR toVulkanColorSpace(WGPUPredefinedColorSpace wcsp, WGPUStatus wgpuSurfaceGetCapabilities(WGPUSurface wgpuSurface, WGPUAdapter adapter, WGPUSurfaceCapabilities* capabilities){ ENTRY(); + if(capabilities){ + memset(capabilities, 0, sizeof(*capabilities)); + } + if(wgpuSurface == NULL){ + TRACELOG(WGPU_LOG_ERROR, "wgpuSurfaceGetCapabilities: surface is NULL"); + EXIT(); + return WGPUStatus_Error; + } + if(adapter == NULL){ + TRACELOG(WGPU_LOG_ERROR, "wgpuSurfaceGetCapabilities: adapter is NULL"); + if(wgpuSurface->device){ + DeviceCallback(wgpuSurface->device, WGPUErrorType_Validation, STRVIEW("wgpuSurfaceGetCapabilities: adapter is NULL")); + } + EXIT(); + return WGPUStatus_Error; + } + if(capabilities == NULL){ + TRACELOG(WGPU_LOG_ERROR, "wgpuSurfaceGetCapabilities: capabilities is NULL"); + if(wgpuSurface->device){ + DeviceCallback(wgpuSurface->device, WGPUErrorType_Validation, STRVIEW("wgpuSurfaceGetCapabilities: capabilities is NULL")); + } + EXIT(); + return WGPUStatus_Error; + } + if(wgpuSurface->surface == VK_NULL_HANDLE){ + TRACELOG(WGPU_LOG_ERROR, "wgpuSurfaceGetCapabilities: surface handle is NULL"); + if(wgpuSurface->device){ + DeviceCallback(wgpuSurface->device, WGPUErrorType_Validation, STRVIEW("wgpuSurfaceGetCapabilities: surface is invalid")); + } + EXIT(); + return WGPUStatus_Error; + } + if(adapter->physicalDevice == VK_NULL_HANDLE){ + TRACELOG(WGPU_LOG_ERROR, "wgpuSurfaceGetCapabilities: adapter physical device is NULL"); + if(wgpuSurface->device){ + DeviceCallback(wgpuSurface->device, WGPUErrorType_Validation, STRVIEW("wgpuSurfaceGetCapabilities: adapter is invalid")); + } + EXIT(); + return WGPUStatus_Error; + } if(wgpuSurface->capabilityCache.formatCount){ *capabilities = wgpuSurface->capabilityCache; return WGPUStatus_Success; diff --git a/tests/wgvk_unit_tests.cpp b/tests/wgvk_unit_tests.cpp index e43cb9a..621a173 100644 --- a/tests/wgvk_unit_tests.cpp +++ b/tests/wgvk_unit_tests.cpp @@ -123,6 +123,22 @@ class WebGPUTest : public ::testing::Test { } }; +TEST(WGPUApiValidation, SurfaceGetCapabilitiesRejectsNullArgsAndClearsOutput) { + WGPUSurfaceCapabilities caps = {}; + caps.formatCount = 123; + caps.presentModeCount = 456; + caps.alphaModeCount = 789; + caps.formats = reinterpret_cast(uintptr_t(0x1)); + + EXPECT_EQ(wgpuSurfaceGetCapabilities(nullptr, nullptr, &caps), WGPUStatus_Error); + EXPECT_EQ(caps.formatCount, 0u); + EXPECT_EQ(caps.presentModeCount, 0u); + EXPECT_EQ(caps.alphaModeCount, 0u); + EXPECT_EQ(caps.formats, nullptr); + + EXPECT_EQ(wgpuSurfaceGetCapabilities(nullptr, nullptr, nullptr), WGPUStatus_Error); +} + TEST_F(WebGPUTest, BufferReferenceCounting) { WGPUBufferDescriptor desc = {}; desc.size = 1024;