v3dv_pipeline_combined_index_key_unpack(combined_idx_key,
&texture_idx, &sampler_idx);
- struct v3dv_image_view *image_view =
- v3dv_descriptor_map_get_image_view(descriptor_state,
- texture_map,
- cmd_buffer->state.pipeline->layout,
- texture_idx);
+ VkFormat vk_format;
+ const struct v3dv_format *format;
- assert(image_view);
+ format =
+ v3dv_descriptor_map_get_texture_format(descriptor_state,
+ texture_map,
+ cmd_buffer->state.pipeline->layout,
+ texture_idx,
+ &vk_format);
const struct v3dv_sampler *sampler = NULL;
if (sampler_idx != V3DV_NO_SAMPLER_IDX) {
}
key->tex[combined_idx].return_size =
- v3dv_get_tex_return_size(image_view->format,
+ v3dv_get_tex_return_size(format,
sampler ? sampler->compare_enable : false);
if (key->tex[combined_idx].return_size == 32) {
* formats.
*/
if (sampler && sampler->clamp_to_transparent_black_border) {
- switch (image_view->vk_format) {
+ switch (vk_format) {
case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
key->tex[combined_idx].swizzle[3] = PIPE_SWIZZLE_1;
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
return sizeof(struct v3dv_sampled_image_descriptor);
default:
return 0;
return reloc;
}
+const struct v3dv_format*
+v3dv_descriptor_map_get_texture_format(struct v3dv_descriptor_state *descriptor_state,
+ struct v3dv_descriptor_map *map,
+ struct v3dv_pipeline_layout *pipeline_layout,
+ uint32_t index,
+ VkFormat *out_vk_format)
+{
+ struct v3dv_descriptor *descriptor =
+ v3dv_descriptor_map_get_descriptor(descriptor_state, map,
+ pipeline_layout, index, NULL);
+
+ switch (descriptor->type) {
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+ assert(descriptor->buffer_view);
+ *out_vk_format = descriptor->buffer_view->vk_format;
+ return descriptor->buffer_view->format;
+ case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+ case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+ case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+ case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ assert(descriptor->image_view);
+ *out_vk_format = descriptor->image_view->vk_format;
+ return descriptor->image_view->format;
+ default:
+ unreachable("descriptor type doesn't has a texture format");
+ }
+}
+
+struct v3dv_bo*
+v3dv_descriptor_map_get_texture_bo(struct v3dv_descriptor_state *descriptor_state,
+ struct v3dv_descriptor_map *map,
+ struct v3dv_pipeline_layout *pipeline_layout,
+ uint32_t index)
+
+{
+ struct v3dv_descriptor *descriptor =
+ v3dv_descriptor_map_get_descriptor(descriptor_state, map,
+ pipeline_layout, index, NULL);
+
+ switch (descriptor->type) {
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+ assert(descriptor->buffer_view);
+ return descriptor->buffer_view->buffer->mem->bo;
+ case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+ case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+ case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+ case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ assert(descriptor->image_view);
+ return descriptor->image_view->image->mem->bo;
+ default:
+ unreachable("descriptor type doesn't has a texture bo");
+ }
+}
+
struct v3dv_cl_reloc
v3dv_descriptor_map_get_texture_shader_state(struct v3dv_descriptor_state *descriptor_state,
struct v3dv_descriptor_map *map,
assert(type == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE ||
type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER ||
type == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT ||
- type == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE);
+ type == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE ||
+ type == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER ||
+ type == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER);
if (type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) {
reloc.offset += offsetof(struct v3dv_combined_image_sampler_descriptor,
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
break;
default:
unreachable("Unimplemented descriptor type");
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
/* Nothing here, just to keep the descriptor type filtering below */
break;
default:
}
}
+
+static void
+write_buffer_view_descriptor(VkDescriptorType desc_type,
+ struct v3dv_descriptor_set *set,
+ const struct v3dv_descriptor_set_binding_layout *binding_layout,
+ struct v3dv_buffer_view *bview,
+ uint32_t array_index)
+{
+ void *desc_map = descriptor_bo_map(set, binding_layout, array_index);
+
+ assert(bview);
+
+ memcpy(desc_map,
+ bview->texture_shader_state,
+ sizeof(bview->texture_shader_state));
+}
+
void
v3dv_UpdateDescriptorSets(VkDevice _device,
uint32_t descriptorWriteCount,
break;
}
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: {
+ V3DV_FROM_HANDLE(v3dv_buffer_view, buffer_view,
+ writeset->pTexelBufferView[j]);
+
+ assert(buffer_view);
+
+ descriptor->buffer_view = buffer_view;
+
+ write_buffer_view_descriptor(writeset->descriptorType,
+ set, binding_layout, buffer_view,
+ writeset->dstArrayElement + j);
+ break;
+ }
default:
unreachable("unimplemented descriptor type");
break;
vk_free2(&device->alloc, pAllocator, image_view);
}
+static void
+pack_texture_shader_state_from_buffer_view(struct v3dv_device *device,
+ struct v3dv_buffer_view *buffer_view)
+{
+ assert(buffer_view->buffer);
+ const struct v3dv_buffer *buffer = buffer_view->buffer;
+
+ v3dv_pack(buffer_view->texture_shader_state, TEXTURE_SHADER_STATE, tex) {
+ tex.swizzle_r = translate_swizzle(PIPE_SWIZZLE_X);
+ tex.swizzle_g = translate_swizzle(PIPE_SWIZZLE_Y);
+ tex.swizzle_b = translate_swizzle(PIPE_SWIZZLE_Z);
+ tex.swizzle_a = translate_swizzle(PIPE_SWIZZLE_W);
+
+ tex.image_depth = 1;
+
+ /* On 4.x, the height of a 1D texture is redefined to be the upper 14
+ * bits of the width (which is only usable with txf) (or in other words,
+ * we are providing a 28 bit field for size, but split on the usual
+ * 14bit height/width).
+ */
+ tex.image_width = buffer_view->size;
+ tex.image_height = tex.image_width >> 14;
+ tex.image_width &= (1 << 14) - 1;
+ tex.image_height &= (1 << 14) - 1;
+
+ tex.texture_type = buffer_view->format->tex_type;
+ tex.srgb = vk_format_is_srgb(buffer_view->vk_format);
+
+ /* At this point we don't have the job. That's the reason the first
+ * parameter is NULL, to avoid a crash when cl_pack_emit_reloc tries to
+ * add the bo to the job. This also means that we need to add manually
+ * the image bo to the job using the texture.
+ */
+ const uint32_t base_offset =
+ buffer->mem->bo->offset +
+ buffer->mem_offset +
+ buffer_view->offset;
+
+ tex.texture_base_pointer = v3dv_cl_address(NULL, base_offset);
+ }
+}
+
VkResult
v3dv_CreateBufferView(VkDevice _device,
const VkBufferViewCreateInfo *pCreateInfo,
&view->internal_type,
&view->internal_bpp);
+ if (buffer->usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT ||
+ buffer->usage & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)
+ pack_texture_shader_state_from_buffer_view(device, view);
+
*pView = v3dv_buffer_view_to_handle(view);
return VK_SUCCESS;