X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fintel%2Fvulkan%2Fanv_image.c;h=63b8c86f5c33c1c82491ec9c4dad3aeb5606ee62;hb=7ddb21708c800dfbe3cea2df6aaaf7aed852761b;hp=23fdd9368468cf1f5c5d984d38edacdfa16f3baf;hpb=fc3650a0a9eca29a9498f663d489ab729f55f65f;p=mesa.git diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 23fdd936846..63b8c86f5c3 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -120,19 +120,30 @@ make_surface(const struct anv_device *dev, [VK_IMAGE_TYPE_3D] = ISL_SURF_DIM_3D, }; - isl_tiling_flags_t tiling_flags = anv_info->isl_tiling_flags; - if (vk_info->tiling == VK_IMAGE_TILING_LINEAR) - tiling_flags = ISL_TILING_LINEAR_BIT; + /* Translate the Vulkan tiling to an equivalent ISL tiling, then filter the + * result with an optionally provided ISL tiling argument. + */ + isl_tiling_flags_t tiling_flags = + (vk_info->tiling == VK_IMAGE_TILING_LINEAR) ? + ISL_TILING_LINEAR_BIT : ISL_TILING_ANY_MASK; + + if (anv_info->isl_tiling_flags) + tiling_flags &= anv_info->isl_tiling_flags; + + assert(tiling_flags); struct anv_surface *anv_surf = get_surface(image, aspect); image->extent = anv_sanitize_image_extent(vk_info->imageType, vk_info->extent); + enum isl_format format = anv_get_isl_format(&dev->info, vk_info->format, + aspect, vk_info->tiling); + assert(format != ISL_FORMAT_UNSUPPORTED); + ok = isl_surf_init(&dev->isl_dev, &anv_surf->isl, .dim = vk_to_isl_surf_dim[vk_info->imageType], - .format = anv_get_isl_format(&dev->info, vk_info->format, - aspect, vk_info->tiling), + .format = format, .width = image->extent.width, .height = image->extent.height, .depth = image->extent.depth, @@ -260,7 +271,6 @@ anv_CreateImage(VkDevice device, return anv_image_create(device, &(struct anv_image_create_info) { .vk_info = pCreateInfo, - .isl_tiling_flags = ISL_TILING_ANY_MASK, }, pAllocator, pImage); @@ -322,81 +332,6 @@ void anv_GetImageSubresourceLayout( } } -VkResult -anv_validate_CreateImageView(VkDevice _device, - const VkImageViewCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkImageView *pView) -{ - ANV_FROM_HANDLE(anv_image, image, pCreateInfo->image); - const VkImageSubresourceRange *subresource; - - /* Validate structure type before dereferencing it. */ - assert(pCreateInfo); - assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO); - subresource = &pCreateInfo->subresourceRange; - - /* Validate viewType is in range before using it. */ - assert(pCreateInfo->viewType >= VK_IMAGE_VIEW_TYPE_BEGIN_RANGE); - assert(pCreateInfo->viewType <= VK_IMAGE_VIEW_TYPE_END_RANGE); - - /* Validate format is in range before using it. */ - assert(pCreateInfo->format >= VK_FORMAT_BEGIN_RANGE); - assert(pCreateInfo->format <= VK_FORMAT_END_RANGE); - - /* Validate channel swizzles. */ - assert(pCreateInfo->components.r >= VK_COMPONENT_SWIZZLE_BEGIN_RANGE); - assert(pCreateInfo->components.r <= VK_COMPONENT_SWIZZLE_END_RANGE); - assert(pCreateInfo->components.g >= VK_COMPONENT_SWIZZLE_BEGIN_RANGE); - assert(pCreateInfo->components.g <= VK_COMPONENT_SWIZZLE_END_RANGE); - assert(pCreateInfo->components.b >= VK_COMPONENT_SWIZZLE_BEGIN_RANGE); - assert(pCreateInfo->components.b <= VK_COMPONENT_SWIZZLE_END_RANGE); - assert(pCreateInfo->components.a >= VK_COMPONENT_SWIZZLE_BEGIN_RANGE); - assert(pCreateInfo->components.a <= VK_COMPONENT_SWIZZLE_END_RANGE); - - /* Validate subresource. */ - assert(subresource->aspectMask != 0); - assert(subresource->levelCount > 0); - assert(subresource->layerCount > 0); - assert(subresource->baseMipLevel < image->levels); - assert(subresource->baseMipLevel + anv_get_levelCount(image, subresource) <= image->levels); - assert(subresource->baseArrayLayer < image->array_size); - assert(subresource->baseArrayLayer + anv_get_layerCount(image, subresource) <= image->array_size); - assert(pView); - - MAYBE_UNUSED const VkImageAspectFlags view_format_aspects = - vk_format_aspects(pCreateInfo->format); - - const VkImageAspectFlags ds_flags = VK_IMAGE_ASPECT_DEPTH_BIT - | VK_IMAGE_ASPECT_STENCIL_BIT; - - /* Validate format. */ - if (subresource->aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) { - assert(subresource->aspectMask == VK_IMAGE_ASPECT_COLOR_BIT); - assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT); - assert(view_format_aspects == VK_IMAGE_ASPECT_COLOR_BIT); - } else if (subresource->aspectMask & ds_flags) { - assert((subresource->aspectMask & ~ds_flags) == 0); - - assert(pCreateInfo->format == image->vk_format); - - if (subresource->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) { - assert(image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT); - assert(view_format_aspects & VK_IMAGE_ASPECT_DEPTH_BIT); - } - - if (subresource->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) { - /* FINISHME: Is it legal to have an R8 view of S8? */ - assert(image->aspects & VK_IMAGE_ASPECT_STENCIL_BIT); - assert(view_format_aspects & VK_IMAGE_ASPECT_STENCIL_BIT); - } - } else { - assert(!"bad VkImageSubresourceRange::aspectFlags"); - } - - return anv_CreateImageView(_device, pCreateInfo, pAllocator, pView); -} - static struct anv_state alloc_surface_state(struct anv_device *device, struct anv_cmd_buffer *cmd_buffer) @@ -410,7 +345,7 @@ alloc_surface_state(struct anv_device *device, static enum isl_channel_select remap_swizzle(VkComponentSwizzle swizzle, VkComponentSwizzle component, - struct anv_format_swizzle format_swizzle) + struct isl_swizzle format_swizzle) { if (swizzle == VK_COMPONENT_SWIZZLE_IDENTITY) swizzle = component; @@ -479,15 +414,15 @@ anv_image_view_init(struct anv_image_view *iview, .levels = anv_get_levelCount(image, range), .base_array_layer = range->baseArrayLayer, .array_len = anv_get_layerCount(image, range), - .channel_select = { - remap_swizzle(pCreateInfo->components.r, - VK_COMPONENT_SWIZZLE_R, format.swizzle), - remap_swizzle(pCreateInfo->components.g, - VK_COMPONENT_SWIZZLE_G, format.swizzle), - remap_swizzle(pCreateInfo->components.b, - VK_COMPONENT_SWIZZLE_B, format.swizzle), - remap_swizzle(pCreateInfo->components.a, - VK_COMPONENT_SWIZZLE_A, format.swizzle), + .swizzle = { + .r = remap_swizzle(pCreateInfo->components.r, + VK_COMPONENT_SWIZZLE_R, format.swizzle), + .g = remap_swizzle(pCreateInfo->components.g, + VK_COMPONENT_SWIZZLE_G, format.swizzle), + .b = remap_swizzle(pCreateInfo->components.b, + VK_COMPONENT_SWIZZLE_B, format.swizzle), + .a = remap_swizzle(pCreateInfo->components.a, + VK_COMPONENT_SWIZZLE_A, format.swizzle), }, }; @@ -521,7 +456,18 @@ anv_image_view_init(struct anv_image_view *iview, iview->sampler_surface_state.alloc_size = 0; } - if (image->usage & usage_mask & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { + /* This is kind-of hackish. It is possible, due to get_full_usage above, + * to get a surface state with a non-renderable format but with + * VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT. This happens in particular for + * formats which aren't renderable but where we want to use Vulkan copy + * commands so VK_IMAGE_USAGE_TRANSFER_DST_BIT is set. In the case of a + * copy, meta will use a format that we can render to, but most of the rest + * of the time, we don't want to create those surface states. Once we + * start using blorp for copies, this problem will go away and we can + * remove a lot of hacks. + */ + if ((image->usage & usage_mask & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) && + isl_format_supports_rendering(&device->info, isl_view.format)) { iview->color_rt_surface_state = alloc_surface_state(device, cmd_buffer); isl_view.usage = cube_usage | ISL_SURF_USAGE_RENDER_TARGET_BIT; @@ -628,18 +574,19 @@ void anv_buffer_view_init(struct anv_buffer_view *view, view->format = anv_get_isl_format(&device->info, pCreateInfo->format, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_TILING_LINEAR); + const uint32_t format_bs = isl_format_get_layout(view->format)->bpb / 8; view->bo = buffer->bo; view->offset = buffer->offset + pCreateInfo->offset; view->range = pCreateInfo->range == VK_WHOLE_SIZE ? - buffer->size - view->offset : pCreateInfo->range; + buffer->size - pCreateInfo->offset : pCreateInfo->range; + view->range = align_down_npot_u32(view->range, format_bs); if (buffer->usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) { view->surface_state = alloc_surface_state(device, cmd_buffer); anv_fill_buffer_surface_state(device, view->surface_state, view->format, - view->offset, view->range, - isl_format_get_layout(view->format)->bpb / 8); + view->offset, view->range, format_bs); } else { view->surface_state = (struct anv_state){ 0 }; }