Module: Mesa
Branch: main
Commit: eac2ce6e3be997bffe8b9f18dc792edfc716740f
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=eac2ce6e3be997bffe8b9f18dc792edfc716740f

Author: Jesse Natalie <jenat...@microsoft.com>
Date:   Wed Nov 15 12:48:00 2023 -0800

d3d12: Fixes for QBO shaders

Output offset for resolves was wrong, and we can't use a double for the
timestamp multiplier, because doubles might be emulated, and that emulation
is only handled by shaders that go through the GL frontend.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26210>

---

 src/gallium/drivers/d3d12/d3d12_compute_transforms.cpp | 5 ++---
 src/gallium/drivers/d3d12/d3d12_compute_transforms.h   | 2 +-
 src/gallium/drivers/d3d12/d3d12_screen.cpp             | 2 +-
 src/gallium/drivers/d3d12/d3d12_screen.h               | 2 +-
 4 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/d3d12/d3d12_compute_transforms.cpp 
b/src/gallium/drivers/d3d12/d3d12_compute_transforms.cpp
index a444c756b69..9f94c038b81 100644
--- a/src/gallium/drivers/d3d12/d3d12_compute_transforms.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_compute_transforms.cpp
@@ -339,8 +339,7 @@ get_query_resolve(const nir_shader_compiler_options 
*options, const d3d12_comput
    nir_def *output_base_index = nir_channel(&b, state_var_data, 3);
    for (uint32_t i = 0; i < num_result_values; ++i) {
       /* When resolving in-place, resolve each field, otherwise just write the 
one result */
-      uint32_t field_offset = key->query_resolve.is_resolve_in_place ?
-         i : key->query_resolve.single_result_field_offset;
+      uint32_t field_offset = key->query_resolve.is_resolve_in_place ? i : 0;
 
       /* When resolving time elapsed in-place, write [0, time], as the only 
special case */
       if (key->query_resolve.is_resolve_in_place &&
@@ -353,7 +352,7 @@ get_query_resolve(const nir_shader_compiler_options 
*options, const d3d12_comput
       if (!key->query_resolve.is_resolve_in_place &&
           (key->query_resolve.pipe_query_type == PIPE_QUERY_TIME_ELAPSED ||
            key->query_resolve.pipe_query_type == PIPE_QUERY_TIMESTAMP)) {
-         result_val = nir_f2u64(&b, nir_fmul_imm(&b, nir_u2f64(&b, 
result_val), key->query_resolve.timestamp_multiplier));
+         result_val = nir_f2u64(&b, nir_fmul_imm(&b, nir_u2f32(&b, 
result_val), key->query_resolve.timestamp_multiplier));
 
          if (!key->query_resolve.is_64bit) {
             nir_alu_type rounding_type = key->query_resolve.is_signed ? 
nir_type_int : nir_type_uint;
diff --git a/src/gallium/drivers/d3d12/d3d12_compute_transforms.h 
b/src/gallium/drivers/d3d12/d3d12_compute_transforms.h
index 011fbba90cf..207ac5bf9e9 100644
--- a/src/gallium/drivers/d3d12/d3d12_compute_transforms.h
+++ b/src/gallium/drivers/d3d12/d3d12_compute_transforms.h
@@ -84,7 +84,7 @@ struct d3d12_compute_transform_key
          uint8_t single_subquery_index : 2;
          uint8_t single_result_field_offset : 4;
          uint8_t is_signed : 1;
-         double timestamp_multiplier;
+         float timestamp_multiplier;
       } query_resolve;
    };
 };
diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp 
b/src/gallium/drivers/d3d12/d3d12_screen.cpp
index 1204d089970..67dfcb1f404 100644
--- a/src/gallium/drivers/d3d12/d3d12_screen.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp
@@ -1572,7 +1572,7 @@ d3d12_init_screen(struct d3d12_screen *screen, IUnknown 
*adapter)
    UINT64 timestamp_freq;
    if (FAILED(screen->cmdqueue->GetTimestampFrequency(&timestamp_freq)))
        timestamp_freq = 10000000;
-   screen->timestamp_multiplier = 1000000000.0 / timestamp_freq;
+   screen->timestamp_multiplier = 1000000000.0f / timestamp_freq;
 
    d3d12_screen_fence_init(&screen->base);
    d3d12_screen_resource_init(&screen->base);
diff --git a/src/gallium/drivers/d3d12/d3d12_screen.h 
b/src/gallium/drivers/d3d12/d3d12_screen.h
index fe8f919228b..c05a897ea40 100644
--- a/src/gallium/drivers/d3d12/d3d12_screen.h
+++ b/src/gallium/drivers/d3d12/d3d12_screen.h
@@ -132,7 +132,7 @@ struct d3d12_screen {
    uint32_t revision;
    uint64_t driver_version;
    uint64_t memory_size_megabytes;
-   double timestamp_multiplier;
+   float timestamp_multiplier;
    bool have_load_at_vertex;
    bool support_shader_images;
    bool support_create_not_resident;

Reply via email to