VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER = 43,
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER = 44,
VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO = 45,
- VK_STRUCTURE_TYPE_UPDATE_SAMPLERS = 46,
- VK_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES = 47,
- VK_STRUCTURE_TYPE_UPDATE_IMAGES = 48,
- VK_STRUCTURE_TYPE_UPDATE_BUFFERS = 49,
- VK_STRUCTURE_TYPE_UPDATE_AS_COPY = 50,
VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO = 51,
VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO = 52,
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
+ VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET,
VK_ENUM_RANGE(STRUCTURE_TYPE, APPLICATION_INFO, PIPELINE_LAYOUT_CREATE_INFO)
} VkStructureType;
const VkDescriptorTypeCount* pTypeCount;
} VkDescriptorPoolCreateInfo;
+typedef struct {
+ VkBufferView bufferView;
+ VkSampler sampler;
+ VkImageView imageView;
+ VkImageLayout imageLayout;
+} VkDescriptorInfo;
+
+typedef struct {
+ VkStructureType sType;
+ const void* pNext;
+ VkDescriptorSet destSet;
+ uint32_t destBinding;
+ uint32_t destArrayElement;
+ uint32_t count;
+ VkDescriptorType descriptorType;
+ const VkDescriptorInfo* pDescriptors;
+} VkWriteDescriptorSet;
+
+typedef struct {
+ VkStructureType sType;
+ const void* pNext;
+ VkDescriptorSet srcSet;
+ uint32_t srcBinding;
+ uint32_t srcArrayElement;
+ VkDescriptorSet destSet;
+ uint32_t destBinding;
+ uint32_t destArrayElement;
+ uint32_t count;
+} VkCopyDescriptorSet;
+
typedef struct {
float originX;
float originY;
VkMemoryInputFlags inputMask;
} VkMemoryBarrier;
-typedef struct {
- VkStructureType sType;
- const void* pNext;
- VkBufferView view;
-} VkBufferViewAttachInfo;
-
-typedef struct {
- VkStructureType sType;
- const void* pNext;
- VkImageView view;
- VkImageLayout layout;
-} VkImageViewAttachInfo;
-
-typedef struct {
- VkStructureType sType;
- const void* pNext;
- uint32_t binding;
- uint32_t arrayIndex;
- uint32_t count;
- const VkSampler* pSamplers;
-} VkUpdateSamplers;
-
-typedef struct {
- VkSampler sampler;
- const VkImageViewAttachInfo* pImageView;
-} VkSamplerImageViewInfo;
-
-typedef struct {
- VkStructureType sType;
- const void* pNext;
- uint32_t binding;
- uint32_t arrayIndex;
- uint32_t count;
- const VkSamplerImageViewInfo* pSamplerImageViews;
-} VkUpdateSamplerTextures;
-
-typedef struct {
- VkStructureType sType;
- const void* pNext;
- VkDescriptorType descriptorType;
- uint32_t binding;
- uint32_t arrayIndex;
- uint32_t count;
- const VkImageViewAttachInfo* pImageViews;
-} VkUpdateImages;
-
-typedef struct {
- VkStructureType sType;
- const void* pNext;
- VkDescriptorType descriptorType;
- uint32_t binding;
- uint32_t arrayIndex;
- uint32_t count;
- const VkBufferViewAttachInfo* pBufferViews;
-} VkUpdateBuffers;
-
-typedef struct {
- VkStructureType sType;
- const void* pNext;
- VkDescriptorType descriptorType;
- VkDescriptorSet descriptorSet;
- uint32_t binding;
- uint32_t arrayElement;
- uint32_t count;
-} VkUpdateAsCopy;
-
typedef struct {
VkStructureType sType;
const void* pNext;
typedef VkResult (VKAPI *PFN_vkCreateDescriptorPool)(VkDevice device, VkDescriptorPoolUsage poolUsage, uint32_t maxSets, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool);
typedef VkResult (VKAPI *PFN_vkResetDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool);
typedef VkResult (VKAPI *PFN_vkAllocDescriptorSets)(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorSetUsage setUsage, uint32_t count, const VkDescriptorSetLayout* pSetLayouts, VkDescriptorSet* pDescriptorSets, uint32_t* pCount);
-typedef void (VKAPI *PFN_vkUpdateDescriptors)(VkDevice device, VkDescriptorSet descriptorSet, uint32_t updateCount, const void** ppUpdateArray);
+typedef VkResult (VKAPI *PFN_vkUpdateDescriptorSets)(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies);
typedef VkResult (VKAPI *PFN_vkCreateDynamicViewportState)(VkDevice device, const VkDynamicVpStateCreateInfo* pCreateInfo, VkDynamicVpState* pState);
typedef VkResult (VKAPI *PFN_vkCreateDynamicRasterState)(VkDevice device, const VkDynamicRsStateCreateInfo* pCreateInfo, VkDynamicRsState* pState);
typedef VkResult (VKAPI *PFN_vkCreateDynamicColorBlendState)(VkDevice device, const VkDynamicCbStateCreateInfo* pCreateInfo, VkDynamicCbState* pState);
VkDescriptorSet* pDescriptorSets,
uint32_t* pCount);
-void VKAPI vkUpdateDescriptors(
+VkResult VKAPI vkUpdateDescriptorSets(
VkDevice device,
- VkDescriptorSet descriptorSet,
- uint32_t updateCount,
- const void** ppUpdateArray);
+ uint32_t writeCount,
+ const VkWriteDescriptorSet* pDescriptorWrites,
+ uint32_t copyCount,
+ const VkCopyDescriptorSet* pDescriptorCopies);
VkResult VKAPI vkCreateDynamicViewportState(
VkDevice device,
return VK_SUCCESS;
}
-void anv_UpdateDescriptors(
- VkDevice _device,
- VkDescriptorSet descriptorSet,
- uint32_t updateCount,
- const void** ppUpdateArray)
+VkResult anv_UpdateDescriptorSets(
+ VkDevice device,
+ uint32_t writeCount,
+ const VkWriteDescriptorSet* pDescriptorWrites,
+ uint32_t copyCount,
+ const VkCopyDescriptorSet* pDescriptorCopies)
{
- struct anv_descriptor_set *set = (struct anv_descriptor_set *) descriptorSet;
- VkUpdateSamplers *update_samplers;
- VkUpdateSamplerTextures *update_sampler_textures;
- VkUpdateImages *update_images;
- VkUpdateBuffers *update_buffers;
- VkUpdateAsCopy *update_as_copy;
-
- for (uint32_t i = 0; i < updateCount; i++) {
- const struct anv_common *common = ppUpdateArray[i];
-
- switch (common->sType) {
- case VK_STRUCTURE_TYPE_UPDATE_SAMPLERS:
- update_samplers = (VkUpdateSamplers *) common;
+ for (uint32_t i = 0; i < writeCount; i++) {
+ const VkWriteDescriptorSet *write = &pDescriptorWrites[i];
+ ANV_FROM_HANDLE(anv_descriptor_set, set, write->destSet);
- for (uint32_t j = 0; j < update_samplers->count; j++) {
- set->descriptors[update_samplers->binding + j].sampler =
- (struct anv_sampler *) update_samplers->pSamplers[j];
+ switch (write->descriptorType) {
+ case VK_DESCRIPTOR_TYPE_SAMPLER:
+ case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+ for (uint32_t j = 0; j < write->count; j++) {
+ set->descriptors[write->destBinding + j].sampler =
+ (struct anv_sampler *) write->pDescriptors[j].sampler;
}
- break;
- case VK_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
- /* FIXME: Shouldn't this be *_UPDATE_SAMPLER_IMAGES? */
- update_sampler_textures = (VkUpdateSamplerTextures *) common;
-
- for (uint32_t j = 0; j < update_sampler_textures->count; j++) {
- set->descriptors[update_sampler_textures->binding + j].view =
- (struct anv_surface_view *)
- update_sampler_textures->pSamplerImageViews[j].pImageView->view;
- set->descriptors[update_sampler_textures->binding + j].sampler =
- (struct anv_sampler *)
- update_sampler_textures->pSamplerImageViews[j].sampler;
- }
- break;
+ if (write->descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER)
+ break;
- case VK_STRUCTURE_TYPE_UPDATE_IMAGES:
- update_images = (VkUpdateImages *) common;
+ /* fallthrough */
- for (uint32_t j = 0; j < update_images->count; j++) {
- set->descriptors[update_images->binding + j].view =
- (struct anv_surface_view *) update_images->pImageViews[j].view;
+ case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+ case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ for (uint32_t j = 0; j < write->count; j++) {
+ set->descriptors[write->destBinding + j].view =
+ (struct anv_surface_view *) write->pDescriptors[j].imageView;
}
break;
- case VK_STRUCTURE_TYPE_UPDATE_BUFFERS:
- update_buffers = (VkUpdateBuffers *) common;
-
- for (uint32_t j = 0; j < update_buffers->count; j++) {
- set->descriptors[update_buffers->binding + j].view =
- (struct anv_surface_view *) update_buffers->pBufferViews[j].view;
- }
- /* FIXME: descriptor arrays? */
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+ anv_finishme("texel buffers not implemented");
break;
- case VK_STRUCTURE_TYPE_UPDATE_AS_COPY:
- update_as_copy = (VkUpdateAsCopy *) common;
- (void) update_as_copy;
- break;
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
+ for (uint32_t j = 0; j < write->count; j++) {
+ set->descriptors[write->destBinding + j].view =
+ (struct anv_surface_view *) write->pDescriptors[j].bufferView;
+ }
default:
break;
}
}
+
+ for (uint32_t i = 0; i < copyCount; i++) {
+ const VkCopyDescriptorSet *copy = &pDescriptorCopies[i];
+ ANV_FROM_HANDLE(anv_descriptor_set, src, copy->destSet);
+ ANV_FROM_HANDLE(anv_descriptor_set, dest, copy->destSet);
+ for (uint32_t j = 0; j < copy->count; j++) {
+ dest->descriptors[copy->destBinding + j] =
+ src->descriptors[copy->srcBinding + j];
+ }
+ }
+
+ return VK_SUCCESS;
}
// State object functions
anv_AllocDescriptorSets((VkDevice) device, 0 /* pool */,
VK_DESCRIPTOR_SET_USAGE_ONE_SHOT,
1, &device->meta_state.blit.ds_layout, &set, &count);
- anv_UpdateDescriptors((VkDevice) device, set, 1,
- (const void * []) {
- &(VkUpdateImages) {
- .sType = VK_STRUCTURE_TYPE_UPDATE_IMAGES,
- .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
- .binding = 0,
+ anv_UpdateDescriptorSets((VkDevice) device,
+ 1, /* writeCount */
+ (VkWriteDescriptorSet[]) {
+ {
+ .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
+ .destSet = set,
+ .destBinding = 0,
+ .destArrayElement = 0,
.count = 1,
- .pImageViews = (VkImageViewAttachInfo[]) {
+ .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
+ .pDescriptors = (VkDescriptorInfo[]) {
{
- .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO,
- .view = (VkImageView) src,
- .layout = VK_IMAGE_LAYOUT_GENERAL,
- }
+ .imageView = (VkImageView) src,
+ .imageLayout = VK_IMAGE_LAYOUT_GENERAL
+ },
}
}
- });
+ }, 0, NULL);
struct anv_framebuffer *fb;
anv_CreateFramebuffer((VkDevice) device,