* IN THE SOFTWARE.
*/
-#include <dlfcn.h>
#include <assert.h>
#include <stdbool.h>
#include <string.h>
#include <sys/mman.h>
-#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include "anv_private.h"
#include "util/strtod.h"
#include "util/debug.h"
+#include "util/build_id.h"
+#include "util/vk_util.h"
#include "genxml/gen7_pack.h"
va_end(args);
}
-static bool
-anv_get_function_timestamp(void *ptr, uint32_t* timestamp)
-{
- Dl_info info;
- struct stat st;
- if (!dladdr(ptr, &info) || !info.dli_fname)
- return false;
-
- if (stat(info.dli_fname, &st))
- return false;
-
- *timestamp = st.st_mtim.tv_sec;
- return true;
-}
-
static bool
anv_device_get_cache_uuid(void *uuid)
{
- uint32_t timestamp;
+ const struct build_id_note *note = build_id_find_nhdr("libvulkan_intel.so");
+ if (!note)
+ return false;
- memset(uuid, 0, VK_UUID_SIZE);
- if (!anv_get_function_timestamp(anv_device_get_cache_uuid, ×tamp))
+ unsigned len = build_id_length(note);
+ if (len < VK_UUID_SIZE)
return false;
- snprintf(uuid, VK_UUID_SIZE, "anv-%d", timestamp);
+ build_id_read(note, uuid, VK_UUID_SIZE);
return true;
}
isl_device_init(&device->isl_dev, &device->info, swizzled);
- close(fd);
+ device->local_fd = fd;
return VK_SUCCESS;
fail:
{
anv_finish_wsi(device);
ralloc_free(device->compiler);
+ close(device->local_fd);
}
static const VkExtensionProperties global_extensions[] = {
.extensionName = VK_KHR_MAINTENANCE1_EXTENSION_NAME,
.specVersion = 1,
},
+ {
+ .extensionName = VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME,
+ .specVersion = 1,
+ }
};
static void *
.shaderStorageImageExtendedFormats = true,
.shaderStorageImageMultisample = false,
.shaderStorageImageReadWithoutFormat = false,
- .shaderStorageImageWriteWithoutFormat = false,
+ .shaderStorageImageWriteWithoutFormat = true,
.shaderUniformBufferArrayDynamicIndexing = true,
.shaderSampledImageArrayDynamicIndexing = true,
.shaderStorageBufferArrayDynamicIndexing = true,
{
anv_GetPhysicalDeviceFeatures(physicalDevice, &pFeatures->features);
- for (struct anv_common *c = pFeatures->pNext; c != NULL; c = c->pNext) {
- switch (c->sType) {
+ vk_foreach_struct(ext, pFeatures->pNext) {
+ switch (ext->sType) {
default:
- anv_debug_ignored_stype(c->sType);
+ anv_debug_ignored_stype(ext->sType);
break;
}
}
.maxDescriptorSetSampledImages = 256,
.maxDescriptorSetStorageImages = 256,
.maxDescriptorSetInputAttachments = 256,
- .maxVertexInputAttributes = 32,
- .maxVertexInputBindings = 32,
+ .maxVertexInputAttributes = MAX_VBS,
+ .maxVertexInputBindings = MAX_VBS,
.maxVertexInputAttributeOffset = 2047,
.maxVertexInputBindingStride = 2048,
.maxVertexOutputComponents = 128,
{
anv_GetPhysicalDeviceProperties(physicalDevice, &pProperties->properties);
- for (struct anv_common *c = pProperties->pNext; c != NULL; c = c->pNext) {
- switch (c->sType) {
+ vk_foreach_struct(ext, pProperties->pNext) {
+ switch (ext->sType) {
default:
- anv_debug_ignored_stype(c->sType);
+ anv_debug_ignored_stype(ext->sType);
break;
}
}
anv_get_queue_family_properties(phys_dev,
&pQueueFamilyProperties->queueFamilyProperties);
- for (struct anv_common *c = pQueueFamilyProperties->pNext;
- c != NULL; c = c->pNext) {
- switch (c->sType) {
+ vk_foreach_struct(ext, pQueueFamilyProperties->pNext) {
+ switch (ext->sType) {
default:
- anv_debug_ignored_stype(c->sType);
+ anv_debug_ignored_stype(ext->sType);
break;
}
}
anv_GetPhysicalDeviceMemoryProperties(physicalDevice,
&pMemoryProperties->memoryProperties);
- for (struct anv_common *c = pMemoryProperties->pNext;
- c != NULL; c = c->pNext) {
- switch (c->sType) {
+ vk_foreach_struct(ext, pMemoryProperties->pNext) {
+ switch (ext->sType) {
default:
- anv_debug_ignored_stype(c->sType);
+ anv_debug_ignored_stype(ext->sType);
break;
}
}
}
void anv_GetBufferMemoryRequirements(
- VkDevice device,
+ VkDevice _device,
VkBuffer _buffer,
VkMemoryRequirements* pMemoryRequirements)
{
ANV_FROM_HANDLE(anv_buffer, buffer, _buffer);
+ ANV_FROM_HANDLE(anv_device, device, _device);
/* The Vulkan spec (git aaed022) says:
*
* only if the memory type `i` in the VkPhysicalDeviceMemoryProperties
* structure for the physical device is supported.
*
- * We support exactly one memory type.
+ * We support exactly one memory type on LLC, two on non-LLC.
*/
- pMemoryRequirements->memoryTypeBits = 1;
+ pMemoryRequirements->memoryTypeBits = device->info.has_llc ? 1 : 3;
pMemoryRequirements->size = buffer->size;
pMemoryRequirements->alignment = 16;
}
void anv_GetImageMemoryRequirements(
- VkDevice device,
+ VkDevice _device,
VkImage _image,
VkMemoryRequirements* pMemoryRequirements)
{
ANV_FROM_HANDLE(anv_image, image, _image);
+ ANV_FROM_HANDLE(anv_device, device, _device);
/* The Vulkan spec (git aaed022) says:
*
* only if the memory type `i` in the VkPhysicalDeviceMemoryProperties
* structure for the physical device is supported.
*
- * We support exactly one memory type.
+ * We support exactly one memory type on LLC, two on non-LLC.
*/
- pMemoryRequirements->memoryTypeBits = 1;
+ pMemoryRequirements->memoryTypeBits = device->info.has_llc ? 1 : 3;
pMemoryRequirements->size = image->size;
pMemoryRequirements->alignment = image->alignment;