lavapipe: start introducing planes structure.
this just introduces a single plane and refactors code to use it. Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com> Reviewed-by: Roland Scheidegger <sroland@vmware.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25609>
This commit is contained in:
@@ -464,8 +464,8 @@ VKAPI_ATTR void VKAPI_CALL lvp_UpdateDescriptorSets(
|
||||
LVP_FROM_HANDLE(lvp_image_view, iview,
|
||||
write->pImageInfo[j].imageView);
|
||||
if (iview) {
|
||||
lp_jit_texture_from_pipe(&desc[j].texture, iview->sv);
|
||||
desc[j].functions = iview->texture_handle->functions;
|
||||
lp_jit_texture_from_pipe(&desc[j].texture, iview->planes[0].sv);
|
||||
desc[j].functions = iview->planes[0].texture_handle->functions;
|
||||
|
||||
if (!bind_layout->immutable_samplers) {
|
||||
LVP_FROM_HANDLE(lvp_sampler, sampler,
|
||||
@@ -487,8 +487,8 @@ VKAPI_ATTR void VKAPI_CALL lvp_UpdateDescriptorSets(
|
||||
write->pImageInfo[j].imageView);
|
||||
|
||||
if (iview) {
|
||||
lp_jit_texture_from_pipe(&desc[j].texture, iview->sv);
|
||||
desc[j].functions = iview->texture_handle->functions;
|
||||
lp_jit_texture_from_pipe(&desc[j].texture, iview->planes[0].sv);
|
||||
desc[j].functions = iview->planes[0].texture_handle->functions;
|
||||
} else {
|
||||
desc[j].functions = device->null_texture_handle->functions;
|
||||
desc[j].sampler_index = 0;
|
||||
@@ -502,8 +502,8 @@ VKAPI_ATTR void VKAPI_CALL lvp_UpdateDescriptorSets(
|
||||
write->pImageInfo[j].imageView);
|
||||
|
||||
if (iview) {
|
||||
lp_jit_image_from_pipe(&desc[j].image, &iview->iv);
|
||||
desc[j].functions = iview->image_handle->functions;
|
||||
lp_jit_image_from_pipe(&desc[j].image, &iview->planes[0].iv);
|
||||
desc[j].functions = iview->planes[0].image_handle->functions;
|
||||
} else {
|
||||
desc[j].functions = device->null_image_handle->functions;
|
||||
}
|
||||
@@ -822,8 +822,8 @@ lvp_descriptor_set_update_with_template(VkDevice _device, VkDescriptorSet descri
|
||||
LVP_FROM_HANDLE(lvp_image_view, iview, info->imageView);
|
||||
|
||||
if (iview) {
|
||||
lp_jit_texture_from_pipe(&desc[idx].texture, iview->sv);
|
||||
desc[idx].functions = iview->texture_handle->functions;
|
||||
lp_jit_texture_from_pipe(&desc[idx].texture, iview->planes[0].sv);
|
||||
desc[idx].functions = iview->planes[0].texture_handle->functions;
|
||||
|
||||
if (!bind_layout->immutable_samplers) {
|
||||
LVP_FROM_HANDLE(lvp_sampler, sampler, info->sampler);
|
||||
@@ -842,8 +842,8 @@ lvp_descriptor_set_update_with_template(VkDevice _device, VkDescriptorSet descri
|
||||
LVP_FROM_HANDLE(lvp_image_view, iview, info->imageView);
|
||||
|
||||
if (iview) {
|
||||
lp_jit_texture_from_pipe(&desc[idx].texture, iview->sv);
|
||||
desc[idx].functions = iview->texture_handle->functions;
|
||||
lp_jit_texture_from_pipe(&desc[idx].texture, iview->planes[0].sv);
|
||||
desc[idx].functions = iview->planes[0].texture_handle->functions;
|
||||
} else {
|
||||
desc[j].functions = device->null_texture_handle->functions;
|
||||
desc[j].sampler_index = 0;
|
||||
@@ -856,8 +856,8 @@ lvp_descriptor_set_update_with_template(VkDevice _device, VkDescriptorSet descri
|
||||
((VkDescriptorImageInfo *)pSrc)->imageView);
|
||||
|
||||
if (iview) {
|
||||
lp_jit_image_from_pipe(&desc[idx].image, &iview->iv);
|
||||
desc[idx].functions = iview->image_handle->functions;
|
||||
lp_jit_image_from_pipe(&desc[idx].image, &iview->planes[0].iv);
|
||||
desc[idx].functions = iview->planes[0].image_handle->functions;
|
||||
} else {
|
||||
desc[idx].functions = device->null_image_handle->functions;
|
||||
}
|
||||
@@ -1018,8 +1018,8 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetDescriptorEXT(
|
||||
if (info && info->imageView) {
|
||||
LVP_FROM_HANDLE(lvp_image_view, iview, info->imageView);
|
||||
|
||||
lp_jit_texture_from_pipe(&desc->texture, iview->sv);
|
||||
desc->functions = iview->texture_handle->functions;
|
||||
lp_jit_texture_from_pipe(&desc->texture, iview->planes[0].sv);
|
||||
desc->functions = iview->planes[0].texture_handle->functions;
|
||||
|
||||
if (info->sampler) {
|
||||
LVP_FROM_HANDLE(lvp_sampler, sampler, info->sampler);
|
||||
@@ -1040,8 +1040,8 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetDescriptorEXT(
|
||||
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: {
|
||||
if (pCreateInfo->data.pSampledImage && pCreateInfo->data.pSampledImage->imageView) {
|
||||
LVP_FROM_HANDLE(lvp_image_view, iview, pCreateInfo->data.pSampledImage->imageView);
|
||||
lp_jit_texture_from_pipe(&desc->texture, iview->sv);
|
||||
desc->functions = iview->texture_handle->functions;
|
||||
lp_jit_texture_from_pipe(&desc->texture, iview->planes[0].sv);
|
||||
desc->functions = iview->planes[0].texture_handle->functions;
|
||||
} else {
|
||||
desc->functions = device->null_texture_handle->functions;
|
||||
desc->sampler_index = 0;
|
||||
@@ -1054,8 +1054,8 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetDescriptorEXT(
|
||||
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: {
|
||||
if (pCreateInfo->data.pStorageImage && pCreateInfo->data.pStorageImage->imageView) {
|
||||
LVP_FROM_HANDLE(lvp_image_view, iview, pCreateInfo->data.pStorageImage->imageView);
|
||||
lp_jit_image_from_pipe(&desc->image, &iview->iv);
|
||||
desc->functions = iview->image_handle->functions;
|
||||
lp_jit_image_from_pipe(&desc->image, &iview->planes[0].iv);
|
||||
desc->functions = iview->planes[0].image_handle->functions;
|
||||
} else {
|
||||
desc->functions = device->null_image_handle->functions;
|
||||
}
|
||||
|
||||
@@ -2012,6 +2012,31 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_BindBufferMemory2(VkDevice _device,
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
static VkResult
|
||||
lvp_image_plane_bind(struct lvp_device *device,
|
||||
struct lvp_image_plane *plane,
|
||||
struct lvp_device_memory *mem,
|
||||
VkDeviceSize memory_offset,
|
||||
VkDeviceSize *plane_offset)
|
||||
{
|
||||
if (!device->pscreen->resource_bind_backing(device->pscreen,
|
||||
plane->bo,
|
||||
mem->pmem,
|
||||
memory_offset + *plane_offset)) {
|
||||
/* This is probably caused by the texture being too large, so let's
|
||||
* report this as the *closest* allowed error-code. It's not ideal,
|
||||
* but it's unlikely that anyone will care too much.
|
||||
*/
|
||||
return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
|
||||
}
|
||||
plane->pmem = mem->pmem;
|
||||
plane->memory_offset = memory_offset;
|
||||
plane->plane_offset = *plane_offset;
|
||||
*plane_offset += plane->size;
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
VKAPI_ATTR VkResult VKAPI_CALL lvp_BindImageMemory2(VkDevice _device,
|
||||
uint32_t bindInfoCount,
|
||||
const VkBindImageMemoryInfo *pBindInfos)
|
||||
@@ -2032,12 +2057,12 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_BindImageMemory2(VkDevice _device,
|
||||
lvp_swapchain_get_image(swapchain_info->swapchain,
|
||||
swapchain_info->imageIndex);
|
||||
|
||||
image->pmem = swapchain_image->pmem;
|
||||
image->memory_offset = swapchain_image->memory_offset;
|
||||
image->planes[0].pmem = swapchain_image->planes[0].pmem;
|
||||
image->planes[0].memory_offset = swapchain_image->planes[0].memory_offset;
|
||||
device->pscreen->resource_bind_backing(device->pscreen,
|
||||
image->bo,
|
||||
image->pmem,
|
||||
image->memory_offset);
|
||||
image->planes[0].bo,
|
||||
image->planes[0].pmem,
|
||||
image->planes[0].memory_offset);
|
||||
did_bind = true;
|
||||
break;
|
||||
}
|
||||
@@ -2047,18 +2072,13 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_BindImageMemory2(VkDevice _device,
|
||||
}
|
||||
|
||||
if (!did_bind) {
|
||||
if (!device->pscreen->resource_bind_backing(device->pscreen,
|
||||
image->bo,
|
||||
mem->pmem,
|
||||
bind_info->memoryOffset)) {
|
||||
/* This is probably caused by the texture being too large, so let's
|
||||
* report this as the *closest* allowed error-code. It's not ideal,
|
||||
* but it's unlikely that anyone will care too much.
|
||||
*/
|
||||
return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
|
||||
}
|
||||
image->pmem = mem->pmem;
|
||||
image->memory_offset = bind_info->memoryOffset;
|
||||
uint64_t offset_B = 0;
|
||||
VkResult result;
|
||||
|
||||
result = lvp_image_plane_bind(device, &image->planes[0],
|
||||
mem, bind_info->memoryOffset, &offset_B);
|
||||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return VK_SUCCESS;
|
||||
|
||||
@@ -1285,7 +1285,7 @@ static struct pipe_surface *create_img_surface(struct rendering_state *state,
|
||||
VkImageSubresourceRange imgv_subres =
|
||||
vk_image_view_subresource_range(&imgv->vk);
|
||||
|
||||
return create_img_surface_bo(state, &imgv_subres, imgv->image->bo,
|
||||
return create_img_surface_bo(state, &imgv_subres, imgv->image->planes[0].bo,
|
||||
lvp_vk_format_to_pipe_format(format),
|
||||
width, height, base_layer, layer_count, 0);
|
||||
}
|
||||
@@ -1529,8 +1529,8 @@ resolve_ds(struct rendering_state *state, bool multi)
|
||||
|
||||
struct pipe_blit_info info = {0};
|
||||
|
||||
info.src.resource = src_imgv->image->bo;
|
||||
info.dst.resource = dst_imgv->image->bo;
|
||||
info.src.resource = src_imgv->image->planes[0].bo;
|
||||
info.dst.resource = dst_imgv->image->planes[0].bo;
|
||||
info.src.format = src_imgv->pformat;
|
||||
info.dst.format = dst_imgv->pformat;
|
||||
info.filter = PIPE_TEX_FILTER_NEAREST;
|
||||
@@ -1577,8 +1577,8 @@ resolve_color(struct rendering_state *state, bool multi)
|
||||
|
||||
struct pipe_blit_info info = { 0 };
|
||||
|
||||
info.src.resource = src_imgv->image->bo;
|
||||
info.dst.resource = dst_imgv->image->bo;
|
||||
info.src.resource = src_imgv->image->planes[0].bo;
|
||||
info.dst.resource = dst_imgv->image->planes[0].bo;
|
||||
info.src.format = src_imgv->pformat;
|
||||
info.dst.format = dst_imgv->pformat;
|
||||
info.filter = PIPE_TEX_FILTER_NEAREST;
|
||||
@@ -1628,12 +1628,12 @@ replicate_attachment(struct rendering_state *state,
|
||||
.x = 0,
|
||||
.y = 0,
|
||||
.z = 0,
|
||||
.width = u_minify(dst->image->bo->width0, level),
|
||||
.height = u_minify(dst->image->bo->height0, level),
|
||||
.depth = u_minify(dst->image->bo->depth0, level),
|
||||
.width = u_minify(dst->image->planes[0].bo->width0, level),
|
||||
.height = u_minify(dst->image->planes[0].bo->height0, level),
|
||||
.depth = u_minify(dst->image->planes[0].bo->depth0, level),
|
||||
};
|
||||
state->pctx->resource_copy_region(state->pctx, dst->image->bo, level,
|
||||
0, 0, 0, src->image->bo, level, &box);
|
||||
state->pctx->resource_copy_region(state->pctx, dst->image->planes[0].bo, level,
|
||||
0, 0, 0, src->image->planes[0].bo, level, &box);
|
||||
}
|
||||
|
||||
static struct lvp_image_view *
|
||||
@@ -1645,13 +1645,13 @@ create_multisample_surface(struct rendering_state *state, struct lvp_image_view
|
||||
templ.nr_samples = samples;
|
||||
struct lvp_image *image = mem_dup(imgv->image, sizeof(struct lvp_image));
|
||||
image->vk.samples = samples;
|
||||
image->pmem = NULL;
|
||||
image->bo = state->pctx->screen->resource_create(state->pctx->screen, &templ);
|
||||
image->planes[0].pmem = NULL;
|
||||
image->planes[0].bo = state->pctx->screen->resource_create(state->pctx->screen, &templ);
|
||||
|
||||
struct lvp_image_view *multi = mem_dup(imgv, sizeof(struct lvp_image_view));
|
||||
multi->image = image;
|
||||
multi->surface = state->pctx->create_surface(state->pctx, image->bo, imgv->surface);
|
||||
struct pipe_resource *ref = image->bo;
|
||||
multi->surface = state->pctx->create_surface(state->pctx, image->planes[0].bo, imgv->surface);
|
||||
struct pipe_resource *ref = image->planes[0].bo;
|
||||
pipe_resource_reference(&ref, NULL);
|
||||
imgv->multisample = multi;
|
||||
multi->multisample = imgv;
|
||||
@@ -2187,7 +2187,7 @@ static void handle_copy_image_to_buffer2(struct vk_cmd_queue_entry *cmd,
|
||||
box.depth = src_image->vk.image_type == VK_IMAGE_TYPE_3D ? region->imageExtent.depth : subresource_layercount(src_image, ®ion->imageSubresource);
|
||||
|
||||
src_data = state->pctx->texture_map(state->pctx,
|
||||
src_image->bo,
|
||||
src_image->planes[0].bo,
|
||||
region->imageSubresource.mipLevel,
|
||||
PIPE_MAP_READ,
|
||||
&box,
|
||||
@@ -2206,7 +2206,7 @@ static void handle_copy_image_to_buffer2(struct vk_cmd_queue_entry *cmd,
|
||||
&dbox,
|
||||
&dst_t);
|
||||
|
||||
enum pipe_format src_format = src_image->bo->format;
|
||||
enum pipe_format src_format = src_image->planes[0].bo->format;
|
||||
enum pipe_format dst_format = src_format;
|
||||
if (util_format_is_depth_or_stencil(src_format)) {
|
||||
if (region->imageSubresource.aspectMask == VK_IMAGE_ASPECT_DEPTH_BIT) {
|
||||
@@ -2276,17 +2276,17 @@ static void handle_copy_buffer_to_image(struct vk_cmd_queue_entry *cmd,
|
||||
box.depth = dst_image->vk.image_type == VK_IMAGE_TYPE_3D ? region->imageExtent.depth : subresource_layercount(dst_image, ®ion->imageSubresource);
|
||||
|
||||
dst_data = state->pctx->texture_map(state->pctx,
|
||||
dst_image->bo,
|
||||
dst_image->planes[0].bo,
|
||||
region->imageSubresource.mipLevel,
|
||||
PIPE_MAP_WRITE,
|
||||
&box,
|
||||
&dst_t);
|
||||
|
||||
enum pipe_format dst_format = dst_image->bo->format;
|
||||
enum pipe_format dst_format = dst_image->planes[0].bo->format;
|
||||
enum pipe_format src_format = dst_format;
|
||||
if (util_format_is_depth_or_stencil(dst_format)) {
|
||||
if (region->imageSubresource.aspectMask == VK_IMAGE_ASPECT_DEPTH_BIT) {
|
||||
src_format = util_format_get_depth_only(dst_image->bo->format);
|
||||
src_format = util_format_get_depth_only(dst_image->planes[0].bo->format);
|
||||
} else if (region->imageSubresource.aspectMask == VK_IMAGE_ASPECT_STENCIL_BIT) {
|
||||
src_format = PIPE_FORMAT_S8_UINT;
|
||||
}
|
||||
@@ -2336,7 +2336,7 @@ static void handle_copy_image(struct vk_cmd_queue_entry *cmd,
|
||||
src_box.y = region->srcOffset.y;
|
||||
src_box.width = region->extent.width;
|
||||
src_box.height = region->extent.height;
|
||||
if (src_image->bo->target == PIPE_TEXTURE_3D) {
|
||||
if (src_image->planes[0].bo->target == PIPE_TEXTURE_3D) {
|
||||
src_box.depth = region->extent.depth;
|
||||
src_box.z = region->srcOffset.z;
|
||||
} else {
|
||||
@@ -2344,15 +2344,15 @@ static void handle_copy_image(struct vk_cmd_queue_entry *cmd,
|
||||
src_box.z = region->srcSubresource.baseArrayLayer;
|
||||
}
|
||||
|
||||
unsigned dstz = dst_image->bo->target == PIPE_TEXTURE_3D ?
|
||||
unsigned dstz = dst_image->planes[0].bo->target == PIPE_TEXTURE_3D ?
|
||||
region->dstOffset.z :
|
||||
region->dstSubresource.baseArrayLayer;
|
||||
state->pctx->resource_copy_region(state->pctx, dst_image->bo,
|
||||
state->pctx->resource_copy_region(state->pctx, dst_image->planes[0].bo,
|
||||
region->dstSubresource.mipLevel,
|
||||
region->dstOffset.x,
|
||||
region->dstOffset.y,
|
||||
dstz,
|
||||
src_image->bo,
|
||||
src_image->planes[0].bo,
|
||||
region->srcSubresource.mipLevel,
|
||||
&src_box);
|
||||
}
|
||||
@@ -2381,10 +2381,10 @@ static void handle_blit_image(struct vk_cmd_queue_entry *cmd,
|
||||
LVP_FROM_HANDLE(lvp_image, dst_image, blitcmd->dstImage);
|
||||
|
||||
struct pipe_blit_info info = {
|
||||
.src.resource = src_image->bo,
|
||||
.dst.resource = dst_image->bo,
|
||||
.src.format = src_image->bo->format,
|
||||
.dst.format = dst_image->bo->format,
|
||||
.src.resource = src_image->planes[0].bo,
|
||||
.dst.resource = dst_image->planes[0].bo,
|
||||
.src.format = src_image->planes[0].bo->format,
|
||||
.dst.format = dst_image->planes[0].bo->format,
|
||||
.mask = util_format_is_depth_or_stencil(info.src.format) ? PIPE_MASK_ZS : PIPE_MASK_RGBA,
|
||||
.filter = blitcmd->filter == VK_FILTER_NEAREST ? PIPE_TEX_FILTER_NEAREST : PIPE_TEX_FILTER_LINEAR,
|
||||
};
|
||||
@@ -2433,7 +2433,7 @@ static void handle_blit_image(struct vk_cmd_queue_entry *cmd,
|
||||
|
||||
assert_subresource_layers(info.src.resource, src_image, &blitcmd->pRegions[i].srcSubresource, blitcmd->pRegions[i].srcOffsets);
|
||||
assert_subresource_layers(info.dst.resource, dst_image, &blitcmd->pRegions[i].dstSubresource, blitcmd->pRegions[i].dstOffsets);
|
||||
if (src_image->bo->target == PIPE_TEXTURE_3D) {
|
||||
if (src_image->planes[0].bo->target == PIPE_TEXTURE_3D) {
|
||||
if (dstZ0 < dstZ1) {
|
||||
info.dst.box.z = dstZ0;
|
||||
info.src.box.z = srcZ0;
|
||||
@@ -2929,7 +2929,7 @@ static void handle_clear_color_image(struct vk_cmd_queue_entry *cmd,
|
||||
LVP_FROM_HANDLE(lvp_image, image, cmd->u.clear_color_image.image);
|
||||
union util_color uc;
|
||||
uint32_t *col_val = uc.ui;
|
||||
util_pack_color_union(image->bo->format, &uc, (void*)cmd->u.clear_color_image.color);
|
||||
util_pack_color_union(image->planes[0].bo->format, &uc, (void*)cmd->u.clear_color_image.color);
|
||||
for (unsigned i = 0; i < cmd->u.clear_color_image.range_count; i++) {
|
||||
VkImageSubresourceRange *range = &cmd->u.clear_color_image.ranges[i];
|
||||
struct pipe_box box;
|
||||
@@ -2939,12 +2939,12 @@ static void handle_clear_color_image(struct vk_cmd_queue_entry *cmd,
|
||||
|
||||
uint32_t level_count = vk_image_subresource_level_count(&image->vk, range);
|
||||
for (unsigned j = range->baseMipLevel; j < range->baseMipLevel + level_count; j++) {
|
||||
box.width = u_minify(image->bo->width0, j);
|
||||
box.height = u_minify(image->bo->height0, j);
|
||||
box.width = u_minify(image->planes[0].bo->width0, j);
|
||||
box.height = u_minify(image->planes[0].bo->height0, j);
|
||||
box.depth = 1;
|
||||
if (image->bo->target == PIPE_TEXTURE_3D) {
|
||||
box.depth = u_minify(image->bo->depth0, j);
|
||||
} else if (image->bo->target == PIPE_TEXTURE_1D_ARRAY) {
|
||||
if (image->planes[0].bo->target == PIPE_TEXTURE_3D) {
|
||||
box.depth = u_minify(image->planes[0].bo->depth0, j);
|
||||
} else if (image->planes[0].bo->target == PIPE_TEXTURE_1D_ARRAY) {
|
||||
box.y = range->baseArrayLayer;
|
||||
box.height = vk_image_subresource_layer_count(&image->vk, range);
|
||||
box.depth = 1;
|
||||
@@ -2953,7 +2953,7 @@ static void handle_clear_color_image(struct vk_cmd_queue_entry *cmd,
|
||||
box.depth = vk_image_subresource_layer_count(&image->vk, range);
|
||||
}
|
||||
|
||||
state->pctx->clear_texture(state->pctx, image->bo,
|
||||
state->pctx->clear_texture(state->pctx, image->planes[0].bo,
|
||||
j, &box, (void *)col_val);
|
||||
}
|
||||
}
|
||||
@@ -2975,17 +2975,17 @@ static void handle_clear_ds_image(struct vk_cmd_queue_entry *cmd,
|
||||
for (unsigned j = 0; j < level_count; j++) {
|
||||
struct pipe_surface *surf;
|
||||
unsigned width, height, depth;
|
||||
width = u_minify(image->bo->width0, range->baseMipLevel + j);
|
||||
height = u_minify(image->bo->height0, range->baseMipLevel + j);
|
||||
width = u_minify(image->planes[0].bo->width0, range->baseMipLevel + j);
|
||||
height = u_minify(image->planes[0].bo->height0, range->baseMipLevel + j);
|
||||
|
||||
if (image->bo->target == PIPE_TEXTURE_3D) {
|
||||
depth = u_minify(image->bo->depth0, range->baseMipLevel + j);
|
||||
if (image->planes[0].bo->target == PIPE_TEXTURE_3D) {
|
||||
depth = u_minify(image->planes[0].bo->depth0, range->baseMipLevel + j);
|
||||
} else {
|
||||
depth = vk_image_subresource_layer_count(&image->vk, range);
|
||||
}
|
||||
|
||||
surf = create_img_surface_bo(state, range,
|
||||
image->bo, image->bo->format,
|
||||
image->planes[0].bo, image->planes[0].bo->format,
|
||||
width, height,
|
||||
0, depth, j);
|
||||
|
||||
@@ -3064,10 +3064,10 @@ static void handle_resolve_image(struct vk_cmd_queue_entry *cmd,
|
||||
LVP_FROM_HANDLE(lvp_image, dst_image, resolvecmd->dstImage);
|
||||
|
||||
struct pipe_blit_info info = {0};
|
||||
info.src.resource = src_image->bo;
|
||||
info.dst.resource = dst_image->bo;
|
||||
info.src.format = src_image->bo->format;
|
||||
info.dst.format = dst_image->bo->format;
|
||||
info.src.resource = src_image->planes[0].bo;
|
||||
info.dst.resource = dst_image->planes[0].bo;
|
||||
info.src.format = src_image->planes[0].bo->format;
|
||||
info.dst.format = dst_image->planes[0].bo->format;
|
||||
info.mask = util_format_is_depth_or_stencil(info.src.format) ? PIPE_MASK_ZS : PIPE_MASK_RGBA;
|
||||
info.filter = PIPE_TEX_FILTER_NEAREST;
|
||||
|
||||
|
||||
@@ -43,9 +43,10 @@ lvp_image_create(VkDevice _device,
|
||||
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||
|
||||
image->alignment = 16;
|
||||
|
||||
{
|
||||
struct pipe_resource template;
|
||||
|
||||
VkFormat format = pCreateInfo->format;
|
||||
memset(&template, 0, sizeof(template));
|
||||
|
||||
template.screen = device->pscreen;
|
||||
@@ -62,7 +63,7 @@ lvp_image_create(VkDevice _device,
|
||||
break;
|
||||
}
|
||||
|
||||
template.format = lvp_vk_format_to_pipe_format(pCreateInfo->format);
|
||||
template.format = lvp_vk_format_to_pipe_format(format);
|
||||
|
||||
bool is_ds = util_format_is_depth_or_stencil(template.format);
|
||||
|
||||
@@ -99,11 +100,13 @@ lvp_image_create(VkDevice _device,
|
||||
template.last_level = pCreateInfo->mipLevels - 1;
|
||||
template.nr_samples = pCreateInfo->samples;
|
||||
template.nr_storage_samples = pCreateInfo->samples;
|
||||
image->bo = device->pscreen->resource_create_unbacked(device->pscreen,
|
||||
&template,
|
||||
&image->size);
|
||||
if (!image->bo)
|
||||
image->planes[0].bo = device->pscreen->resource_create_unbacked(device->pscreen,
|
||||
&template,
|
||||
&image->planes[0].size);
|
||||
if (!image->planes[0].bo)
|
||||
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||
|
||||
image->size += image->planes[0].size;
|
||||
}
|
||||
*pImage = lvp_image_to_handle(image);
|
||||
|
||||
@@ -167,7 +170,7 @@ lvp_DestroyImage(VkDevice _device, VkImage _image,
|
||||
|
||||
if (!_image)
|
||||
return;
|
||||
pipe_resource_reference(&image->bo, NULL);
|
||||
pipe_resource_reference(&image->planes[0].bo, NULL);
|
||||
vk_image_destroy(&device->vk, pAllocator, &image->vk);
|
||||
}
|
||||
|
||||
@@ -202,7 +205,7 @@ lvp_create_samplerview(struct pipe_context *pctx, struct lvp_image_view *iv)
|
||||
else
|
||||
pformat = lvp_vk_format_to_pipe_format(iv->vk.format);
|
||||
u_sampler_view_default_template(&templ,
|
||||
iv->image->bo,
|
||||
iv->image->planes[0].bo,
|
||||
pformat);
|
||||
if (iv->vk.view_type == VK_IMAGE_VIEW_TYPE_1D)
|
||||
templ.target = PIPE_TEXTURE_1D;
|
||||
@@ -235,7 +238,7 @@ lvp_create_samplerview(struct pipe_context *pctx, struct lvp_image_view *iv)
|
||||
templ.swizzle_a = conv_depth_swiz(templ.swizzle_a);
|
||||
}
|
||||
|
||||
return pctx->create_sampler_view(pctx, iv->image->bo, &templ);
|
||||
return pctx->create_sampler_view(pctx, iv->image->planes[0].bo, &templ);
|
||||
}
|
||||
|
||||
static struct pipe_image_view
|
||||
@@ -245,7 +248,7 @@ lvp_create_imageview(const struct lvp_image_view *iv)
|
||||
if (!iv)
|
||||
return view;
|
||||
|
||||
view.resource = iv->image->bo;
|
||||
view.resource = iv->image->planes[0].bo;
|
||||
if (iv->vk.aspects == VK_IMAGE_ASPECT_DEPTH_BIT)
|
||||
view.format = lvp_vk_format_to_pipe_format(iv->vk.format);
|
||||
else if (iv->vk.aspects == VK_IMAGE_ASPECT_STENCIL_BIT)
|
||||
@@ -285,14 +288,14 @@ lvp_CreateImageView(VkDevice _device,
|
||||
|
||||
simple_mtx_lock(&device->queue.lock);
|
||||
|
||||
if (image->bo->bind & PIPE_BIND_SHADER_IMAGE) {
|
||||
view->iv = lvp_create_imageview(view);
|
||||
view->image_handle = (void *)(uintptr_t)device->queue.ctx->create_image_handle(device->queue.ctx, &view->iv);
|
||||
if (image->planes[0].bo->bind & PIPE_BIND_SHADER_IMAGE) {
|
||||
view->planes[0].iv = lvp_create_imageview(view);
|
||||
view->planes[0].image_handle = (void *)(uintptr_t)device->queue.ctx->create_image_handle(device->queue.ctx, &view->planes[0].iv);
|
||||
}
|
||||
|
||||
if (image->bo->bind & PIPE_BIND_SAMPLER_VIEW) {
|
||||
view->sv = lvp_create_samplerview(device->queue.ctx, view);
|
||||
view->texture_handle = (void *)(uintptr_t)device->queue.ctx->create_texture_handle(device->queue.ctx, view->sv, NULL);
|
||||
if (image->planes[0].bo->bind & PIPE_BIND_SAMPLER_VIEW) {
|
||||
view->planes[0].sv = lvp_create_samplerview(device->queue.ctx, view);
|
||||
view->planes[0].texture_handle = (void *)(uintptr_t)device->queue.ctx->create_texture_handle(device->queue.ctx, view->planes[0].sv, NULL);
|
||||
}
|
||||
|
||||
simple_mtx_unlock(&device->queue.lock);
|
||||
@@ -314,10 +317,10 @@ lvp_DestroyImageView(VkDevice _device, VkImageView _iview,
|
||||
|
||||
simple_mtx_lock(&device->queue.lock);
|
||||
|
||||
device->queue.ctx->delete_image_handle(device->queue.ctx, (uint64_t)(uintptr_t)iview->image_handle);
|
||||
device->queue.ctx->delete_image_handle(device->queue.ctx, (uint64_t)(uintptr_t)iview->planes[0].image_handle);
|
||||
|
||||
pipe_sampler_view_reference(&iview->sv, NULL);
|
||||
device->queue.ctx->delete_texture_handle(device->queue.ctx, (uint64_t)(uintptr_t)iview->texture_handle);
|
||||
pipe_sampler_view_reference(&iview->planes[0].sv, NULL);
|
||||
device->queue.ctx->delete_texture_handle(device->queue.ctx, (uint64_t)(uintptr_t)iview->planes[0].texture_handle);
|
||||
|
||||
simple_mtx_unlock(&device->queue.lock);
|
||||
|
||||
@@ -337,7 +340,7 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetImageSubresourceLayout(
|
||||
|
||||
device->pscreen->resource_get_param(device->pscreen,
|
||||
NULL,
|
||||
image->bo,
|
||||
image->planes[0].bo,
|
||||
0,
|
||||
pSubresource->arrayLayer,
|
||||
pSubresource->mipLevel,
|
||||
@@ -348,7 +351,7 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetImageSubresourceLayout(
|
||||
|
||||
device->pscreen->resource_get_param(device->pscreen,
|
||||
NULL,
|
||||
image->bo,
|
||||
image->planes[0].bo,
|
||||
0,
|
||||
pSubresource->arrayLayer,
|
||||
pSubresource->mipLevel,
|
||||
@@ -359,14 +362,14 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetImageSubresourceLayout(
|
||||
|
||||
device->pscreen->resource_get_param(device->pscreen,
|
||||
NULL,
|
||||
image->bo,
|
||||
image->planes[0].bo,
|
||||
0,
|
||||
pSubresource->arrayLayer,
|
||||
pSubresource->mipLevel,
|
||||
PIPE_RESOURCE_PARAM_LAYER_STRIDE,
|
||||
0, &value);
|
||||
|
||||
if (image->bo->target == PIPE_TEXTURE_3D) {
|
||||
if (image->planes[0].bo->target == PIPE_TEXTURE_3D) {
|
||||
pLayout->depthPitch = value;
|
||||
pLayout->arrayPitch = 0;
|
||||
} else {
|
||||
@@ -626,7 +629,7 @@ lvp_CopyMemoryToImageEXT(VkDevice _device, const VkCopyMemoryToImageInfoEXT *pCo
|
||||
.height = copy->imageExtent.height,
|
||||
.depth = 1,
|
||||
};
|
||||
switch (image->bo->target) {
|
||||
switch (image->planes[0].bo->target) {
|
||||
case PIPE_TEXTURE_CUBE:
|
||||
case PIPE_TEXTURE_CUBE_ARRAY:
|
||||
case PIPE_TEXTURE_2D_ARRAY:
|
||||
@@ -644,9 +647,9 @@ lvp_CopyMemoryToImageEXT(VkDevice _device, const VkCopyMemoryToImageInfoEXT *pCo
|
||||
break;
|
||||
}
|
||||
|
||||
unsigned stride = util_format_get_stride(image->bo->format, copy->memoryRowLength ? copy->memoryRowLength : box.width);
|
||||
unsigned layer_stride = util_format_get_2d_size(image->bo->format, stride, copy->memoryImageHeight ? copy->memoryImageHeight : box.height);
|
||||
device->queue.ctx->texture_subdata(device->queue.ctx, image->bo, copy->imageSubresource.mipLevel, 0,
|
||||
unsigned stride = util_format_get_stride(image->planes[0].bo->format, copy->memoryRowLength ? copy->memoryRowLength : box.width);
|
||||
unsigned layer_stride = util_format_get_2d_size(image->planes[0].bo->format, stride, copy->memoryImageHeight ? copy->memoryImageHeight : box.height);
|
||||
device->queue.ctx->texture_subdata(device->queue.ctx, image->planes[0].bo, copy->imageSubresource.mipLevel, 0,
|
||||
&box, copy->pHostPointer, stride, layer_stride);
|
||||
}
|
||||
return VK_SUCCESS;
|
||||
@@ -667,7 +670,7 @@ lvp_CopyImageToMemoryEXT(VkDevice _device, const VkCopyImageToMemoryInfoEXT *pCo
|
||||
.height = copy->imageExtent.height,
|
||||
.depth = 1,
|
||||
};
|
||||
switch (image->bo->target) {
|
||||
switch (image->planes[0].bo->target) {
|
||||
case PIPE_TEXTURE_CUBE:
|
||||
case PIPE_TEXTURE_CUBE_ARRAY:
|
||||
case PIPE_TEXTURE_2D_ARRAY:
|
||||
@@ -685,14 +688,14 @@ lvp_CopyImageToMemoryEXT(VkDevice _device, const VkCopyImageToMemoryInfoEXT *pCo
|
||||
break;
|
||||
}
|
||||
struct pipe_transfer *xfer;
|
||||
uint8_t *data = device->queue.ctx->texture_map(device->queue.ctx, image->bo, copy->imageSubresource.mipLevel,
|
||||
uint8_t *data = device->queue.ctx->texture_map(device->queue.ctx, image->planes[0].bo, copy->imageSubresource.mipLevel,
|
||||
PIPE_MAP_READ | PIPE_MAP_UNSYNCHRONIZED | PIPE_MAP_THREAD_SAFE, &box, &xfer);
|
||||
if (!data)
|
||||
return VK_ERROR_MEMORY_MAP_FAILED;
|
||||
|
||||
unsigned stride = util_format_get_stride(image->bo->format, copy->memoryRowLength ? copy->memoryRowLength : box.width);
|
||||
unsigned layer_stride = util_format_get_2d_size(image->bo->format, stride, copy->memoryImageHeight ? copy->memoryImageHeight : box.height);
|
||||
util_copy_box(copy->pHostPointer, image->bo->format, stride, layer_stride,
|
||||
unsigned stride = util_format_get_stride(image->planes[0].bo->format, copy->memoryRowLength ? copy->memoryRowLength : box.width);
|
||||
unsigned layer_stride = util_format_get_2d_size(image->planes[0].bo->format, stride, copy->memoryImageHeight ? copy->memoryImageHeight : box.height);
|
||||
util_copy_box(copy->pHostPointer, image->planes[0].bo->format, stride, layer_stride,
|
||||
/* offsets are all zero because texture_map handles the offset */
|
||||
0, 0, 0, box.width, box.height, box.depth, data, xfer->stride, xfer->layer_stride, 0, 0, 0);
|
||||
pipe_texture_unmap(device->queue.ctx, xfer);
|
||||
@@ -714,7 +717,7 @@ lvp_CopyImageToImageEXT(VkDevice _device, const VkCopyImageToImageInfoEXT *pCopy
|
||||
src_box.y = pCopyImageToImageInfo->pRegions[i].srcOffset.y;
|
||||
src_box.width = pCopyImageToImageInfo->pRegions[i].extent.width;
|
||||
src_box.height = pCopyImageToImageInfo->pRegions[i].extent.height;
|
||||
if (src_image->bo->target == PIPE_TEXTURE_3D) {
|
||||
if (src_image->planes[0].bo->target == PIPE_TEXTURE_3D) {
|
||||
src_box.depth = pCopyImageToImageInfo->pRegions[i].extent.depth;
|
||||
src_box.z = pCopyImageToImageInfo->pRegions[i].srcOffset.z;
|
||||
} else {
|
||||
@@ -722,15 +725,15 @@ lvp_CopyImageToImageEXT(VkDevice _device, const VkCopyImageToImageInfoEXT *pCopy
|
||||
src_box.z = pCopyImageToImageInfo->pRegions[i].srcSubresource.baseArrayLayer;
|
||||
}
|
||||
|
||||
unsigned dstz = dst_image->bo->target == PIPE_TEXTURE_3D ?
|
||||
unsigned dstz = dst_image->planes[0].bo->target == PIPE_TEXTURE_3D ?
|
||||
pCopyImageToImageInfo->pRegions[i].dstOffset.z :
|
||||
pCopyImageToImageInfo->pRegions[i].dstSubresource.baseArrayLayer;
|
||||
device->queue.ctx->resource_copy_region(device->queue.ctx, dst_image->bo,
|
||||
device->queue.ctx->resource_copy_region(device->queue.ctx, dst_image->planes[0].bo,
|
||||
pCopyImageToImageInfo->pRegions[i].dstSubresource.mipLevel,
|
||||
pCopyImageToImageInfo->pRegions[i].dstOffset.x,
|
||||
pCopyImageToImageInfo->pRegions[i].dstOffset.y,
|
||||
dstz,
|
||||
src_image->bo,
|
||||
src_image->planes[0].bo,
|
||||
pCopyImageToImageInfo->pRegions[i].srcSubresource.mipLevel,
|
||||
&src_box);
|
||||
}
|
||||
|
||||
@@ -251,13 +251,19 @@ vk_sync_as_lvp_pipe_sync(struct vk_sync *sync)
|
||||
return container_of(sync, struct lvp_pipe_sync, base);
|
||||
}
|
||||
|
||||
struct lvp_image_plane {
|
||||
struct pipe_resource *bo;
|
||||
struct pipe_memory_allocation *pmem;
|
||||
VkDeviceSize plane_offset;
|
||||
VkDeviceSize memory_offset;
|
||||
VkDeviceSize size;
|
||||
};
|
||||
|
||||
struct lvp_image {
|
||||
struct vk_image vk;
|
||||
VkDeviceSize size;
|
||||
uint32_t alignment;
|
||||
struct pipe_memory_allocation *pmem;
|
||||
unsigned memory_offset;
|
||||
struct pipe_resource *bo;
|
||||
struct lvp_image_plane planes[1];
|
||||
};
|
||||
|
||||
struct lvp_image_view {
|
||||
@@ -266,14 +272,16 @@ struct lvp_image_view {
|
||||
|
||||
enum pipe_format pformat;
|
||||
|
||||
struct pipe_sampler_view *sv;
|
||||
struct pipe_image_view iv;
|
||||
|
||||
struct pipe_surface *surface; /* have we created a pipe surface for this? */
|
||||
struct lvp_image_view *multisample; //VK_EXT_multisampled_render_to_single_sampled
|
||||
|
||||
struct lp_texture_handle *texture_handle;
|
||||
struct lp_texture_handle *image_handle;
|
||||
uint8_t plane_count;
|
||||
struct {
|
||||
struct pipe_sampler_view *sv;
|
||||
struct pipe_image_view iv;
|
||||
struct lp_texture_handle *texture_handle;
|
||||
struct lp_texture_handle *image_handle;
|
||||
} planes[1];
|
||||
};
|
||||
|
||||
struct lvp_sampler {
|
||||
|
||||
Reference in New Issue
Block a user