Module: Mesa Branch: master Commit: 46bbc835c1006cc38010a07b7465c18515c22614 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=46bbc835c1006cc38010a07b7465c18515c22614
Author: Mike Blumenkrantz <[email protected]> Date: Tue Oct 27 11:38:16 2020 -0400 zink: move resource internals to a separate struct this starts the path towards being able to replace the backing objects for a resource Reviewed-by: Dave Airlie <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9544> --- src/gallium/drivers/zink/zink_batch.c | 12 ++--- src/gallium/drivers/zink/zink_blit.c | 8 +-- src/gallium/drivers/zink/zink_clear.c | 4 +- src/gallium/drivers/zink/zink_context.c | 24 ++++----- src/gallium/drivers/zink/zink_draw.c | 36 ++++++------- src/gallium/drivers/zink/zink_query.c | 4 +- src/gallium/drivers/zink/zink_resource.c | 91 ++++++++++++++++++-------------- src/gallium/drivers/zink/zink_resource.h | 27 ++++++---- src/gallium/drivers/zink/zink_surface.c | 2 +- 9 files changed, 112 insertions(+), 96 deletions(-) diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index f6cf4f22453..17ca72d9402 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -123,12 +123,12 @@ zink_end_batch(struct zink_context *ctx, struct zink_batch *batch) util_dynarray_foreach(&batch->persistent_resources, struct zink_resource*, res) { struct zink_screen *screen = zink_screen(ctx->base.screen); - assert(!(*res)->offset); + assert(!(*res)->obj->offset); VkMappedMemoryRange range = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, NULL, - (*res)->mem, - (*res)->offset, + (*res)->obj->mem, + (*res)->obj->offset, VK_WHOLE_SIZE, }; vkFlushMappedMemoryRanges(screen->dev, 1, &range); @@ -150,7 +150,7 @@ zink_end_batch(struct zink_context *ctx, struct zink_batch *batch) }; if (batch->flush_res) { - mem_signal.memory = batch->flush_res->mem; + mem_signal.memory = batch->flush_res->obj->mem; si.pNext = &mem_signal; } @@ -202,10 +202,10 @@ zink_batch_reference_resource_rw(struct zink_batch *batch, struct zink_resource _mesa_set_search_and_add(batch->resources, res, &found); if (!found) { pipe_reference(NULL, &res->base.reference); - batch->resource_size += res->size; + batch->resource_size += res->obj->size; if (stencil) { pipe_reference(NULL, &stencil->base.reference); - batch->resource_size += stencil->size; + batch->resource_size += stencil->obj->size; } } } diff --git a/src/gallium/drivers/zink/zink_blit.c b/src/gallium/drivers/zink/zink_blit.c index cdcda6f2e4a..1ef54b8a946 100644 --- a/src/gallium/drivers/zink/zink_blit.c +++ b/src/gallium/drivers/zink/zink_blit.c @@ -84,8 +84,8 @@ blit_resolve(struct zink_context *ctx, const struct pipe_blit_info *info) region.extent.width = info->dst.box.width; region.extent.height = info->dst.box.height; region.extent.depth = info->dst.box.depth; - vkCmdResolveImage(batch->cmdbuf, src->image, src->layout, - dst->image, dst->layout, + vkCmdResolveImage(batch->cmdbuf, src->obj->image, src->layout, + dst->obj->image, dst->layout, 1, ®ion); return true; @@ -169,8 +169,8 @@ blit_native(struct zink_context *ctx, const struct pipe_blit_info *info) region.dstSubresource.layerCount = 1; } - vkCmdBlitImage(batch->cmdbuf, src->image, src->layout, - dst->image, dst->layout, + vkCmdBlitImage(batch->cmdbuf, src->obj->image, src->layout, + dst->obj->image, dst->layout, 1, ®ion, zink_filter(info->filter)); diff --git a/src/gallium/drivers/zink/zink_clear.c b/src/gallium/drivers/zink/zink_clear.c index f2db6c9bfab..fee325da610 100644 --- a/src/gallium/drivers/zink/zink_clear.c +++ b/src/gallium/drivers/zink/zink_clear.c @@ -139,7 +139,7 @@ clear_color_no_rp(struct zink_context *ctx, struct zink_resource *res, const uni zink_resource_image_needs_barrier(res, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, 0)) zink_resource_image_barrier(ctx, NULL, res, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, 0); zink_batch_reference_resource_rw(batch, res, true); - vkCmdClearColorImage(batch->cmdbuf, res->image, res->layout, &color, 1, &range); + vkCmdClearColorImage(batch->cmdbuf, res->obj->image, res->layout, &color, 1, &range); } static void @@ -159,7 +159,7 @@ clear_zs_no_rp(struct zink_context *ctx, struct zink_resource *res, VkImageAspec zink_resource_image_needs_barrier(res, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, 0)) zink_resource_image_barrier(ctx, NULL, res, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, 0); zink_batch_reference_resource_rw(batch, res, true); - vkCmdClearDepthStencilImage(batch->cmdbuf, res->image, res->layout, &zs_value, 1, &range); + vkCmdClearDepthStencilImage(batch->cmdbuf, res->obj->image, res->layout, &zs_value, 1, &range); } diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 390a411eb0e..ad1f45a40a1 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -550,7 +550,7 @@ create_buffer_view(struct zink_screen *screen, struct zink_resource *res, enum p VkBufferView view = VK_NULL_HANDLE; VkBufferViewCreateInfo bvci = {}; bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO; - bvci.buffer = res->buffer; + bvci.buffer = res->obj->buffer; bvci.format = zink_get_format(screen, format); assert(bvci.format); bvci.offset = offset; @@ -579,7 +579,7 @@ zink_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *pres, if (state->target != PIPE_BUFFER) { VkImageViewCreateInfo ivci = {}; ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - ivci.image = res->image; + ivci.image = res->obj->image; ivci.viewType = image_view_type(state->target); ivci.components.r = component_mapping(state->swizzle_r); @@ -771,7 +771,7 @@ zink_set_constant_buffer(struct pipe_context *pctx, } struct zink_resource *res = zink_resource(ctx->ubos[shader][index].buffer); update |= (index && ctx->ubos[shader][index].buffer_offset != offset) || - !!res != !!buffer || (res && res->buffer != zink_resource(buffer)->buffer) || + !!res != !!buffer || (res && res->obj->buffer != zink_resource(buffer)->obj->buffer) || ctx->ubos[shader][index].buffer_size != cb->buffer_size; if (take_ownership) { @@ -818,7 +818,7 @@ zink_set_shader_buffers(struct pipe_context *pctx, struct zink_resource *res = zink_resource(buffers[i].buffer); pipe_resource_reference(&ssbo->buffer, &res->base); ssbo->buffer_offset = buffers[i].buffer_offset; - ssbo->buffer_size = MIN2(buffers[i].buffer_size, res->size - ssbo->buffer_offset); + ssbo->buffer_size = MIN2(buffers[i].buffer_size, res->obj->size - ssbo->buffer_offset); util_range_add(&res->base, &res->valid_buffer_range, ssbo->buffer_offset, ssbo->buffer_offset + ssbo->buffer_size); update = true; @@ -1452,7 +1452,7 @@ zink_resource_image_barrier(struct zink_context *ctx, struct zink_batch *batch, new_layout, VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, - res->image, + res->obj->image, isr }; vkCmdPipelineBarrier( @@ -1541,8 +1541,8 @@ zink_resource_buffer_barrier(struct zink_context *ctx, struct zink_batch *batch, flags, VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, - res->buffer, - res->offset, + res->obj->buffer, + res->obj->offset, res->base.width0 }; @@ -1841,7 +1841,7 @@ zink_copy_buffer(struct zink_context *ctx, struct zink_batch *batch, struct zink util_range_add(&dst->base, &dst->valid_buffer_range, dst_offset, dst_offset + size); zink_resource_buffer_barrier(ctx, batch, src, VK_ACCESS_TRANSFER_READ_BIT, 0); zink_resource_buffer_barrier(ctx, batch, dst, VK_ACCESS_TRANSFER_WRITE_BIT, 0); - vkCmdCopyBuffer(batch->cmdbuf, src->buffer, dst->buffer, 1, ®ion); + vkCmdCopyBuffer(batch->cmdbuf, src->obj->buffer, dst->obj->buffer, 1, ®ion); } void @@ -1916,9 +1916,9 @@ zink_copy_image_buffer(struct zink_context *ctx, struct zink_batch *batch, struc * - vkCmdCopyBufferToImage spec */ if (buf2img) - vkCmdCopyBufferToImage(batch->cmdbuf, buf->buffer, img->image, img->layout, 1, ®ion); + vkCmdCopyBufferToImage(batch->cmdbuf, buf->obj->buffer, img->obj->image, img->layout, 1, ®ion); else - vkCmdCopyImageToBuffer(batch->cmdbuf, img->image, img->layout, buf->buffer, 1, ®ion); + vkCmdCopyImageToBuffer(batch->cmdbuf, img->obj->image, img->layout, buf->obj->buffer, 1, ®ion); } } @@ -1985,8 +1985,8 @@ zink_resource_copy_region(struct pipe_context *pctx, zink_batch_reference_resource_rw(batch, dst, true); zink_resource_setup_transfer_layouts(ctx, src, dst); - vkCmdCopyImage(batch->cmdbuf, src->image, src->layout, - dst->image, dst->layout, + vkCmdCopyImage(batch->cmdbuf, src->obj->image, src->layout, + dst->obj->image, dst->layout, 1, ®ion); } else if (dst->base.target == PIPE_BUFFER && src->base.target == PIPE_BUFFER) { diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index 03b5a0be608..c53fb3a8b93 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -117,12 +117,12 @@ zink_emit_stream_output_targets(struct pipe_context *pctx) struct zink_so_target *t = (struct zink_so_target *)ctx->so_targets[i]; if (!t) { /* no need to reference this or anything */ - buffers[i] = zink_resource(ctx->dummy_xfb_buffer)->buffer; + buffers[i] = zink_resource(ctx->dummy_xfb_buffer)->obj->buffer; buffer_offsets[i] = 0; buffer_sizes[i] = sizeof(uint8_t); continue; } - buffers[i] = zink_resource(t->base.buffer)->buffer; + buffers[i] = zink_resource(t->base.buffer)->obj->buffer; zink_resource_buffer_barrier(ctx, NULL, zink_resource(t->base.buffer), VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT, VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT); zink_batch_reference_resource_rw(batch, zink_resource(t->base.buffer), true); @@ -190,12 +190,12 @@ zink_bind_vertex_buffers(struct zink_batch *batch, struct zink_context *ctx) assert(vb); if (vb->buffer.resource) { struct zink_resource *res = zink_resource(vb->buffer.resource); - buffers[i] = res->buffer; + buffers[i] = res->obj->buffer; buffer_offsets[i] = vb->buffer_offset; buffer_strides[i] = vb->stride; zink_batch_reference_resource_rw(batch, res, false); } else { - buffers[i] = zink_resource(ctx->dummy_vertex_buffer)->buffer; + buffers[i] = zink_resource(ctx->dummy_vertex_buffer)->obj->buffer; buffer_offsets[i] = 0; buffer_strides[i] = 0; } @@ -404,10 +404,10 @@ update_ubo_descriptors(struct zink_context *ctx, struct zink_descriptor_set *zds assert(num_resources < num_bindings); desc_set_res_add(zds, res, num_resources++, cache_hit); assert(num_buffer_info < num_bindings); - buffer_infos[num_buffer_info].buffer = res ? res->buffer : + buffer_infos[num_buffer_info].buffer = res ? res->obj->buffer : (screen->info.rb2_feats.nullDescriptor ? VK_NULL_HANDLE : - zink_resource(ctx->dummy_vertex_buffer)->buffer); + zink_resource(ctx->dummy_vertex_buffer)->obj->buffer); if (shader->bindings[zds->pool->type][j].type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) { buffer_infos[num_buffer_info].offset = 0; /* we're storing this to qsort later */ @@ -488,7 +488,7 @@ update_ssbo_descriptors(struct zink_context *ctx, struct zink_descriptor_set *zd flag |= VK_ACCESS_SHADER_WRITE_BIT; if (!cache_hit) add_barrier(res, 0, flag, stage, &zds->barriers, ht); - buffer_infos[num_buffer_info].buffer = res->buffer; + buffer_infos[num_buffer_info].buffer = res->obj->buffer; buffer_infos[num_buffer_info].offset = ctx->ssbos[stage][index].buffer_offset; buffer_infos[num_buffer_info].range = ctx->ssbos[stage][index].buffer_size; } else { @@ -1066,7 +1066,7 @@ zink_draw_vbo(struct pipe_context *pctx, struct zink_resource *res = zink_resource(t->counter_buffer); zink_batch_reference_resource_rw(batch, res, true); if (t->counter_buffer_valid) { - counter_buffers[i] = res->buffer; + counter_buffers[i] = res->obj->buffer; counter_buffer_offsets[i] = t->counter_buffer_offset; } } @@ -1095,7 +1095,7 @@ zink_draw_vbo(struct pipe_context *pctx, unreachable("unknown index size!"); } struct zink_resource *res = zink_resource(index_buffer); - vkCmdBindIndexBuffer(batch->cmdbuf, res->buffer, index_offset, index_type); + vkCmdBindIndexBuffer(batch->cmdbuf, res->obj->buffer, index_offset, index_type); zink_batch_reference_resource_rw(batch, res, false); if (dindirect && dindirect->buffer) { struct zink_resource *indirect = zink_resource(dindirect->buffer); @@ -1103,11 +1103,11 @@ zink_draw_vbo(struct pipe_context *pctx, if (dindirect->indirect_draw_count) { struct zink_resource *indirect_draw_count = zink_resource(dindirect->indirect_draw_count); zink_batch_reference_resource_rw(batch, indirect_draw_count, false); - screen->vk_CmdDrawIndexedIndirectCount(batch->cmdbuf, indirect->buffer, dindirect->offset, - indirect_draw_count->buffer, dindirect->indirect_draw_count_offset, + screen->vk_CmdDrawIndexedIndirectCount(batch->cmdbuf, indirect->obj->buffer, dindirect->offset, + indirect_draw_count->obj->buffer, dindirect->indirect_draw_count_offset, dindirect->draw_count, dindirect->stride); } else - vkCmdDrawIndexedIndirect(batch->cmdbuf, indirect->buffer, dindirect->offset, dindirect->draw_count, dindirect->stride); + vkCmdDrawIndexedIndirect(batch->cmdbuf, indirect->obj->buffer, dindirect->offset, dindirect->draw_count, dindirect->stride); } else vkCmdDrawIndexed(batch->cmdbuf, draws[0].count, dinfo->instance_count, @@ -1117,7 +1117,7 @@ zink_draw_vbo(struct pipe_context *pctx, zink_batch_reference_resource_rw(batch, zink_resource(so_target->base.buffer), false); zink_batch_reference_resource_rw(batch, zink_resource(so_target->counter_buffer), true); screen->vk_CmdDrawIndirectByteCountEXT(batch->cmdbuf, dinfo->instance_count, dinfo->start_instance, - zink_resource(so_target->counter_buffer)->buffer, so_target->counter_buffer_offset, 0, + zink_resource(so_target->counter_buffer)->obj->buffer, so_target->counter_buffer_offset, 0, MIN2(so_target->stride, screen->info.tf_props.maxTransformFeedbackBufferDataStride)); } else if (dindirect && dindirect->buffer) { struct zink_resource *indirect = zink_resource(dindirect->buffer); @@ -1125,11 +1125,11 @@ zink_draw_vbo(struct pipe_context *pctx, if (dindirect->indirect_draw_count) { struct zink_resource *indirect_draw_count = zink_resource(dindirect->indirect_draw_count); zink_batch_reference_resource_rw(batch, indirect_draw_count, false); - screen->vk_CmdDrawIndirectCount(batch->cmdbuf, indirect->buffer, dindirect->offset, - indirect_draw_count->buffer, dindirect->indirect_draw_count_offset, + screen->vk_CmdDrawIndirectCount(batch->cmdbuf, indirect->obj->buffer, dindirect->offset, + indirect_draw_count->obj->buffer, dindirect->indirect_draw_count_offset, dindirect->draw_count, dindirect->stride); } else - vkCmdDrawIndirect(batch->cmdbuf, indirect->buffer, dindirect->offset, dindirect->draw_count, dindirect->stride); + vkCmdDrawIndirect(batch->cmdbuf, indirect->obj->buffer, dindirect->offset, dindirect->draw_count, dindirect->stride); } else vkCmdDraw(batch->cmdbuf, draws[0].count, dinfo->instance_count, draws[0].start, dinfo->start_instance); } @@ -1141,7 +1141,7 @@ zink_draw_vbo(struct pipe_context *pctx, for (unsigned i = 0; i < ctx->num_so_targets; i++) { struct zink_so_target *t = zink_so_target(ctx->so_targets[i]); if (t) { - counter_buffers[i] = zink_resource(t->counter_buffer)->buffer; + counter_buffers[i] = zink_resource(t->counter_buffer)->obj->buffer; counter_buffer_offsets[i] = t->counter_buffer_offset; t->counter_buffer_valid = true; } @@ -1179,7 +1179,7 @@ zink_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info) vkCmdBindPipeline(batch->cmdbuf, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline); if (info->indirect) { - vkCmdDispatchIndirect(batch->cmdbuf, zink_resource(info->indirect)->buffer, info->indirect_offset); + vkCmdDispatchIndirect(batch->cmdbuf, zink_resource(info->indirect)->obj->buffer, info->indirect_offset); zink_batch_reference_resource_rw(batch, zink_resource(info->indirect), false); } else vkCmdDispatch(batch->cmdbuf, info->grid[0], info->grid[1], info->grid[2]); diff --git a/src/gallium/drivers/zink/zink_query.c b/src/gallium/drivers/zink/zink_query.c index 1860beb9b1d..dbc960fb528 100644 --- a/src/gallium/drivers/zink/zink_query.c +++ b/src/gallium/drivers/zink/zink_query.c @@ -464,7 +464,7 @@ copy_results_to_buffer(struct zink_context *ctx, struct zink_query *query, struc zink_batch_reference_resource_rw(batch, res, true); zink_resource_buffer_barrier(ctx, batch, res, VK_ACCESS_TRANSFER_WRITE_BIT, 0); util_range_add(&res->base, &res->valid_buffer_range, offset, offset + result_size); - vkCmdCopyQueryPoolResults(batch->cmdbuf, query->query_pool, query_id, num_results, res->buffer, + vkCmdCopyQueryPoolResults(batch->cmdbuf, query->query_pool, query_id, num_results, res->obj->buffer, offset, 0, flags); /* this is required for compute batch sync and will be removed later */ if (is_cs_query(query)) @@ -747,7 +747,7 @@ zink_render_condition(struct pipe_context *pctx, begin_flags = VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT; VkConditionalRenderingBeginInfoEXT begin_info = {}; begin_info.sType = VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT; - begin_info.buffer = res->buffer; + begin_info.buffer = res->obj->buffer; begin_info.flags = begin_flags; screen->vk_CmdBeginConditionalRenderingEXT(batch->cmdbuf, &begin_info); ctx->render_condition_active = true; diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index a7ce6e4cc36..d326c258af6 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -99,25 +99,25 @@ mem_equals(const void *a, const void *b) static void cache_or_free_mem(struct zink_screen *screen, struct zink_resource *res) { - if (res->mkey.flags) { + if (res->obj->mkey.flags) { simple_mtx_lock(&screen->mem_cache_mtx); - struct hash_entry *he = _mesa_hash_table_search_pre_hashed(screen->resource_mem_cache, res->mem_hash, &res->mkey); + struct hash_entry *he = _mesa_hash_table_search_pre_hashed(screen->resource_mem_cache, res->obj->mem_hash, &res->obj->mkey); struct util_dynarray *array = he ? (void*)he->data : NULL; if (!array) { struct mem_key *mkey = rzalloc(screen->resource_mem_cache, struct mem_key); - memcpy(mkey, &res->mkey, sizeof(struct mem_key)); + memcpy(mkey, &res->obj->mkey, sizeof(struct mem_key)); array = rzalloc(screen->resource_mem_cache, struct util_dynarray); util_dynarray_init(array, screen->resource_mem_cache); - _mesa_hash_table_insert_pre_hashed(screen->resource_mem_cache, res->mem_hash, mkey, array); + _mesa_hash_table_insert_pre_hashed(screen->resource_mem_cache, res->obj->mem_hash, mkey, array); } if (util_dynarray_num_elements(array, VkDeviceMemory) < 5) { - util_dynarray_append(array, VkDeviceMemory, res->mem); + util_dynarray_append(array, VkDeviceMemory, res->obj->mem); simple_mtx_unlock(&screen->mem_cache_mtx); return; } simple_mtx_unlock(&screen->mem_cache_mtx); } - vkFreeMemory(screen->dev, res->mem, NULL); + vkFreeMemory(screen->dev, res->obj->mem, NULL); } static void @@ -127,15 +127,15 @@ zink_resource_destroy(struct pipe_screen *pscreen, struct zink_screen *screen = zink_screen(pscreen); struct zink_resource *res = zink_resource(pres); if (pres->target == PIPE_BUFFER) { - vkDestroyBuffer(screen->dev, res->buffer, NULL); + vkDestroyBuffer(screen->dev, res->obj->buffer, NULL); util_range_destroy(&res->valid_buffer_range); } else - vkDestroyImage(screen->dev, res->image, NULL); + vkDestroyImage(screen->dev, res->obj->image, NULL); zink_descriptor_set_refs_clear(&res->desc_set_refs, res); cache_or_free_mem(screen, res); - + FREE(res->obj); FREE(res); } @@ -185,6 +185,11 @@ resource_create(struct pipe_screen *pscreen, pipe_reference_init(&res->base.reference, 1); res->base.screen = pscreen; + res->obj = CALLOC_STRUCT(zink_resource_object); + if (!res->obj) { + FREE(res); + return NULL; + } VkMemoryRequirements reqs = {}; VkMemoryPropertyFlags flags; @@ -243,14 +248,15 @@ resource_create(struct pipe_screen *pscreen, VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT; } - if (vkCreateBuffer(screen->dev, &bci, NULL, &res->buffer) != + if (vkCreateBuffer(screen->dev, &bci, NULL, &res->obj->buffer) != VK_SUCCESS) { debug_printf("vkCreateBuffer failed\n"); + FREE(res->obj); FREE(res); return NULL; } - vkGetBufferMemoryRequirements(screen->dev, res->buffer, &reqs); + vkGetBufferMemoryRequirements(screen->dev, res->obj->buffer, &reqs); flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; } else { res->format = zink_get_format(screen, templ->format); @@ -356,9 +362,10 @@ resource_create(struct pipe_screen *pscreen, if (screen->needs_mesa_wsi && (templ->bind & PIPE_BIND_SCANOUT)) ici.pNext = &image_wsi_info; - VkResult result = vkCreateImage(screen->dev, &ici, NULL, &res->image); + VkResult result = vkCreateImage(screen->dev, &ici, NULL, &res->obj->image); if (result != VK_SUCCESS) { debug_printf("vkCreateImage failed\n"); + FREE(res->obj); FREE(res); return NULL; } @@ -366,7 +373,7 @@ resource_create(struct pipe_screen *pscreen, res->optimal_tiling = ici.tiling != VK_IMAGE_TILING_LINEAR; res->aspect = aspect_from_format(templ->format); - vkGetImageMemoryRequirements(screen->dev, res->image, &reqs); + vkGetImageMemoryRequirements(screen->dev, res->obj->image, &reqs); if (templ->usage == PIPE_USAGE_STAGING) flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; else @@ -384,9 +391,10 @@ resource_create(struct pipe_screen *pscreen, if (templ->target != PIPE_BUFFER) { VkMemoryType mem_type = screen->info.mem_props.memoryTypes[mai.memoryTypeIndex]; - res->host_visible = mem_type.propertyFlags & + res->obj->host_visible = mem_type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; - } + } else + res->obj->host_visible = true; VkExportMemoryAllocateInfo emai = {}; if (templ->bind & PIPE_BIND_SHARED) { @@ -424,32 +432,33 @@ resource_create(struct pipe_screen *pscreen, } if (!mai.pNext && !(templ->flags & PIPE_RESOURCE_FLAG_MAP_COHERENT)) { - res->mkey.reqs = reqs; - res->mkey.flags = flags; - res->mem_hash = mem_hash(&res->mkey); + res->obj->mkey.reqs = reqs; + res->obj->mkey.flags = flags; + res->obj->mem_hash = mem_hash(&res->obj->mkey); simple_mtx_lock(&screen->mem_cache_mtx); - struct hash_entry *he = _mesa_hash_table_search_pre_hashed(screen->resource_mem_cache, res->mem_hash, &res->mkey); + struct hash_entry *he = _mesa_hash_table_search_pre_hashed(screen->resource_mem_cache, res->obj->mem_hash, &res->obj->mkey); + struct util_dynarray *array = he ? (void*)he->data : NULL; if (array && util_dynarray_num_elements(array, VkDeviceMemory)) { - res->mem = util_dynarray_pop(array, VkDeviceMemory); + res->obj->mem = util_dynarray_pop(array, VkDeviceMemory); } simple_mtx_unlock(&screen->mem_cache_mtx); } - if (!res->mem && vkAllocateMemory(screen->dev, &mai, NULL, &res->mem) != VK_SUCCESS) { + if (!res->obj->mem && vkAllocateMemory(screen->dev, &mai, NULL, &res->obj->mem) != VK_SUCCESS) { debug_printf("vkAllocateMemory failed\n"); goto fail; } - res->offset = 0; - res->size = reqs.size; + res->obj->offset = 0; + res->obj->size = reqs.size; if (templ->target == PIPE_BUFFER) { - vkBindBufferMemory(screen->dev, res->buffer, res->mem, res->offset); + vkBindBufferMemory(screen->dev, res->obj->buffer, res->obj->mem, res->obj->offset); util_range_init(&res->valid_buffer_range); } else - vkBindImageMemory(screen->dev, res->image, res->mem, res->offset); + vkBindImageMemory(screen->dev, res->obj->image, res->obj->mem, res->obj->offset); if (screen->winsys && (templ->bind & PIPE_BIND_DISPLAY_TARGET)) { struct sw_winsys *winsys = screen->winsys; @@ -467,10 +476,10 @@ resource_create(struct pipe_screen *pscreen, fail: if (templ->target == PIPE_BUFFER) - vkDestroyBuffer(screen->dev, res->buffer, NULL); + vkDestroyBuffer(screen->dev, res->obj->buffer, NULL); else - vkDestroyImage(screen->dev, res->image, NULL); - + vkDestroyImage(screen->dev, res->obj->image, NULL); + FREE(res->obj); FREE(res); return NULL; @@ -499,7 +508,7 @@ zink_resource_get_handle(struct pipe_screen *pscreen, sub_res.aspectMask = res->aspect; - vkGetImageSubresourceLayout(screen->dev, res->image, &sub_res, &sub_res_layout); + vkGetImageSubresourceLayout(screen->dev, res->obj->image, &sub_res, &sub_res_layout); whandle->stride = sub_res_layout.rowPitch; } @@ -509,7 +518,7 @@ zink_resource_get_handle(struct pipe_screen *pscreen, VkMemoryGetFdInfoKHR fd_info = {}; int fd; fd_info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR; - fd_info.memory = res->mem; + fd_info.memory = res->obj->mem; fd_info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT; VkResult result = (*screen->vk_GetMemoryFdKHR)(screen->dev, &fd_info, &fd); if (result != VK_SUCCESS) @@ -553,9 +562,9 @@ zink_transfer_copy_bufimage(struct zink_context *ctx, struct pipe_box box = trans->base.box; int x = box.x; if (buf2img) - box.x = src->offset; + box.x = src->obj->offset; - zink_copy_image_buffer(ctx, NULL, dst, src, trans->base.level, buf2img ? x : dst->offset, + zink_copy_image_buffer(ctx, NULL, dst, src, trans->base.level, buf2img ? x : dst->obj->offset, box.y, box.z, trans->base.level, &box, trans->base.usage); } @@ -618,7 +627,7 @@ zink_transfer_map(struct pipe_context *pctx, } - VkResult result = vkMapMemory(screen->dev, res->mem, res->offset, res->size, 0, &ptr); + VkResult result = vkMapMemory(screen->dev, res->obj->mem, res->obj->offset, res->obj->size, 0, &ptr); if (result != VK_SUCCESS) return NULL; @@ -653,7 +662,7 @@ zink_transfer_map(struct pipe_context *pctx, else if (usage & PIPE_MAP_READ) /* if the map region intersects with any clears then we have to apply them */ zink_fb_clears_apply_region(ctx, pres, zink_rect_from_box(box)); - if (res->optimal_tiling || !res->host_visible) { + if (res->optimal_tiling || !res->obj->host_visible) { enum pipe_format format = pres->format; if (usage & PIPE_MAP_DEPTH_ONLY) format = util_format_get_depth_only(pres->format); @@ -692,9 +701,9 @@ zink_transfer_map(struct pipe_context *pctx, zink_fence_wait(pctx); } - VkResult result = vkMapMemory(screen->dev, staging_res->mem, - staging_res->offset, - staging_res->size, 0, &ptr); + VkResult result = vkMapMemory(screen->dev, staging_res->obj->mem, + staging_res->obj->offset, + staging_res->obj->size, 0, &ptr); if (result != VK_SUCCESS) return NULL; @@ -710,7 +719,7 @@ zink_transfer_map(struct pipe_context *pctx, else zink_fence_wait(pctx); } - VkResult result = vkMapMemory(screen->dev, res->mem, res->offset, res->size, 0, &ptr); + VkResult result = vkMapMemory(screen->dev, res->obj->mem, res->obj->offset, res->obj->size, 0, &ptr); if (result != VK_SUCCESS) return NULL; VkImageSubresource isr = { @@ -719,7 +728,7 @@ zink_transfer_map(struct pipe_context *pctx, 0 }; VkSubresourceLayout srl; - vkGetImageSubresourceLayout(screen->dev, res->image, &isr, &srl); + vkGetImageSubresourceLayout(screen->dev, res->obj->image, &isr, &srl); trans->base.stride = srl.rowPitch; trans->base.layer_stride = srl.arrayPitch; const struct util_format_description *desc = util_format_description(res->base.format); @@ -775,9 +784,9 @@ zink_transfer_unmap(struct pipe_context *pctx, struct zink_transfer *trans = (struct zink_transfer *)ptrans; if (trans->staging_res) { struct zink_resource *staging_res = zink_resource(trans->staging_res); - vkUnmapMemory(screen->dev, staging_res->mem); + vkUnmapMemory(screen->dev, staging_res->obj->mem); } else - vkUnmapMemory(screen->dev, res->mem); + vkUnmapMemory(screen->dev, res->obj->mem); if ((trans->base.usage & PIPE_MAP_PERSISTENT) && !(trans->base.usage & PIPE_MAP_COHERENT)) res->persistent_maps--; if (!(trans->base.usage & (PIPE_MAP_FLUSH_EXPLICIT | PIPE_MAP_COHERENT))) { diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h index 36d35b1574f..cad908d7b4d 100644 --- a/src/gallium/drivers/zink/zink_resource.h +++ b/src/gallium/drivers/zink/zink_resource.h @@ -45,6 +45,20 @@ struct mem_key { VkMemoryPropertyFlags flags; }; +struct zink_resource_object { + struct pipe_reference reference; + union { + VkBuffer buffer; + VkImage image; + }; + VkDeviceMemory mem; + uint32_t mem_hash; + struct mem_key mkey; + VkDeviceSize offset, size; + + bool host_visible; +}; + struct zink_resource { struct pipe_resource base; @@ -52,24 +66,17 @@ struct zink_resource { VkPipelineStageFlagBits access_stage; VkAccessFlags access; + + struct zink_resource_object *obj; union { - struct { - VkBuffer buffer; - struct util_range valid_buffer_range; - }; + struct util_range valid_buffer_range; struct { VkFormat format; - VkImage image; VkImageLayout layout; VkImageAspectFlags aspect; bool optimal_tiling; - bool host_visible; }; }; - VkDeviceMemory mem; - uint32_t mem_hash; - struct mem_key mkey; - VkDeviceSize offset, size; struct sw_displaytarget *dt; unsigned dt_stride; diff --git a/src/gallium/drivers/zink/zink_surface.c b/src/gallium/drivers/zink/zink_surface.c index eaaa28879cc..02dd85152c2 100644 --- a/src/gallium/drivers/zink/zink_surface.c +++ b/src/gallium/drivers/zink/zink_surface.c @@ -37,7 +37,7 @@ create_ivci(struct zink_screen *screen, { VkImageViewCreateInfo ivci = {}; ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - ivci.image = res->image; + ivci.image = res->obj->image; switch (res->base.target) { case PIPE_TEXTURE_1D: _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
