summaryrefslogtreecommitdiff
path: root/src/tests
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests')
-rw-r--r--src/tests/common/offscreen_render_target.cc103
1 files changed, 4 insertions, 99 deletions
diff --git a/src/tests/common/offscreen_render_target.cc b/src/tests/common/offscreen_render_target.cc
index 9f65e9a..10775a1 100644
--- a/src/tests/common/offscreen_render_target.cc
+++ b/src/tests/common/offscreen_render_target.cc
@@ -3,6 +3,7 @@
// Provides pixel readback for validation.
#include "offscreen_render_target.h"
+#include "gpu/texture_readback.h"
#include <cassert>
#include <cstdio>
#include <cstring>
@@ -64,105 +65,9 @@ WGPUBuffer OffscreenRenderTarget::create_staging_buffer() {
}
std::vector<uint8_t> OffscreenRenderTarget::read_pixels() {
- const size_t buffer_size = width_ * height_ * 4; // BGRA8
- std::vector<uint8_t> pixels(buffer_size);
-
- // Create staging buffer for readback
- WGPUBuffer staging = create_staging_buffer();
- assert(staging && "Failed to create staging buffer");
-
- // Create command encoder for copy operation
- const WGPUCommandEncoderDescriptor enc_desc = {};
- WGPUCommandEncoder encoder =
- wgpuDeviceCreateCommandEncoder(device_, &enc_desc);
-
- // Copy texture to buffer
- const WGPUTexelCopyTextureInfo src = {
- .texture = texture_,
- .mipLevel = 0,
- .origin = {0, 0, 0},
- };
-
- const WGPUTexelCopyBufferInfo dst = {
- .buffer = staging,
- .layout =
- {
- .bytesPerRow = static_cast<uint32_t>(width_ * 4),
- .rowsPerImage = static_cast<uint32_t>(height_),
- },
- };
-
- const WGPUExtent3D copy_size = {static_cast<uint32_t>(width_),
- static_cast<uint32_t>(height_), 1};
-
- wgpuCommandEncoderCopyTextureToBuffer(encoder, &src, &dst, &copy_size);
-
- // Submit commands
- WGPUCommandBuffer commands = wgpuCommandEncoderFinish(encoder, nullptr);
- WGPUQueue queue = wgpuDeviceGetQueue(device_);
- wgpuQueueSubmit(queue, 1, &commands);
- wgpuCommandBufferRelease(commands);
- wgpuCommandEncoderRelease(encoder);
-
- // CRITICAL: Wait for GPU work to complete before mapping
- // Without this, buffer may be destroyed before copy finishes
- // Note: Skipping wait for now - appears to be causing issues
- // The buffer mapping will handle synchronization internally
-
- // Map buffer for reading (API differs between Win32 and native)
-#if defined(DEMO_CROSS_COMPILE_WIN32)
- // Win32: Old callback API
- MapState map_state = {};
- auto map_cb = [](WGPUBufferMapAsyncStatus status, void* userdata) {
- MapState* state = static_cast<MapState*>(userdata);
- state->status = status;
- state->done = true;
- };
- wgpuBufferMapAsync(staging, WGPUMapMode_Read, 0, buffer_size, map_cb,
- &map_state);
+#if !defined(STRIP_ALL)
+ return read_texture_pixels(instance_, device_, texture_, width_, height_);
#else
- // Native: New callback info API
- MapState map_state = {};
- auto map_cb = [](WGPUMapAsyncStatus status, WGPUStringView message,
- void* userdata, void* user2) {
- (void)message;
- (void)user2;
- MapState* state = static_cast<MapState*>(userdata);
- state->status = status;
- state->done = true;
- };
- WGPUBufferMapCallbackInfo map_info = {};
- map_info.mode = WGPUCallbackMode_WaitAnyOnly;
- map_info.callback = map_cb;
- map_info.userdata1 = &map_state;
- wgpuBufferMapAsync(staging, WGPUMapMode_Read, 0, buffer_size, map_info);
-#endif
-
- // Wait for mapping to complete
- for (int i = 0; i < 100 && !map_state.done; ++i) {
-#if defined(__EMSCRIPTEN__)
- emscripten_sleep(10);
-#else
- wgpuInstanceProcessEvents(instance_);
+ return std::vector<uint8_t>(); // Should never be called in STRIP_ALL builds
#endif
- }
-
- if (map_state.status != WGPUMapAsyncStatus_Success) {
- fprintf(stderr, "Buffer mapping failed: %d\n", map_state.status);
- wgpuBufferRelease(staging);
- return pixels; // Return empty
- }
-
- // Copy data from mapped buffer
- const uint8_t* mapped_data = static_cast<const uint8_t*>(
- wgpuBufferGetConstMappedRange(staging, 0, buffer_size));
- if (mapped_data) {
- memcpy(pixels.data(), mapped_data, buffer_size);
- }
-
- // Cleanup
- wgpuBufferUnmap(staging);
- wgpuBufferRelease(staging);
-
- return pixels;
}