diff --git a/.pick_status.json b/.pick_status.json index 4db7cfabb7d..c7838197287 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2904,7 +2904,7 @@ "description": "lavapipe: Handle multiple planes in GetDescriptorEXT", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "a13a07d166ff8886d22991a230b0dec228d69dd5", "notes": null diff --git a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c index fa198f3e575..7e176a42324 100644 --- a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c +++ b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c @@ -1070,20 +1070,28 @@ 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->planes[0].sv); - desc->functions = iview->planes[0].texture_handle->functions; + unsigned plane_count = iview->plane_count; - if (info->sampler) { - LVP_FROM_HANDLE(lvp_sampler, sampler, info->sampler); - desc->sampler = sampler->desc.sampler; - desc->texture.sampler_index = sampler->desc.texture.sampler_index; - } else { - lp_jit_sampler_from_pipe(&desc->sampler, &sampler); - desc->texture.sampler_index = 0; + for (unsigned p = 0; p < plane_count; p++) { + lp_jit_texture_from_pipe(&desc[p].texture, iview->planes[p].sv); + desc[p].functions = iview->planes[p].texture_handle->functions; + + if (info->sampler) { + LVP_FROM_HANDLE(lvp_sampler, sampler, info->sampler); + desc[p].sampler = sampler->desc.sampler; + desc[p].texture.sampler_index = sampler->desc.texture.sampler_index; + } else { + lp_jit_sampler_from_pipe(&desc->sampler, &sampler); + desc[p].texture.sampler_index = 0; + } } } else { - desc->functions = device->null_texture_handle->functions; - desc->texture.sampler_index = 0; + unsigned plane_count = size / sizeof(struct lp_descriptor); + + for (unsigned p = 0; p < plane_count; p++) { + desc[p].functions = device->null_texture_handle->functions; + desc[p].texture.sampler_index = 0; + } } break; @@ -1092,11 +1100,20 @@ 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->planes[0].sv); - desc->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[p].texture, iview->planes[p].sv); + desc[p].functions = iview->planes[p].texture_handle->functions; + } } else { - desc->functions = device->null_texture_handle->functions; - desc->texture.sampler_index = 0; + unsigned plane_count = size / sizeof(struct lp_descriptor); + + for (unsigned p = 0; p < plane_count; p++) { + desc[p].functions = device->null_texture_handle->functions; + desc[p].texture.sampler_index = 0; + } } break; } @@ -1106,10 +1123,18 @@ 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->planes[0].iv); - desc->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[p].image, &iview->planes[p].iv); + desc[p].functions = iview->planes[p].image_handle->functions; + } } else { - desc->functions = device->null_image_handle->functions; + unsigned plane_count = size / sizeof(struct lp_descriptor); + + for (unsigned p = 0; p < plane_count; p++) + desc[p].functions = device->null_image_handle->functions; } break; }