Mesa (main): d3d10umd: Update for transfer interface changes.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Oct 26 14:16:19 UTC 2021


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

Author: Jose Fonseca <jfonseca at vmware.com>
Date:   Mon Jul 19 14:35:48 2021 +0100

d3d10umd: Update for transfer interface changes.

Update for eb74f977693221eb1419f4827f549d48251f22da.

Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11973>

---

 src/gallium/frontends/d3d10umd/Resource.cpp | 131 ++++++++++++++++++++--------
 src/gallium/frontends/d3d10umd/State.h      |   1 +
 2 files changed, 95 insertions(+), 37 deletions(-)

diff --git a/src/gallium/frontends/d3d10umd/Resource.cpp b/src/gallium/frontends/d3d10umd/Resource.cpp
index a7910d2e3cf..3dd91365b23 100644
--- a/src/gallium/frontends/d3d10umd/Resource.cpp
+++ b/src/gallium/frontends/d3d10umd/Resource.cpp
@@ -270,6 +270,7 @@ CreateResource(D3D10DDI_HDEVICE hDevice,                                // IN
 
    templat.target     = translate_texture_target( pCreateResource->ResourceDimension,
                                                   pCreateResource->ArraySize );
+   pResource->buffer = templat.target == PIPE_BUFFER;
 
    if (pCreateResource->Format == DXGI_FORMAT_UNKNOWN) {
       assert(pCreateResource->ResourceDimension == D3D10DDIRESOURCE_BUFFER);
@@ -315,37 +316,62 @@ CreateResource(D3D10DDI_HDEVICE hDevice,                                // IN
                                                           sizeof *pResource->transfers);
 
    if (pCreateResource->pInitialDataUP) {
-      for (UINT SubResource = 0; SubResource < pResource->NumSubResources; ++SubResource) {
+      if (pResource->buffer) {
+         assert(pResource->NumSubResources == 1);
          const D3D10_DDIARG_SUBRESOURCE_UP* pInitialDataUP =
-               &pCreateResource->pInitialDataUP[SubResource];
+               &pCreateResource->pInitialDataUP[0];
 
          unsigned level;
          struct pipe_box box;
-         subResourceBox(pResource->resource, SubResource, &level, &box);
+         subResourceBox(pResource->resource, 0, &level, &box);
 
          struct pipe_transfer *transfer;
          void *map;
-         map = pipe->transfer_map(pipe,
-                                  pResource->resource,
-                                  level,
-                                  PIPE_MAP_WRITE |
-                                  PIPE_MAP_UNSYNCHRONIZED,
-                                  &box,
-                                  &transfer);
+         map = pipe->buffer_map(pipe,
+                                pResource->resource,
+                                level,
+                                PIPE_MAP_WRITE |
+                                PIPE_MAP_UNSYNCHRONIZED,
+                                &box,
+                                &transfer);
          assert(map);
          if (map) {
-            for (int z = 0; z < box.depth; ++z) {
-               ubyte *dst = (ubyte*)map + z*transfer->layer_stride;
-               const ubyte *src = (const ubyte*)pInitialDataUP->pSysMem + z*pInitialDataUP->SysMemSlicePitch;
-               util_copy_rect(dst,
-                              templat.format,
-                              transfer->stride,
-                              0, 0, box.width, box.height,
-                              src,
-                              pInitialDataUP->SysMemPitch,
-                              0, 0);
+            memcpy(map, pInitialDataUP->pSysMem, box.width);
+            pipe_buffer_unmap(pipe, transfer);
+         }
+      } else {
+         for (UINT SubResource = 0; SubResource < pResource->NumSubResources; ++SubResource) {
+            const D3D10_DDIARG_SUBRESOURCE_UP* pInitialDataUP =
+                  &pCreateResource->pInitialDataUP[SubResource];
+
+            unsigned level;
+            struct pipe_box box;
+            subResourceBox(pResource->resource, SubResource, &level, &box);
+
+            struct pipe_transfer *transfer;
+            void *map;
+            map = pipe->texture_map(pipe,
+                                    pResource->resource,
+                                    level,
+                                    PIPE_MAP_WRITE |
+                                    PIPE_MAP_UNSYNCHRONIZED,
+                                    &box,
+                                    &transfer);
+            assert(map);
+            if (map) {
+               for (int z = 0; z < box.depth; ++z) {
+                  ubyte *dst = (ubyte*)map + z*transfer->layer_stride;
+                  const ubyte *src = (const ubyte*)pInitialDataUP->pSysMem + z*pInitialDataUP->SysMemSlicePitch;
+                  util_copy_rect(dst,
+                                 templat.format,
+                                 transfer->stride,
+                                 0, 0, box.width, box.height,
+                                 src,
+                                 pInitialDataUP->SysMemPitch,
+                                 0, 0);
+               }
+               pipe_texture_unmap(pipe, transfer);
             }
-            pipe_transfer_unmap(pipe, transfer);
          }
       }
    }
@@ -423,7 +449,11 @@ DestroyResource(D3D10DDI_HDEVICE hDevice,       // IN
 
    for (UINT SubResource = 0; SubResource < pResource->NumSubResources; ++SubResource) {
       if (pResource->transfers[SubResource]) {
-         pipe_transfer_unmap(pipe, pResource->transfers[SubResource]);
+         if (pResource->buffer) {
+            pipe_buffer_unmap(pipe, pResource->transfers[SubResource]);
+         } else {
+            pipe_texture_unmap(pipe, pResource->transfers[SubResource]);
+         }
          pResource->transfers[SubResource] = NULL;
       }
    }
@@ -493,12 +523,21 @@ ResourceMap(D3D10DDI_HDEVICE hDevice,                                // IN
    assert(!pResource->transfers[SubResource]);
 
    void *map;
-   map = pipe->transfer_map(pipe,
-                            resource,
-                            level,
-                            usage,
-                            &box,
-                            &pResource->transfers[SubResource]);
+   if (pResource->buffer) {
+      map = pipe->buffer_map(pipe,
+                             resource,
+                             level,
+                             usage,
+                             &box,
+                             &pResource->transfers[SubResource]);
+   } else {
+      map = pipe->texture_map(pipe,
+                              resource,
+                              level,
+                              usage,
+                              &box,
+                              &pResource->transfers[SubResource]);
+   }
    if (!map) {
       DebugPrintf("%s: failed to map resource\n", __FUNCTION__);
       SetError(hDevice, E_FAIL);
@@ -534,7 +573,11 @@ ResourceUnmap(D3D10DDI_HDEVICE hDevice,      // IN
    assert(SubResource < pResource->NumSubResources);
 
    if (pResource->transfers[SubResource]) {
-      pipe_transfer_unmap(pipe, pResource->transfers[SubResource]);
+      if (pResource->buffer) {
+         pipe_buffer_unmap(pipe, pResource->transfers[SubResource]);
+      } else {
+         pipe_texture_unmap(pipe, pResource->transfers[SubResource]);
+      }
       pResource->transfers[SubResource] = NULL;
    }
 }
@@ -834,7 +877,8 @@ ResourceUpdateSubResourceUP(D3D10DDI_HDEVICE hDevice,                // IN
    }
 
    struct pipe_context *pipe = pDevice->pipe;
-   struct pipe_resource *dst_resource = CastPipeResource(hDstResource);
+   Resource *pDstResource = CastResource(hDstResource);
+   struct pipe_resource *dst_resource = pDstResource->resource;
 
    unsigned level;
    struct pipe_box box;
@@ -855,12 +899,21 @@ ResourceUpdateSubResourceUP(D3D10DDI_HDEVICE hDevice,                // IN
 
    struct pipe_transfer *transfer;
    void *map;
-   map = pipe->transfer_map(pipe,
-                            dst_resource,
-                            level,
-                            PIPE_MAP_WRITE | PIPE_MAP_DISCARD_RANGE,
-                            &box,
-                            &transfer);
+   if (pDstResource->buffer) {
+      map = pipe->buffer_map(pipe,
+                              dst_resource,
+                              level,
+                              PIPE_MAP_WRITE | PIPE_MAP_DISCARD_RANGE,
+                              &box,
+                              &transfer);
+   } else {
+      map = pipe->texture_map(pipe,
+                              dst_resource,
+                              level,
+                              PIPE_MAP_WRITE | PIPE_MAP_DISCARD_RANGE,
+                              &box,
+                              &transfer);
+   }
    assert(map);
    if (map) {
       for (int z = 0; z < box.depth; ++z) {
@@ -874,7 +927,11 @@ ResourceUpdateSubResourceUP(D3D10DDI_HDEVICE hDevice,                // IN
                         RowPitch,
                         0, 0);
       }
-      pipe_transfer_unmap(pipe, transfer);
+      if (pDstResource->buffer) {
+         pipe_buffer_unmap(pipe, transfer);
+      } else {
+         pipe_texture_unmap(pipe, transfer);
+      }
    }
 }
 
diff --git a/src/gallium/frontends/d3d10umd/State.h b/src/gallium/frontends/d3d10umd/State.h
index 5cb865ce695..3e45cb79743 100644
--- a/src/gallium/frontends/d3d10umd/State.h
+++ b/src/gallium/frontends/d3d10umd/State.h
@@ -150,6 +150,7 @@ struct Resource
    DXGI_FORMAT Format;
    UINT MipLevels;
    UINT NumSubResources;
+   bool buffer;
    struct pipe_resource *resource;
    struct pipe_transfer **transfers;
    struct pipe_stream_output_target *so_target;



More information about the mesa-commit mailing list