iris: support dmabuf imports with offsets
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Tue, 30 Apr 2019 18:51:52 +0000 (14:51 -0400)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 7 May 2019 20:36:08 +0000 (13:36 -0700)
this adds support for imports where the image data begins at an offset
from the start of the buffer, as used in h/x264

fixes kwg/mesa#47

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/gallium/drivers/iris/iris_blit.c
src/gallium/drivers/iris/iris_resource.c
src/gallium/drivers/iris/iris_resource.h
src/gallium/drivers/iris/iris_state.c

index 67283307ae6f800e4eab3e83b2427a6c8bbe025d..0ee2046481b8d297253fc73cc92148e71207b63a 100644 (file)
@@ -246,7 +246,7 @@ iris_blorp_surf_for_resource(struct iris_vtable *vtbl,
       .surf = &res->surf,
       .addr = (struct blorp_address) {
          .buffer = res->bo,
-         .offset = 0, // XXX: ???
+         .offset = res->offset,
          .reloc_flags = is_render_target ? EXEC_OBJECT_WRITE : 0,
          .mocs = vtbl->mocs(res->bo),
       },
index fd50139defcacca071a03709b7f4c0e3c3ab1124..971e7adda7eeeacd744f4257f6a26bd2311bf1d0 100644 (file)
@@ -759,12 +759,6 @@ iris_resource_from_handle(struct pipe_screen *pscreen,
    if (!res)
       return NULL;
 
-   if (whandle->offset != 0) {
-      dbg_printf("Attempt to import unsupported winsys offset %u\n",
-                 whandle->offset);
-      goto fail;
-   }
-
    switch (whandle->type) {
    case WINSYS_HANDLE_TYPE_FD:
       res->bo = iris_bo_import_dmabuf(bufmgr, whandle->handle);
@@ -779,6 +773,8 @@ iris_resource_from_handle(struct pipe_screen *pscreen,
    if (!res->bo)
       return NULL;
 
+   res->offset = whandle->offset;
+
    uint64_t modifier = whandle->modifier;
    if (modifier == DRM_FORMAT_MOD_INVALID) {
       modifier = tiling_to_modifier(res->bo->tiling_mode);
index 7cb6767b2f9cd15be4728a1a8f17204ddc37702e..79b15056b090268ecadd8f69283a43fa4b6b283c 100644 (file)
@@ -68,6 +68,9 @@ struct iris_resource {
    /** Backing storage for the resource */
    struct iris_bo *bo;
 
+   /** offset at which data starts in the BO */
+   uint64_t offset;
+
    /**
     * A bitfield of PIPE_BIND_* indicating how this resource was bound
     * in the past.  Only meaningful for PIPE_BUFFER; used for flushing.
index 1d8f61847ff41194c4c13b0524a5af52a8c49e08..bee212222bf00b51091e75533d25f75c3ccf3c96 100644 (file)
@@ -1724,7 +1724,7 @@ fill_surface_state(struct isl_device *isl_dev,
       .surf = &res->surf,
       .view = view,
       .mocs = mocs(res->bo),
-      .address = res->bo->gtt_offset,
+      .address = res->bo->gtt_offset + res->offset,
    };
 
    if (aux_usage != ISL_AUX_USAGE_NONE) {
@@ -2505,7 +2505,7 @@ iris_set_framebuffer_state(struct pipe_context *ctx,
          view.usage |= ISL_SURF_USAGE_DEPTH_BIT;
 
          info.depth_surf = &zres->surf;
-         info.depth_address = zres->bo->gtt_offset;
+         info.depth_address = zres->bo->gtt_offset + zres->offset;
          info.mocs = mocs(zres->bo);
 
          view.format = zres->surf.format;
@@ -2520,7 +2520,7 @@ iris_set_framebuffer_state(struct pipe_context *ctx,
       if (stencil_res) {
          view.usage |= ISL_SURF_USAGE_STENCIL_BIT;
          info.stencil_surf = &stencil_res->surf;
-         info.stencil_address = stencil_res->bo->gtt_offset;
+         info.stencil_address = stencil_res->bo->gtt_offset + stencil_res->offset;
          if (!zres) {
             view.format = stencil_res->surf.format;
             info.mocs = mocs(stencil_res->bo);
@@ -2592,8 +2592,9 @@ upload_ubo_ssbo_surf_state(struct iris_context *ice,
    surf_state->offset += iris_bo_offset_from_base_address(surf_bo);
 
    isl_buffer_fill_state(&screen->isl_dev, map,
-                         .address = res->bo->gtt_offset + buf->buffer_offset,
-                         .size_B = buf->buffer_size,
+                         .address = res->bo->gtt_offset + res->offset +
+                                    buf->buffer_offset,
+                         .size_B = buf->buffer_size - res->offset,
                          .format = ssbo ? ISL_FORMAT_RAW
                                         : ISL_FORMAT_R32G32B32A32_FLOAT,
                          .swizzle = ISL_SWIZZLE_IDENTITY,