finish query functions in Vulkan
This commit is contained in:
@@ -11,6 +11,8 @@ gryphnInstanceFunctionLayers loadVulkanAPILayer(void) {
|
||||
.destroyInstance = vulkanDestroyInstance,
|
||||
.queryDevices = vulkanQueryDevices,
|
||||
.getPhysicalDeviceProperties = vulkanQueryPhysicalDeviceProperties,
|
||||
.getPhysicalDeviceFeatures = vulkanQueryPhysicalDeviceFeatures,
|
||||
.getPhysicalDeviceLimits = vulkanQueryPhysicalDeviceLimits,
|
||||
.next = NULL
|
||||
};
|
||||
}
|
||||
|
@@ -25,8 +25,99 @@ gnPhysicalDeviceProperties vulkanQueryPhysicalDeviceProperties(gnInstance instan
|
||||
};
|
||||
}
|
||||
|
||||
gnMultisampleCountFlags vkSampleCountToGryphn(VkSampleCountFlags counts) {
|
||||
gnMultisampleCountFlags sampleCount = 0;
|
||||
gnPhysicalDeviceFeatures vulkanQueryPhysicalDeviceFeatures(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers) {
|
||||
VkPhysicalDeviceFeatures features;
|
||||
vkGetPhysicalDeviceFeatures((VkPhysicalDevice)device, &features);
|
||||
return (gnPhysicalDeviceFeatures){
|
||||
.uint32Index = features.fullDrawIndexUint32,
|
||||
.geometryShader = features.geometryShader,
|
||||
.tessellationShader = features.tessellationShader,
|
||||
.multiDrawIndirect = features.multiDrawIndirect,
|
||||
.drawIndirectFirstInstance = features.drawIndirectFirstInstance,
|
||||
.fillModeNonSolid = features.fillModeNonSolid,
|
||||
.wideLines = features.wideLines,
|
||||
.largePoints = features.largePoints,
|
||||
.samplerAnisotropy = features.samplerAnisotropy
|
||||
};
|
||||
}
|
||||
gnPhysicalDeviceLimits vulkanQueryPhysicalDeviceLimits(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers) {
|
||||
VkPhysicalDeviceProperties properties;
|
||||
vkGetPhysicalDeviceProperties((VkPhysicalDevice)device, &properties);
|
||||
VkPhysicalDeviceLimits limits = properties.limits;
|
||||
return (gnPhysicalDeviceLimits) {
|
||||
.maxImageExtent1D = limits.maxImageDimension1D,
|
||||
.maxImageExtent2D = limits.maxImageDimension2D,
|
||||
.maxImageExtent3D = limits.maxImageDimension3D,
|
||||
.maxImageExtentCube = limits.maxImageDimensionCube,
|
||||
.maxImageArrayLayers = limits.maxImageArrayLayers,
|
||||
.maxTexelBufferElements = limits.maxTexelBufferElements,
|
||||
.maxUniformBufferRange = limits.maxUniformBufferRange,
|
||||
.maxStorageBufferRange = limits.maxStorageBufferRange,
|
||||
.maxPushConstantsSize = limits.maxPushConstantsSize,
|
||||
.maxMemoryAllocationCount = limits.maxMemoryAllocationCount,
|
||||
.maxSamplerAllocationCount = limits.maxSamplerAllocationCount,
|
||||
.maxBoundUniforms = limits.maxBoundDescriptorSets,
|
||||
.maxPerStageUniformSamplers = limits.maxPerStageDescriptorSamplers,
|
||||
.maxPerStageUniformUniformBuffers = limits.maxPerStageDescriptorUniformBuffers,
|
||||
.maxPerStageUniformStorageBuffers = limits.maxPerStageDescriptorStorageBuffers,
|
||||
.maxPerStageUniformSampledImages = limits.maxPerStageDescriptorSampledImages,
|
||||
.maxPerStageUniformStorageImages = limits.maxPerStageDescriptorStorageBuffers,
|
||||
.maxPerStageUniformInputAttachments = limits.maxPerStageDescriptorInputAttachments,
|
||||
.maxPerStageResources = limits.maxPerStageResources,
|
||||
.maxUniformSamplers = limits.maxPerStageDescriptorSamplers,
|
||||
.maxUniformUniformBuffers = limits.maxDescriptorSetUniformBuffers,
|
||||
.maxUniformUniformBuffersDynamic = limits.maxDescriptorSetUniformBuffersDynamic,
|
||||
.maxUniformStorageBuffers = limits.maxDescriptorSetStorageBuffers,
|
||||
.maxUniformStorageBuffersDynamic = limits.maxDescriptorSetStorageBuffersDynamic,
|
||||
.maxUniformSampledImages = limits.maxDescriptorSetSampledImages,
|
||||
.maxUniformStorageImages = limits.maxPerStageDescriptorStorageImages,
|
||||
.maxUniformInputAttachments = limits.maxDescriptorSetInputAttachments,
|
||||
.maxVertexInputAttributes = limits.maxVertexInputAttributes,
|
||||
.maxVertexInputBindings = limits.maxVertexInputBindings,
|
||||
.maxVertexInputAttributeOffset = limits.maxVertexInputAttributeOffset,
|
||||
.maxVertexInputBindingStride = limits.maxVertexInputBindingStride,
|
||||
.maxVertexOutputComponents = limits.maxVertexOutputComponents,
|
||||
.maxTessellationGenerationLevel = limits.maxTessellationGenerationLevel,
|
||||
.maxTessellationPatchSize = limits.maxTessellationPatchSize,
|
||||
.maxTessellationControlPerVertexInputComponents = limits.maxTessellationControlPerVertexInputComponents,
|
||||
.maxTessellationControlPerVertexOutputComponents = limits.maxTessellationControlPerVertexOutputComponents,
|
||||
.maxTessellationControlPerPatchOutputComponents = limits.maxTessellationControlPerPatchOutputComponents,
|
||||
.maxTessellationControlTotalOutputComponents = limits.maxTessellationControlTotalOutputComponents,
|
||||
.maxTessellationEvaluationInputComponents = limits.maxTessellationEvaluationInputComponents,
|
||||
.maxTessellationEvaluationOutputComponents = limits.maxTessellationControlPerVertexOutputComponents,
|
||||
.maxGeometryShaderInvocations = limits.maxGeometryShaderInvocations,
|
||||
.maxGeometryInputComponents = limits.maxGeometryInputComponents,
|
||||
.maxGeometryOutputComponents = limits.maxGeometryOutputComponents,
|
||||
.maxGeometryOutputVertices = limits.maxGeometryOutputVertices,
|
||||
.maxGeometryTotalOutputComponents = limits.maxGeometryTotalOutputComponents,
|
||||
.maxFragmentInputComponents = limits.maxFragmentInputComponents,
|
||||
.maxFragmentOutputAttachments = limits.maxFragmentOutputAttachments,
|
||||
.maxFragmentDualSrcAttachments = limits.maxFragmentDualSrcAttachments,
|
||||
.maxFragmentCombinedOutputResources = limits.maxFragmentCombinedOutputResources,
|
||||
.maxDrawIndexedIndexValue = limits.maxDrawIndexedIndexValue,
|
||||
.maxDrawIndirectCount = limits.maxDrawIndirectCount,
|
||||
.maxSamplerLodBias = limits.maxSamplerLodBias,
|
||||
.maxSamplerAnisotropy = limits.maxSamplerAnisotropy,
|
||||
.maxViewports = limits.maxViewports,
|
||||
.maxViewportExtents = { limits.maxViewportDimensions[0], limits.maxViewportDimensions[1] },
|
||||
.viewportBoundsRange = { limits.viewportBoundsRange[0], limits.viewportBoundsRange[1] },
|
||||
.maxFramebufferExtent = {limits.maxFramebufferWidth, limits.maxFramebufferHeight},
|
||||
.maxFramebufferLayers = limits.maxFramebufferLayers,
|
||||
.framebufferColorSampleCounts = vkSampleCountToGryphn(limits.framebufferColorSampleCounts),
|
||||
.framebufferDepthSampleCounts = vkSampleCountToGryphn(limits.framebufferDepthSampleCounts),
|
||||
.framebufferStencilSampleCounts = vkSampleCountToGryphn(limits.framebufferStencilSampleCounts),
|
||||
.framebufferNoAttachmentsSampleCounts = vkSampleCountToGryphn(limits.framebufferNoAttachmentsSampleCounts),
|
||||
.maxColorAttachments = limits.maxColorAttachments,
|
||||
.pointSizeRange = { limits.pointSizeRange[0], limits.pointSizeRange[1] },
|
||||
.lineWidthRange = { limits.lineWidthRange[0], limits.lineWidthRange[1] },
|
||||
.pointSizeGranularity = limits.pointSizeGranularity,
|
||||
.lineWidthGranularity = limits.lineWidthGranularity,
|
||||
.strictLines = limits.strictLines
|
||||
};
|
||||
}
|
||||
|
||||
gnSampleCountFlags vkSampleCountToGryphn(VkSampleCountFlags counts) {
|
||||
gnSampleCountFlags sampleCount = 0;
|
||||
if ((counts & VK_SAMPLE_COUNT_64_BIT) == VK_SAMPLE_COUNT_64_BIT) { sampleCount |= GN_SAMPLE_BIT_64; }
|
||||
if ((counts & VK_SAMPLE_COUNT_32_BIT) == VK_SAMPLE_COUNT_32_BIT) { sampleCount |= GN_SAMPLE_BIT_32; }
|
||||
if ((counts & VK_SAMPLE_COUNT_16_BIT) == VK_SAMPLE_COUNT_16_BIT) { sampleCount |= GN_SAMPLE_BIT_16; }
|
||||
@@ -37,9 +128,7 @@ gnMultisampleCountFlags vkSampleCountToGryphn(VkSampleCountFlags counts) {
|
||||
return sampleCount;
|
||||
}
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
VkSampleCountFlags gnSampleCountToVulkan(gnMultisampleCountFlags counts) {
|
||||
VkSampleCountFlags gnSampleCountToVulkan(gnSampleCountFlags counts) {
|
||||
VkSampleCountFlags sampleCount = 0;
|
||||
|
||||
if ((counts & GN_SAMPLE_BIT_64) == GN_SAMPLE_BIT_64) { sampleCount |= VK_SAMPLE_COUNT_64_BIT; }
|
||||
@@ -53,50 +142,50 @@ VkSampleCountFlags gnSampleCountToVulkan(gnMultisampleCountFlags counts) {
|
||||
return sampleCount;
|
||||
}
|
||||
|
||||
void vulkanLoadNeededQueues(gnPhysicalDevice physicalDevice) {
|
||||
vulkanPhysicalDevice* device = (vulkanPhysicalDevice*)physicalDevice;
|
||||
// void vulkanLoadNeededQueues(gnPhysicalDevice physicalDevice) {
|
||||
// VkPhysicalDevice device = (VkPhysicalDevice)physicalDevice;
|
||||
|
||||
uint32_t queueFamilyCount = 0;
|
||||
vkGetPhysicalDeviceQueueFamilyProperties(device->device, &queueFamilyCount, NULL);
|
||||
VkQueueFamilyProperties* queueFamilies = malloc(sizeof(VkQueueFamilyProperties) * queueFamilyCount);
|
||||
vkGetPhysicalDeviceQueueFamilyProperties(device->device, &queueFamilyCount, queueFamilies);
|
||||
// uint32_t queueFamilyCount = 0;
|
||||
// vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, NULL);
|
||||
// VkQueueFamilyProperties* queueFamilies = malloc(sizeof(VkQueueFamilyProperties) * queueFamilyCount);
|
||||
// vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies);
|
||||
|
||||
device->neededQueues = malloc(sizeof(vulkanNeededQueue) * queueFamilyCount);
|
||||
for (uint32_t c = 0; c < queueFamilyCount; c++) {
|
||||
gnBool hasNeededQueue = GN_FALSE;
|
||||
// device->neededQueues = malloc(sizeof(vulkanNeededQueue) * queueFamilyCount);
|
||||
// for (uint32_t c = 0; c < queueFamilyCount; c++) {
|
||||
// gnBool hasNeededQueue = GN_FALSE;
|
||||
|
||||
if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT)
|
||||
hasNeededQueue = GN_TRUE;
|
||||
if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT) == VK_QUEUE_TRANSFER_BIT)
|
||||
hasNeededQueue = GN_TRUE;
|
||||
// if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT)
|
||||
// hasNeededQueue = GN_TRUE;
|
||||
// if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT) == VK_QUEUE_TRANSFER_BIT)
|
||||
// hasNeededQueue = GN_TRUE;
|
||||
|
||||
if (hasNeededQueue) {
|
||||
vulkanNeededQueue neededQueue = {
|
||||
.queueIndex = c,
|
||||
.createFlags = 0,
|
||||
.usedForPresent = GN_FALSE
|
||||
};
|
||||
if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT)) neededQueue.createFlags |= VK_QUEUE_GRAPHICS_BIT;
|
||||
if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT)) neededQueue.createFlags |= VK_QUEUE_TRANSFER_BIT;
|
||||
// if (hasNeededQueue) {
|
||||
// vulkanNeededQueue neededQueue = {
|
||||
// .queueIndex = c,
|
||||
// .createFlags = 0,
|
||||
// .usedForPresent = GN_FALSE
|
||||
// };
|
||||
// if ((queueFamilies[c].queueFlags & VK_QUEUE_GRAPHICS_BIT)) neededQueue.createFlags |= VK_QUEUE_GRAPHICS_BIT;
|
||||
// if ((queueFamilies[c].queueFlags & VK_QUEUE_TRANSFER_BIT)) neededQueue.createFlags |= VK_QUEUE_TRANSFER_BIT;
|
||||
|
||||
device->neededQueues[device->neededQueueCount] = neededQueue;
|
||||
device->neededQueueCount++;
|
||||
}
|
||||
}
|
||||
// device->neededQueues[device->neededQueueCount] = neededQueue;
|
||||
// device->neededQueueCount++;
|
||||
// }
|
||||
// }
|
||||
|
||||
free(queueFamilies);
|
||||
}
|
||||
// free(queueFamilies);
|
||||
// }
|
||||
|
||||
|
||||
gnBool deviceCanPresentToSurface(gnPhysicalDevice physicalDevice, gnWindowSurface surface) {
|
||||
vulkanPhysicalDevice* device = (vulkanPhysicalDevice*)physicalDevice;
|
||||
// gnBool deviceCanPresentToSurface(gnPhysicalDevice physicalDevice, gnWindowSurface surface) {
|
||||
// vulkanPhysicalDevice* device = (vulkanPhysicalDevice*)physicalDevice;
|
||||
|
||||
uint32_t queueFamilyCount = 0;
|
||||
vkGetPhysicalDeviceQueueFamilyProperties(device->device, &queueFamilyCount, NULL);
|
||||
for (uint32_t i = 0; i < queueFamilyCount; i++) {
|
||||
VkBool32 supportsPresent;
|
||||
vkGetPhysicalDeviceSurfaceSupportKHR(device->device, i, surface->windowSurface->surface, &supportsPresent);
|
||||
if (supportsPresent) return GN_TRUE;
|
||||
}
|
||||
return GN_FALSE;
|
||||
}
|
||||
// uint32_t queueFamilyCount = 0;
|
||||
// vkGetPhysicalDeviceQueueFamilyProperties(device->device, &queueFamilyCount, NULL);
|
||||
// for (uint32_t i = 0; i < queueFamilyCount; i++) {
|
||||
// VkBool32 supportsPresent;
|
||||
// vkGetPhysicalDeviceSurfaceSupportKHR(device->device, i, surface->windowSurface->surface, &supportsPresent);
|
||||
// if (supportsPresent) return GN_TRUE;
|
||||
// }
|
||||
// return GN_FALSE;
|
||||
// }
|
||||
|
@@ -10,7 +10,9 @@ typedef struct vulkanNeededQueue {
|
||||
} vulkanNeededQueue;
|
||||
|
||||
gnPhysicalDeviceProperties vulkanQueryPhysicalDeviceProperties(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers);
|
||||
gnPhysicalDeviceFeatures vulkanQueryPhysicalDeviceFeatures(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers);
|
||||
gnPhysicalDeviceLimits vulkanQueryPhysicalDeviceLimits(gnInstance instance, gnPhysicalDeviceHandle device, gryphnInstanceFunctionLayers* layers);
|
||||
|
||||
gnBool deviceCanPresentToSurface(gnPhysicalDevice device, gnWindowSurface surface);
|
||||
gnMultisampleCountFlags vkSampleCountToGryphn(VkSampleCountFlags counts);
|
||||
VkSampleCountFlags gnSampleCountToVulkan(gnMultisampleCountFlags counts);
|
||||
gnSampleCountFlags vkSampleCountToGryphn(VkSampleCountFlags counts);
|
||||
VkSampleCountFlags gnSampleCountToVulkan(gnSampleCountFlags counts);
|
||||
|
Reference in New Issue
Block a user