shstate.type = PIPE_SHADER_IR_NIR;
shstate.ir.nir = b.shader;
device->noop_fs = device->queue.ctx->create_fs_state(device->queue.ctx, &shstate);
+ _mesa_hash_table_init(&device->bda, NULL, _mesa_hash_pointer, _mesa_key_pointer_equal);
+ simple_mtx_init(&device->bda_lock, mtx_plain);
*pDevice = lvp_device_to_handle(device);
if (device->queue.last_fence)
device->pscreen->fence_reference(device->pscreen, &device->queue.last_fence, NULL);
+ ralloc_free(device->bda.table);
+ simple_mtx_destroy(&device->bda_lock);
+
lvp_queue_finish(&device->queue);
vk_device_finish(&device->vk);
vk_free(&device->vk.alloc, device);
if (!_buffer)
return;
+ char *ptr = (char*)buffer->pmem + buffer->offset;
+ if (ptr) {
+ simple_mtx_lock(&device->bda_lock);
+ struct hash_entry *he = _mesa_hash_table_search(&device->bda, ptr);
+ if (he)
+ _mesa_hash_table_remove(&device->bda, he);
+ simple_mtx_unlock(&device->bda_lock);
+ }
pipe_resource_reference(&buffer->bo, NULL);
vk_object_base_finish(&buffer->base);
vk_free2(&device->vk.alloc, pAllocator, buffer);
}
VKAPI_ATTR VkDeviceAddress VKAPI_CALL lvp_GetBufferDeviceAddress(
- VkDevice device,
+ VkDevice _device,
const VkBufferDeviceAddressInfo* pInfo)
{
+ LVP_FROM_HANDLE(lvp_device, device, _device);
LVP_FROM_HANDLE(lvp_buffer, buffer, pInfo->buffer);
+ char *ptr = (char*)buffer->pmem + buffer->offset;
+ simple_mtx_lock(&device->bda_lock);
+ _mesa_hash_table_insert(&device->bda, ptr, buffer);
+ simple_mtx_unlock(&device->bda_lock);
- return (VkDeviceAddress)(uintptr_t)((char*)buffer->pmem + buffer->offset);
+ return (VkDeviceAddress)(uintptr_t)ptr;
}
VKAPI_ATTR uint64_t VKAPI_CALL lvp_GetBufferOpaqueCaptureAddress(