anv: support image views with surface state stream

Add optional anv_state_stream to anv_image_view_init.  This is useful
for internal image views whose lifetimes are tied to the lifetime of a
command buffer.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25467>
This commit is contained in:
Chia-I Wu
2023-10-09 14:16:19 -07:00
committed by Marge Bot
parent 815b568ed5
commit d5841dce60
3 changed files with 48 additions and 25 deletions
+29 -22
View File
@@ -2795,9 +2795,12 @@ anv_layout_has_untracked_aux_writes(const struct intel_device_info * const devin
}
static struct anv_state
maybe_alloc_surface_state(struct anv_device *device)
maybe_alloc_surface_state(struct anv_device *device,
struct anv_state_stream *surface_state_stream)
{
if (device->physical->indirect_descriptors) {
if (surface_state_stream)
return anv_state_stream_alloc(surface_state_stream, 64, 64);
return anv_state_pool_alloc(&device->bindless_surface_state_pool, 64, 64);
} else {
return ANV_STATE_NULL;
@@ -3092,16 +3095,18 @@ anv_can_fast_clear_color_view(struct anv_device *device,
return true;
}
static void
void
anv_image_view_init(struct anv_device *device,
struct anv_image_view *iview,
const VkImageViewCreateInfo *pCreateInfo)
const VkImageViewCreateInfo *pCreateInfo,
struct anv_state_stream *surface_state_stream)
{
ANV_FROM_HANDLE(anv_image, image, pCreateInfo->image);
vk_image_view_init(&device->vk, &iview->vk, false, pCreateInfo);
iview->image = image;
iview->n_planes = anv_image_aspect_get_planes(iview->vk.aspects);
iview->use_surface_state_stream = surface_state_stream != NULL;
/* Now go through the underlying image selected planes and map them to
* planes in the image view.
@@ -3143,9 +3148,9 @@ anv_image_view_init(struct anv_device *device,
if (iview->vk.usage & (VK_IMAGE_USAGE_SAMPLED_BIT |
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)) {
iview->planes[vplane].optimal_sampler.state =
maybe_alloc_surface_state(device);
maybe_alloc_surface_state(device, surface_state_stream);
iview->planes[vplane].general_sampler.state =
maybe_alloc_surface_state(device);
maybe_alloc_surface_state(device, surface_state_stream);
enum isl_aux_usage general_aux_usage =
anv_layout_to_aux_usage(device->info, image, 1UL << iaspect_bit,
@@ -3193,7 +3198,7 @@ anv_image_view_init(struct anv_device *device,
VK_QUEUE_COMPUTE_BIT |
VK_QUEUE_TRANSFER_BIT);
iview->planes[vplane].storage.state =
maybe_alloc_surface_state(device);
maybe_alloc_surface_state(device, surface_state_stream);
anv_image_fill_surface_state(device, image, 1ULL << iaspect_bit,
&storage_view,
@@ -3205,26 +3210,28 @@ anv_image_view_init(struct anv_device *device,
}
}
static void
void
anv_image_view_finish(struct anv_image_view *iview)
{
struct anv_device *device =
container_of(iview->vk.base.device, struct anv_device, vk);
for (uint32_t plane = 0; plane < iview->n_planes; plane++) {
if (iview->planes[plane].optimal_sampler.state.alloc_size) {
anv_state_pool_free(&device->bindless_surface_state_pool,
iview->planes[plane].optimal_sampler.state);
}
if (!iview->use_surface_state_stream) {
for (uint32_t plane = 0; plane < iview->n_planes; plane++) {
if (iview->planes[plane].optimal_sampler.state.alloc_size) {
anv_state_pool_free(&device->bindless_surface_state_pool,
iview->planes[plane].optimal_sampler.state);
}
if (iview->planes[plane].general_sampler.state.alloc_size) {
anv_state_pool_free(&device->bindless_surface_state_pool,
iview->planes[plane].general_sampler.state);
}
if (iview->planes[plane].general_sampler.state.alloc_size) {
anv_state_pool_free(&device->bindless_surface_state_pool,
iview->planes[plane].general_sampler.state);
}
if (iview->planes[plane].storage.state.alloc_size) {
anv_state_pool_free(&device->bindless_surface_state_pool,
iview->planes[plane].storage.state);
if (iview->planes[plane].storage.state.alloc_size) {
anv_state_pool_free(&device->bindless_surface_state_pool,
iview->planes[plane].storage.state);
}
}
}
@@ -3245,7 +3252,7 @@ anv_CreateImageView(VkDevice _device,
if (iview == NULL)
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
anv_image_view_init(device, iview, pCreateInfo);
anv_image_view_init(device, iview, pCreateInfo, NULL);
*pView = anv_image_view_to_handle(iview);
@@ -3315,7 +3322,7 @@ anv_CreateBufferView(VkDevice _device,
view->address = anv_address_add(buffer->address, pCreateInfo->offset);
if (buffer_usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
view->general.state = maybe_alloc_surface_state(device);
view->general.state = maybe_alloc_surface_state(device, NULL);
anv_fill_buffer_view_surface_state(device,
&view->general,
@@ -3328,7 +3335,7 @@ anv_CreateBufferView(VkDevice _device,
}
if (buffer_usage & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
view->storage.state = maybe_alloc_surface_state(device);
view->storage.state = maybe_alloc_surface_state(device, NULL);
anv_fill_buffer_view_surface_state(device,
&view->storage,
+14
View File
@@ -5001,6 +5001,13 @@ struct anv_image_view {
const struct anv_image *image; /**< VkImageViewCreateInfo::image */
unsigned n_planes;
/**
* True if the surface states (if any) are owned by some anv_state_stream
* from internal_surface_state_pool.
*/
bool use_surface_state_stream;
struct {
struct isl_view isl;
@@ -5070,6 +5077,13 @@ void anv_image_get_memory_requirements(struct anv_device *device,
VkImageAspectFlags aspects,
VkMemoryRequirements2 *pMemoryRequirements);
void anv_image_view_init(struct anv_device *device,
struct anv_image_view *iview,
const VkImageViewCreateInfo *pCreateInfo,
struct anv_state_stream *state_stream);
void anv_image_view_finish(struct anv_image_view *iview);
enum isl_format
anv_isl_format_for_descriptor_type(const struct anv_device *device,
VkDescriptorType type);
+5 -3
View File
@@ -2042,7 +2042,8 @@ emit_indirect_descriptor_binding_table_entry(struct anv_cmd_buffer *cmd_buffer,
(desc->layout == VK_IMAGE_LAYOUT_GENERAL) ?
&desc->image_view->planes[binding->plane].general_sampler :
&desc->image_view->planes[binding->plane].optimal_sampler;
surface_state =
surface_state = desc->image_view->use_surface_state_stream ?
sstate->state :
anv_bindless_state_for_binding_table(device, sstate->state);
assert(surface_state.alloc_size);
} else {
@@ -2055,8 +2056,9 @@ emit_indirect_descriptor_binding_table_entry(struct anv_cmd_buffer *cmd_buffer,
if (desc->image_view) {
const struct anv_surface_state *sstate =
&desc->image_view->planes[binding->plane].storage;
surface_state = anv_bindless_state_for_binding_table(
device, sstate->state);
surface_state = desc->image_view->use_surface_state_stream ?
sstate->state :
anv_bindless_state_for_binding_table(device, sstate->state);
assert(surface_state.alloc_size);
} else {
surface_state =