#include "util/u_math.h"
#include "util/u_inlines.h"
+static bool
+binding_has_immutable_samplers(const VkDescriptorSetLayoutBinding *binding)
+{
+ switch (binding->descriptorType) {
+ case VK_DESCRIPTOR_TYPE_SAMPLER:
+ case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+ return binding->pImmutableSamplers != NULL;
+
+ default:
+ return false;
+ }
+}
+
static void
lvp_descriptor_set_layout_destroy(struct vk_device *_device, struct vk_descriptor_set_layout *_layout)
{
* We need to be careful here and only parse pImmutableSamplers if we
* have one of the right descriptor types.
*/
- VkDescriptorType desc_type = pCreateInfo->pBindings[j].descriptorType;
- if ((desc_type == VK_DESCRIPTOR_TYPE_SAMPLER ||
- desc_type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) &&
- pCreateInfo->pBindings[j].pImmutableSamplers)
+ if (binding_has_immutable_samplers(&pCreateInfo->pBindings[j]))
immutable_sampler_count += pCreateInfo->pBindings[j].descriptorCount;
}
set_layout->binding[b].uniform_block_offset = 0;
set_layout->binding[b].uniform_block_size = 0;
- set_layout->size += descriptor_count;
-
if (binding->descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC ||
binding->descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC) {
set_layout->binding[b].dynamic_index = dynamic_offset_count;
dynamic_offset_count += binding->descriptorCount;
}
- switch (binding->descriptorType) {
- case VK_DESCRIPTOR_TYPE_SAMPLER:
- case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
- if (binding->pImmutableSamplers) {
- set_layout->binding[b].immutable_samplers = samplers;
- samplers += binding->descriptorCount;
-
- for (uint32_t i = 0; i < binding->descriptorCount; i++) {
- if (binding->pImmutableSamplers[i])
- set_layout->binding[b].immutable_samplers[i] =
- lvp_sampler_from_handle(binding->pImmutableSamplers[i]);
- else
- set_layout->binding[b].immutable_samplers[i] = NULL;
- }
+
+ uint8_t max_plane_count = 1;
+ if (binding_has_immutable_samplers(binding)) {
+ set_layout->binding[b].immutable_samplers = samplers;
+ samplers += binding->descriptorCount;
+
+ for (uint32_t i = 0; i < binding->descriptorCount; i++) {
+ VK_FROM_HANDLE(lvp_sampler, sampler, binding->pImmutableSamplers[i]);
+ set_layout->binding[b].immutable_samplers[i] = sampler;
+ const uint8_t sampler_plane_count = sampler->vk.ycbcr_conversion ?
+ vk_format_get_plane_count(sampler->vk.ycbcr_conversion->state.format) : 1;
+ if (max_plane_count < sampler_plane_count)
+ max_plane_count = sampler_plane_count;
}
- break;
- default:
- break;
}
+ set_layout->binding[b].stride = max_plane_count;
+ set_layout->size += descriptor_count * max_plane_count;
+
switch (binding->descriptorType) {
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
desc += bind_layout->descriptor_index;
for (uint32_t sampler_index = 0; sampler_index < bind_layout->array_size; sampler_index++) {
- if (bind_layout->immutable_samplers[sampler_index])
- desc[sampler_index] = bind_layout->immutable_samplers[sampler_index]->desc;
+ if (bind_layout->immutable_samplers[sampler_index]) {
+ for (uint32_t s = 0; s < bind_layout->stride; s++) {
+ int idx = sampler_index * bind_layout->stride + s;
+ desc[idx] = bind_layout->immutable_samplers[sampler_index]->desc;
+ }
+ }
}
}
}
struct lp_descriptor *desc = set->map;
- desc += bind_layout->descriptor_index + write->dstArrayElement;
+ desc += bind_layout->descriptor_index + (write->dstArrayElement * bind_layout->stride);
switch (write->descriptorType) {
case VK_DESCRIPTOR_TYPE_SAMPLER:
if (!bind_layout->immutable_samplers) {
for (uint32_t j = 0; j < write->descriptorCount; j++) {
LVP_FROM_HANDLE(lvp_sampler, sampler, write->pImageInfo[j].sampler);
+ uint32_t didx = j * bind_layout->stride;
- desc[j].sampler = sampler->desc.sampler;
- desc[j].sampler_index = sampler->desc.sampler_index;
+ for (unsigned k = 0; k < bind_layout->stride; k++) {
+ desc[didx + k].sampler = sampler->desc.sampler;
+ desc[didx + k].sampler_index = sampler->desc.sampler_index;
+ }
}
}
break;
for (uint32_t j = 0; j < write->descriptorCount; j++) {
LVP_FROM_HANDLE(lvp_image_view, iview,
write->pImageInfo[j].imageView);
+ uint32_t didx = j * bind_layout->stride;
if (iview) {
- lp_jit_texture_from_pipe(&desc[j].texture, iview->planes[0].sv);
- desc[j].functions = iview->planes[0].texture_handle->functions;
+ unsigned plane_count = iview->plane_count;
+
+ for (unsigned p = 0; p < plane_count; p++) {
+ lp_jit_texture_from_pipe(&desc[didx + p].texture, iview->planes[p].sv);
+ desc[didx + p].functions = iview->planes[p].texture_handle->functions;
+ }
if (!bind_layout->immutable_samplers) {
LVP_FROM_HANDLE(lvp_sampler, sampler,
write->pImageInfo[j].sampler);
- desc[j].sampler = sampler->desc.sampler;
- desc[j].sampler_index = sampler->desc.sampler_index;
+ for (unsigned p = 0; p < plane_count; p++) {
+ desc[didx + p].sampler = sampler->desc.sampler;
+ desc[didx + p].sampler_index = sampler->desc.sampler_index;
+ }
}
} else {
- desc[j].functions = device->null_texture_handle->functions;
- desc[j].sampler_index = 0;
+ for (unsigned k = 0; k < bind_layout->stride; k++) {
+ desc[didx + k].functions = device->null_texture_handle->functions;
+ desc[didx + k].sampler_index = 0;
+ }
}
}
break;
for (uint32_t j = 0; j < write->descriptorCount; j++) {
LVP_FROM_HANDLE(lvp_image_view, iview,
write->pImageInfo[j].imageView);
-
+ uint32_t didx = j * bind_layout->stride;
if (iview) {
- lp_jit_texture_from_pipe(&desc[j].texture, iview->planes[0].sv);
- desc[j].functions = iview->planes[0].texture_handle->functions;
+ unsigned plane_count = iview->plane_count;
+
+ for (unsigned p = 0; p < plane_count; p++) {
+ lp_jit_texture_from_pipe(&desc[didx + p].texture, iview->planes[p].sv);
+ desc[didx + p].functions = iview->planes[p].texture_handle->functions;
+ }
} else {
- desc[j].functions = device->null_texture_handle->functions;
- desc[j].sampler_index = 0;
+ for (unsigned k = 0; k < bind_layout->stride; k++) {
+ desc[didx + k].functions = device->null_texture_handle->functions;
+ desc[didx + k].sampler_index = 0;
+ }
}
}
break;
for (uint32_t j = 0; j < write->descriptorCount; j++) {
LVP_FROM_HANDLE(lvp_image_view, iview,
write->pImageInfo[j].imageView);
-
+ uint32_t didx = j * bind_layout->stride;
if (iview) {
- lp_jit_image_from_pipe(&desc[j].image, &iview->planes[0].iv);
- desc[j].functions = iview->planes[0].image_handle->functions;
+ unsigned plane_count = iview->plane_count;
+
+ for (unsigned p = 0; p < plane_count; p++) {
+ lp_jit_image_from_pipe(&desc[didx + p].image, &iview->planes[p].iv);
+ desc[didx + p].functions = iview->planes[p].image_handle->functions;
+ }
} else {
- desc[j].functions = device->null_image_handle->functions;
+ for (unsigned k = 0; k < bind_layout->stride; k++)
+ desc[didx + k].functions = device->null_image_handle->functions;
}
}
break;
for (uint32_t j = 0; j < write->descriptorCount; j++) {
LVP_FROM_HANDLE(lvp_buffer_view, bview,
write->pTexelBufferView[j]);
-
+ assert(bind_layout->stride == 1);
if (bview) {
lp_jit_texture_from_pipe(&desc[j].texture, bview->sv);
desc[j].functions = bview->texture_handle->functions;
for (uint32_t j = 0; j < write->descriptorCount; j++) {
LVP_FROM_HANDLE(lvp_buffer_view, bview,
write->pTexelBufferView[j]);
-
+ assert(bind_layout->stride == 1);
if (bview) {
lp_jit_image_from_pipe(&desc[j].image, &bview->iv);
desc[j].functions = bview->image_handle->functions;
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
for (uint32_t j = 0; j < write->descriptorCount; j++) {
LVP_FROM_HANDLE(lvp_buffer, buffer, write->pBufferInfo[j].buffer);
-
+ assert(bind_layout->stride == 1);
if (buffer) {
struct pipe_constant_buffer ubo = {
.buffer = buffer->bo,
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
for (uint32_t j = 0; j < write->descriptorCount; j++) {
LVP_FROM_HANDLE(lvp_buffer, buffer, write->pBufferInfo[j].buffer);
-
+ assert(bind_layout->stride == 1);
if (buffer) {
struct pipe_shader_buffer ubo = {
.buffer = buffer->bo,
for (j = 0; j < entry->descriptorCount; ++j) {
unsigned idx = j + entry->dstArrayElement;
+
+ idx *= bind_layout->stride;
switch (entry->descriptorType) {
case VK_DESCRIPTOR_TYPE_SAMPLER: {
LVP_FROM_HANDLE(lvp_sampler, sampler,
*(VkSampler *)pSrc);
- desc[idx].sampler = sampler->desc.sampler;
- desc[idx].sampler_index = sampler->desc.sampler_index;
+ for (unsigned k = 0; k < bind_layout->stride; k++) {
+ desc[idx + k].sampler = sampler->desc.sampler;
+ desc[idx + k].sampler_index = sampler->desc.sampler_index;
+ }
break;
}
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: {
LVP_FROM_HANDLE(lvp_image_view, iview, info->imageView);
if (iview) {
- lp_jit_texture_from_pipe(&desc[idx].texture, iview->planes[0].sv);
- desc[idx].functions = iview->planes[0].texture_handle->functions;
+ for (unsigned p = 0; p < iview->plane_count; p++) {
+ lp_jit_texture_from_pipe(&desc[idx + p].texture, iview->planes[p].sv);
+ desc[idx + p].functions = iview->planes[p].texture_handle->functions;
+ }
if (!bind_layout->immutable_samplers) {
LVP_FROM_HANDLE(lvp_sampler, sampler, info->sampler);
- desc[idx].sampler = sampler->desc.sampler;
- desc[idx].sampler_index = sampler->desc.sampler_index;
+ for (unsigned p = 0; p < iview->plane_count; p++) {
+ desc[idx + p].sampler = sampler->desc.sampler;
+ desc[idx + p].sampler_index = sampler->desc.sampler_index;
+ }
}
} else {
- desc[j].functions = device->null_texture_handle->functions;
- desc[j].sampler_index = 0;
+ for (unsigned k = 0; k < bind_layout->stride; k++) {
+ desc[idx + k].functions = device->null_texture_handle->functions;
+ desc[idx + k].sampler_index = 0;
+ }
}
break;
}
LVP_FROM_HANDLE(lvp_image_view, iview, info->imageView);
if (iview) {
- lp_jit_texture_from_pipe(&desc[idx].texture, iview->planes[0].sv);
- desc[idx].functions = iview->planes[0].texture_handle->functions;
+ for (unsigned p = 0; p < iview->plane_count; p++) {
+ lp_jit_texture_from_pipe(&desc[idx + p].texture, iview->planes[p].sv);
+ desc[idx + p].functions = iview->planes[p].texture_handle->functions;
+ }
} else {
- desc[j].functions = device->null_texture_handle->functions;
- desc[j].sampler_index = 0;
+ for (unsigned k = 0; k < bind_layout->stride; k++) {
+ desc[idx + k].functions = device->null_texture_handle->functions;
+ desc[idx + k].sampler_index = 0;
+ }
}
break;
}
((VkDescriptorImageInfo *)pSrc)->imageView);
if (iview) {
- lp_jit_image_from_pipe(&desc[idx].image, &iview->planes[0].iv);
- desc[idx].functions = iview->planes[0].image_handle->functions;
+ for (unsigned p = 0; p < iview->plane_count; p++) {
+ lp_jit_image_from_pipe(&desc[idx + p].image, &iview->planes[p].iv);
+ desc[idx + p].functions = iview->planes[p].image_handle->functions;
+ }
} else {
- desc[idx].functions = device->null_image_handle->functions;
+ for (unsigned k = 0; k < bind_layout->stride; k++)
+ desc[idx + k].functions = device->null_image_handle->functions;
}
break;
}
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: {
LVP_FROM_HANDLE(lvp_buffer_view, bview,
*(VkBufferView *)pSrc);
-
+ assert(bind_layout->stride == 1);
if (bview) {
lp_jit_texture_from_pipe(&desc[idx].texture, bview->sv);
desc[idx].functions = bview->texture_handle->functions;
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: {
LVP_FROM_HANDLE(lvp_buffer_view, bview,
*(VkBufferView *)pSrc);
-
+ assert(bind_layout->stride == 1);
if (bview) {
lp_jit_image_from_pipe(&desc[idx].image, &bview->iv);
desc[idx].functions = bview->image_handle->functions;
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: {
VkDescriptorBufferInfo *info = (VkDescriptorBufferInfo *)pSrc;
LVP_FROM_HANDLE(lvp_buffer, buffer, info->buffer);
-
+ assert(bind_layout->stride == 1);
if (buffer) {
struct pipe_constant_buffer ubo = {
.buffer = buffer->bo,
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: {
VkDescriptorBufferInfo *info = (VkDescriptorBufferInfo *)pSrc;
LVP_FROM_HANDLE(lvp_buffer, buffer, info->buffer);
+ assert(bind_layout->stride == 1);
if (buffer) {
struct pipe_shader_buffer ubo = {