From 1e037db7bdae5b404ca939a90146f84e9644e6fb Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 22 Dec 2022 20:58:39 -0600 Subject: [PATCH] Fix pixel pitch handling for DXGI_FORMAT_R16G16B16A16_FLOAT (#605) --- src/platform/windows/display.h | 5 +++++ src/platform/windows/display_ram.cpp | 2 +- src/platform/windows/display_vram.cpp | 9 +++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/platform/windows/display.h b/src/platform/windows/display.h index 52faddb7..a60e9587 100644 --- a/src/platform/windows/display.h +++ b/src/platform/windows/display.h @@ -131,6 +131,11 @@ public: } D3DKMT_SCHEDULINGPRIORITYCLASS; typedef NTSTATUS WINAPI (*PD3DKMTSetProcessSchedulingPriorityClass)(HANDLE, D3DKMT_SCHEDULINGPRIORITYCLASS); + +protected: + int get_pixel_pitch() { + return (format == DXGI_FORMAT_R16G16B16A16_FLOAT) ? 8 : 4; + } }; class display_ram_t : public display_base_t { diff --git a/src/platform/windows/display_ram.cpp b/src/platform/windows/display_ram.cpp index 596d4880..33072c32 100644 --- a/src/platform/windows/display_ram.cpp +++ b/src/platform/windows/display_ram.cpp @@ -280,7 +280,7 @@ capture_e display_ram_t::snapshot(::platf::img_t *img_base, std::chrono::millise std::shared_ptr display_ram_t::alloc_img() { auto img = std::make_shared(); - img->pixel_pitch = 4; + img->pixel_pitch = get_pixel_pitch(); img->row_pitch = img_info.RowPitch; img->width = width; img->height = height; diff --git a/src/platform/windows/display_vram.cpp b/src/platform/windows/display_vram.cpp index 3cf7c977..89b84406 100644 --- a/src/platform/windows/display_vram.cpp +++ b/src/platform/windows/display_vram.cpp @@ -757,7 +757,7 @@ int display_vram_t::init(int framerate, const std::string &display_name) { std::shared_ptr display_vram_t::alloc_img() { auto img = std::make_shared(); - img->pixel_pitch = 4; + img->pixel_pitch = get_pixel_pitch(); img->row_pitch = img->pixel_pitch * width; img->width = width; img->height = height; @@ -802,13 +802,14 @@ int display_vram_t::dummy_img(platf::img_t *img_base) { return 0; } - img->row_pitch = width * 4; - auto dummy_data = std::make_unique(width * height); + img->pixel_pitch = get_pixel_pitch(); + img->row_pitch = img->pixel_pitch * width; + auto dummy_data = std::make_unique(img->row_pitch * height); D3D11_SUBRESOURCE_DATA data { dummy_data.get(), (UINT)img->row_pitch }; - std::fill_n(dummy_data.get(), width * height, 0); + std::fill_n(dummy_data.get(), img->row_pitch * height, 0); D3D11_TEXTURE2D_DESC t {}; t.Width = width;