iris: support dmabuf imports with offsets
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>
This commit is contained in:

committed by
Kenneth Graunke

parent
748f603390
commit
ddd716e746
@@ -246,7 +246,7 @@ iris_blorp_surf_for_resource(struct iris_vtable *vtbl,
|
|||||||
.surf = &res->surf,
|
.surf = &res->surf,
|
||||||
.addr = (struct blorp_address) {
|
.addr = (struct blorp_address) {
|
||||||
.buffer = res->bo,
|
.buffer = res->bo,
|
||||||
.offset = 0, // XXX: ???
|
.offset = res->offset,
|
||||||
.reloc_flags = is_render_target ? EXEC_OBJECT_WRITE : 0,
|
.reloc_flags = is_render_target ? EXEC_OBJECT_WRITE : 0,
|
||||||
.mocs = vtbl->mocs(res->bo),
|
.mocs = vtbl->mocs(res->bo),
|
||||||
},
|
},
|
||||||
|
@@ -759,12 +759,6 @@ iris_resource_from_handle(struct pipe_screen *pscreen,
|
|||||||
if (!res)
|
if (!res)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (whandle->offset != 0) {
|
|
||||||
dbg_printf("Attempt to import unsupported winsys offset %u\n",
|
|
||||||
whandle->offset);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (whandle->type) {
|
switch (whandle->type) {
|
||||||
case WINSYS_HANDLE_TYPE_FD:
|
case WINSYS_HANDLE_TYPE_FD:
|
||||||
res->bo = iris_bo_import_dmabuf(bufmgr, whandle->handle);
|
res->bo = iris_bo_import_dmabuf(bufmgr, whandle->handle);
|
||||||
@@ -779,6 +773,8 @@ iris_resource_from_handle(struct pipe_screen *pscreen,
|
|||||||
if (!res->bo)
|
if (!res->bo)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
res->offset = whandle->offset;
|
||||||
|
|
||||||
uint64_t modifier = whandle->modifier;
|
uint64_t modifier = whandle->modifier;
|
||||||
if (modifier == DRM_FORMAT_MOD_INVALID) {
|
if (modifier == DRM_FORMAT_MOD_INVALID) {
|
||||||
modifier = tiling_to_modifier(res->bo->tiling_mode);
|
modifier = tiling_to_modifier(res->bo->tiling_mode);
|
||||||
|
@@ -68,6 +68,9 @@ struct iris_resource {
|
|||||||
/** Backing storage for the resource */
|
/** Backing storage for the resource */
|
||||||
struct iris_bo *bo;
|
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
|
* A bitfield of PIPE_BIND_* indicating how this resource was bound
|
||||||
* in the past. Only meaningful for PIPE_BUFFER; used for flushing.
|
* in the past. Only meaningful for PIPE_BUFFER; used for flushing.
|
||||||
|
@@ -1724,7 +1724,7 @@ fill_surface_state(struct isl_device *isl_dev,
|
|||||||
.surf = &res->surf,
|
.surf = &res->surf,
|
||||||
.view = view,
|
.view = view,
|
||||||
.mocs = mocs(res->bo),
|
.mocs = mocs(res->bo),
|
||||||
.address = res->bo->gtt_offset,
|
.address = res->bo->gtt_offset + res->offset,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (aux_usage != ISL_AUX_USAGE_NONE) {
|
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;
|
view.usage |= ISL_SURF_USAGE_DEPTH_BIT;
|
||||||
|
|
||||||
info.depth_surf = &zres->surf;
|
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);
|
info.mocs = mocs(zres->bo);
|
||||||
|
|
||||||
view.format = zres->surf.format;
|
view.format = zres->surf.format;
|
||||||
@@ -2520,7 +2520,7 @@ iris_set_framebuffer_state(struct pipe_context *ctx,
|
|||||||
if (stencil_res) {
|
if (stencil_res) {
|
||||||
view.usage |= ISL_SURF_USAGE_STENCIL_BIT;
|
view.usage |= ISL_SURF_USAGE_STENCIL_BIT;
|
||||||
info.stencil_surf = &stencil_res->surf;
|
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) {
|
if (!zres) {
|
||||||
view.format = stencil_res->surf.format;
|
view.format = stencil_res->surf.format;
|
||||||
info.mocs = mocs(stencil_res->bo);
|
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);
|
surf_state->offset += iris_bo_offset_from_base_address(surf_bo);
|
||||||
|
|
||||||
isl_buffer_fill_state(&screen->isl_dev, map,
|
isl_buffer_fill_state(&screen->isl_dev, map,
|
||||||
.address = res->bo->gtt_offset + buf->buffer_offset,
|
.address = res->bo->gtt_offset + res->offset +
|
||||||
.size_B = buf->buffer_size,
|
buf->buffer_offset,
|
||||||
|
.size_B = buf->buffer_size - res->offset,
|
||||||
.format = ssbo ? ISL_FORMAT_RAW
|
.format = ssbo ? ISL_FORMAT_RAW
|
||||||
: ISL_FORMAT_R32G32B32A32_FLOAT,
|
: ISL_FORMAT_R32G32B32A32_FLOAT,
|
||||||
.swizzle = ISL_SWIZZLE_IDENTITY,
|
.swizzle = ISL_SWIZZLE_IDENTITY,
|
||||||
|
Reference in New Issue
Block a user