Remove xcode/examples.h
This commit is contained in:
commit
2d2746c01d
41 changed files with 655 additions and 1014 deletions
|
|
@ -152,7 +152,7 @@ Advanced example that uses sub passes and input attachments to write and read ba
|
||||||
|
|
||||||
Basic offscreen rendering in two passes. First pass renders the mirrored scene to a separate framebuffer with color and depth attachments, second pass samples from that color attachment for rendering a mirror surface.
|
Basic offscreen rendering in two passes. First pass renders the mirrored scene to a separate framebuffer with color and depth attachments, second pass samples from that color attachment for rendering a mirror surface.
|
||||||
|
|
||||||
#### [CPU particle system](examples/particlefire/)
|
#### [CPU particle system](examples/particlesystem/)
|
||||||
|
|
||||||
Implements a simple CPU based particle system. Particle data is stored in host memory, updated on the CPU per-frame and synchronized with the device before it's rendered using pre-multiplied alpha.
|
Implements a simple CPU based particle system. Particle data is stored in host memory, updated on the CPU per-frame and synchronized with the device before it's rendered using pre-multiplied alpha.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
cmake_minimum_required(VERSION 3.4.1 FATAL_ERROR)
|
cmake_minimum_required(VERSION 3.4.1 FATAL_ERROR)
|
||||||
|
|
||||||
set(NAME particlefire)
|
set(NAME particlesystem)
|
||||||
|
|
||||||
set(SRC_DIR ../../../examples/${NAME})
|
set(SRC_DIR ../../../examples/${NAME})
|
||||||
set(BASE_DIR ../../../base)
|
set(BASE_DIR ../../../base)
|
||||||
|
|
@ -4,7 +4,7 @@ apply from: '../gradle/outputfilename.gradle'
|
||||||
android {
|
android {
|
||||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "de.saschawillems.vulkanParticlefire"
|
applicationId "de.saschawillems.vulkanParticlesystem"
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
versionCode 1
|
versionCode 1
|
||||||
|
|
@ -49,8 +49,8 @@ task copyTask {
|
||||||
}
|
}
|
||||||
|
|
||||||
copy {
|
copy {
|
||||||
from rootProject.ext.shaderPath + 'glsl/particlefire'
|
from rootProject.ext.shaderPath + 'glsl/particlesystem'
|
||||||
into 'assets/shaders/glsl/particlefire'
|
into 'assets/shaders/glsl/particlesystem'
|
||||||
include '*.*'
|
include '*.*'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="de.saschawillems.vulkanParticlefire">
|
package="de.saschawillems.vulkanParticlesystem">
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:label="Vulkan CPU particles"
|
android:label="Vulkan CPU particles"
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Android Vulkan function pointer loader
|
* Android Vulkan function pointer loader
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de
|
* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de
|
||||||
*
|
*
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||||
*/
|
*/
|
||||||
|
|
@ -125,6 +125,18 @@ PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR;
|
||||||
PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;
|
PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;
|
||||||
PFN_vkCmdFillBuffer vkCmdFillBuffer;
|
PFN_vkCmdFillBuffer vkCmdFillBuffer;
|
||||||
|
|
||||||
|
PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;
|
||||||
|
PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
|
||||||
|
PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;
|
||||||
|
PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;
|
||||||
|
PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;
|
||||||
|
PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;
|
||||||
|
PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;
|
||||||
|
PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;
|
||||||
|
PFN_vkQueuePresentKHR vkQueuePresentKHR;
|
||||||
|
|
||||||
|
PFN_vkResetCommandBuffer vkResetCommandBuffer;
|
||||||
|
|
||||||
int32_t vks::android::screenDensity;
|
int32_t vks::android::screenDensity;
|
||||||
|
|
||||||
void *libVulkan;
|
void *libVulkan;
|
||||||
|
|
@ -289,6 +301,18 @@ namespace vks
|
||||||
vkDestroySurfaceKHR = reinterpret_cast<PFN_vkDestroySurfaceKHR>(vkGetInstanceProcAddr(instance, "vkDestroySurfaceKHR"));
|
vkDestroySurfaceKHR = reinterpret_cast<PFN_vkDestroySurfaceKHR>(vkGetInstanceProcAddr(instance, "vkDestroySurfaceKHR"));
|
||||||
|
|
||||||
vkCmdFillBuffer = reinterpret_cast<PFN_vkCmdFillBuffer>(vkGetInstanceProcAddr(instance, "vkCmdFillBuffer"));
|
vkCmdFillBuffer = reinterpret_cast<PFN_vkCmdFillBuffer>(vkGetInstanceProcAddr(instance, "vkCmdFillBuffer"));
|
||||||
|
|
||||||
|
vkGetPhysicalDeviceSurfaceSupportKHR = reinterpret_cast<PFN_vkGetPhysicalDeviceSurfaceSupportKHR>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceSupportKHR"));
|
||||||
|
vkGetPhysicalDeviceSurfaceCapabilitiesKHR = reinterpret_cast<PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"));
|
||||||
|
vkGetPhysicalDeviceSurfaceFormatsKHR = reinterpret_cast<PFN_vkGetPhysicalDeviceSurfaceFormatsKHR>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR"));
|
||||||
|
vkGetPhysicalDeviceSurfacePresentModesKHR = reinterpret_cast<PFN_vkGetPhysicalDeviceSurfacePresentModesKHR>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"));
|
||||||
|
vkCreateSwapchainKHR = reinterpret_cast<PFN_vkCreateSwapchainKHR>(vkGetInstanceProcAddr(instance, "vkCreateSwapchainKHR"));
|
||||||
|
vkDestroySwapchainKHR = reinterpret_cast<PFN_vkDestroySwapchainKHR>(vkGetInstanceProcAddr(instance, "vkDestroySwapchainKHR"));
|
||||||
|
vkGetSwapchainImagesKHR = reinterpret_cast<PFN_vkGetSwapchainImagesKHR>(vkGetInstanceProcAddr(instance, "vkGetSwapchainImagesKHR"));
|
||||||
|
vkAcquireNextImageKHR = reinterpret_cast<PFN_vkAcquireNextImageKHR>(vkGetInstanceProcAddr(instance, "vkAcquireNextImageKHR"));
|
||||||
|
vkQueuePresentKHR = reinterpret_cast<PFN_vkQueuePresentKHR>(vkGetInstanceProcAddr(instance, "vkQueuePresentKHR"));
|
||||||
|
|
||||||
|
vkResetCommandBuffer = reinterpret_cast<PFN_vkResetCommandBuffer>(vkGetInstanceProcAddr(instance, "vkResetCommandBuffer"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void freeVulkanLibrary()
|
void freeVulkanLibrary()
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Android Vulkan function pointer prototypes
|
* Android Vulkan function pointer prototypes
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de
|
* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de
|
||||||
*
|
*
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||||
*/
|
*/
|
||||||
|
|
@ -12,6 +12,7 @@
|
||||||
#define VULKANANDROID_H
|
#define VULKANANDROID_H
|
||||||
|
|
||||||
// Vulkan needs to be loaded dynamically on android
|
// Vulkan needs to be loaded dynamically on android
|
||||||
|
// While SDK 26 (and up) come with a loader, we also want to support older devices, so we manually load function pointers
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|
@ -158,6 +159,18 @@ extern PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR;
|
||||||
extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;
|
extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;
|
||||||
extern PFN_vkCmdFillBuffer vkCmdFillBuffer;
|
extern PFN_vkCmdFillBuffer vkCmdFillBuffer;
|
||||||
|
|
||||||
|
extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;
|
||||||
|
extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
|
||||||
|
extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;
|
||||||
|
extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;
|
||||||
|
extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;
|
||||||
|
extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;
|
||||||
|
extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;
|
||||||
|
extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;
|
||||||
|
extern PFN_vkQueuePresentKHR vkQueuePresentKHR;
|
||||||
|
|
||||||
|
extern PFN_vkResetCommandBuffer vkResetCommandBuffer;
|
||||||
|
|
||||||
namespace vks
|
namespace vks
|
||||||
{
|
{
|
||||||
namespace android
|
namespace android
|
||||||
|
|
|
||||||
|
|
@ -1,259 +0,0 @@
|
||||||
/*
|
|
||||||
* Heightmap terrain generator
|
|
||||||
*
|
|
||||||
* Copyright (C) by Sascha Willems - www.saschawillems.de
|
|
||||||
*
|
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <glm/glm.hpp>
|
|
||||||
#include <glm/glm.hpp>
|
|
||||||
|
|
||||||
#include "vulkan/vulkan.h"
|
|
||||||
#include "VulkanDevice.h"
|
|
||||||
#include "VulkanBuffer.h"
|
|
||||||
#include <ktx.h>
|
|
||||||
#include <ktxvulkan.h>
|
|
||||||
|
|
||||||
namespace vks
|
|
||||||
{
|
|
||||||
class HeightMap
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
uint16_t *heightdata;
|
|
||||||
uint32_t dim;
|
|
||||||
uint32_t scale;
|
|
||||||
|
|
||||||
vks::VulkanDevice *device = nullptr;
|
|
||||||
VkQueue copyQueue = VK_NULL_HANDLE;
|
|
||||||
public:
|
|
||||||
enum Topology { topologyTriangles, topologyQuads };
|
|
||||||
|
|
||||||
float heightScale = 1.0f;
|
|
||||||
float uvScale = 1.0f;
|
|
||||||
|
|
||||||
vks::Buffer vertexBuffer;
|
|
||||||
vks::Buffer indexBuffer;
|
|
||||||
|
|
||||||
struct Vertex {
|
|
||||||
glm::vec3 pos;
|
|
||||||
glm::vec3 normal;
|
|
||||||
glm::vec2 uv;
|
|
||||||
};
|
|
||||||
|
|
||||||
size_t vertexBufferSize = 0;
|
|
||||||
size_t indexBufferSize = 0;
|
|
||||||
uint32_t indexCount = 0;
|
|
||||||
|
|
||||||
HeightMap(vks::VulkanDevice *device, VkQueue copyQueue)
|
|
||||||
{
|
|
||||||
this->device = device;
|
|
||||||
this->copyQueue = copyQueue;
|
|
||||||
};
|
|
||||||
|
|
||||||
~HeightMap()
|
|
||||||
{
|
|
||||||
vertexBuffer.destroy();
|
|
||||||
indexBuffer.destroy();
|
|
||||||
delete[] heightdata;
|
|
||||||
}
|
|
||||||
|
|
||||||
float getHeight(uint32_t x, uint32_t y)
|
|
||||||
{
|
|
||||||
glm::ivec2 rpos = glm::ivec2(x, y) * glm::ivec2(scale);
|
|
||||||
rpos.x = std::max(0, std::min(rpos.x, (int)dim - 1));
|
|
||||||
rpos.y = std::max(0, std::min(rpos.y, (int)dim - 1));
|
|
||||||
rpos /= glm::ivec2(scale);
|
|
||||||
return *(heightdata + (rpos.x + rpos.y * dim) * scale) / 65535.0f * heightScale;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
void loadFromFile(const std::string filename, uint32_t patchsize, glm::vec3 scale, Topology topology, AAssetManager* assetManager)
|
|
||||||
#else
|
|
||||||
void loadFromFile(const std::string filename, uint32_t patchsize, glm::vec3 scale, Topology topology)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
assert(device);
|
|
||||||
assert(copyQueue != VK_NULL_HANDLE);
|
|
||||||
|
|
||||||
ktxResult result;
|
|
||||||
ktxTexture* ktxTexture;
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
AAsset* asset = AAssetManager_open(androidApp->activity->assetManager, filename.c_str(), AASSET_MODE_STREAMING);
|
|
||||||
assert(asset);
|
|
||||||
size_t size = AAsset_getLength(asset);
|
|
||||||
assert(size > 0);
|
|
||||||
void *textureData = malloc(size);
|
|
||||||
AAsset_read(asset, textureData, size);
|
|
||||||
AAsset_close(asset);
|
|
||||||
result = ktxTexture_CreateFromMemory(textureData, size, KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, target);
|
|
||||||
free(textureData);
|
|
||||||
#else
|
|
||||||
result = ktxTexture_CreateFromNamedFile(filename.c_str(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &ktxTexture);
|
|
||||||
#endif
|
|
||||||
assert(result == KTX_SUCCESS);
|
|
||||||
ktx_size_t ktxSize = ktxTexture_GetImageSize(ktxTexture, 0);
|
|
||||||
ktx_uint8_t* ktxImage = ktxTexture_GetData(ktxTexture);
|
|
||||||
dim = ktxTexture->baseWidth;
|
|
||||||
heightdata = new uint16_t[dim * dim];
|
|
||||||
memcpy(heightdata, ktxImage, ktxSize);
|
|
||||||
this->scale = dim / patchsize;
|
|
||||||
ktxTexture_Destroy(ktxTexture);
|
|
||||||
|
|
||||||
// Generate vertices
|
|
||||||
Vertex * vertices = new Vertex[patchsize * patchsize * 4];
|
|
||||||
|
|
||||||
const float wx = 2.0f;
|
|
||||||
const float wy = 2.0f;
|
|
||||||
|
|
||||||
for (uint32_t x = 0; x < patchsize; x++)
|
|
||||||
{
|
|
||||||
for (uint32_t y = 0; y < patchsize; y++)
|
|
||||||
{
|
|
||||||
uint32_t index = (x + y * patchsize);
|
|
||||||
vertices[index].pos[0] = (x * wx + wx / 2.0f - (float)patchsize * wx / 2.0f) * scale.x;
|
|
||||||
vertices[index].pos[1] = -getHeight(x, y);
|
|
||||||
vertices[index].pos[2] = (y * wy + wy / 2.0f - (float)patchsize * wy / 2.0f) * scale.z;
|
|
||||||
vertices[index].uv = glm::vec2((float)x / patchsize, (float)y / patchsize) * uvScale;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint32_t y = 0; y < patchsize; y++)
|
|
||||||
{
|
|
||||||
for (uint32_t x = 0; x < patchsize; x++)
|
|
||||||
{
|
|
||||||
float dx = getHeight(x < patchsize - 1 ? x + 1 : x, y) - getHeight(x > 0 ? x - 1 : x, y);
|
|
||||||
if (x == 0 || x == patchsize - 1)
|
|
||||||
dx *= 2.0f;
|
|
||||||
|
|
||||||
float dy = getHeight(x, y < patchsize - 1 ? y + 1 : y) - getHeight(x, y > 0 ? y - 1 : y);
|
|
||||||
if (y == 0 || y == patchsize - 1)
|
|
||||||
dy *= 2.0f;
|
|
||||||
|
|
||||||
glm::vec3 A = glm::vec3(1.0f, 0.0f, dx);
|
|
||||||
glm::vec3 B = glm::vec3(0.0f, 1.0f, dy);
|
|
||||||
|
|
||||||
glm::vec3 normal = (glm::normalize(glm::cross(A, B)) + 1.0f) * 0.5f;
|
|
||||||
|
|
||||||
vertices[x + y * patchsize].normal = glm::vec3(normal.x, normal.z, normal.y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate indices
|
|
||||||
|
|
||||||
const uint32_t w = (patchsize - 1);
|
|
||||||
uint32_t *indices;
|
|
||||||
|
|
||||||
switch (topology)
|
|
||||||
{
|
|
||||||
// Indices for triangles
|
|
||||||
case topologyTriangles:
|
|
||||||
{
|
|
||||||
indices = new uint32_t[w * w * 6];
|
|
||||||
for (uint32_t x = 0; x < w; x++)
|
|
||||||
{
|
|
||||||
for (uint32_t y = 0; y < w; y++)
|
|
||||||
{
|
|
||||||
uint32_t index = (x + y * w) * 6;
|
|
||||||
indices[index] = (x + y * patchsize);
|
|
||||||
indices[index + 1] = indices[index] + patchsize;
|
|
||||||
indices[index + 2] = indices[index + 1] + 1;
|
|
||||||
|
|
||||||
indices[index + 3] = indices[index + 1] + 1;
|
|
||||||
indices[index + 4] = indices[index] + 1;
|
|
||||||
indices[index + 5] = indices[index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
indexCount = (patchsize - 1) * (patchsize - 1) * 6;
|
|
||||||
indexBufferSize = (w * w * 6) * sizeof(uint32_t);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// Indices for quad patches (tessellation)
|
|
||||||
case topologyQuads:
|
|
||||||
{
|
|
||||||
|
|
||||||
indices = new uint32_t[w * w * 4];
|
|
||||||
for (uint32_t x = 0; x < w; x++)
|
|
||||||
{
|
|
||||||
for (uint32_t y = 0; y < w; y++)
|
|
||||||
{
|
|
||||||
uint32_t index = (x + y * w) * 4;
|
|
||||||
indices[index] = (x + y * patchsize);
|
|
||||||
indices[index + 1] = indices[index] + patchsize;
|
|
||||||
indices[index + 2] = indices[index + 1] + 1;
|
|
||||||
indices[index + 3] = indices[index] + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
indexCount = (patchsize - 1) * (patchsize - 1) * 4;
|
|
||||||
indexBufferSize = (w * w * 4) * sizeof(uint32_t);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(indexBufferSize > 0);
|
|
||||||
|
|
||||||
vertexBufferSize = (patchsize * patchsize * 4) * sizeof(Vertex);
|
|
||||||
|
|
||||||
// Generate Vulkan buffers
|
|
||||||
|
|
||||||
vks::Buffer vertexStaging, indexStaging;
|
|
||||||
|
|
||||||
// Create staging buffers
|
|
||||||
device->createBuffer(
|
|
||||||
VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
|
|
||||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
|
|
||||||
&vertexStaging,
|
|
||||||
vertexBufferSize,
|
|
||||||
vertices);
|
|
||||||
|
|
||||||
device->createBuffer(
|
|
||||||
VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
|
|
||||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
|
|
||||||
&indexStaging,
|
|
||||||
indexBufferSize,
|
|
||||||
indices);
|
|
||||||
|
|
||||||
// Device local (target) buffer
|
|
||||||
device->createBuffer(
|
|
||||||
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
|
|
||||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
|
|
||||||
&vertexBuffer,
|
|
||||||
vertexBufferSize);
|
|
||||||
|
|
||||||
device->createBuffer(
|
|
||||||
VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
|
|
||||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
|
|
||||||
&indexBuffer,
|
|
||||||
indexBufferSize);
|
|
||||||
|
|
||||||
// Copy from staging buffers
|
|
||||||
VkCommandBuffer copyCmd = device->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
|
|
||||||
|
|
||||||
VkBufferCopy copyRegion = {};
|
|
||||||
|
|
||||||
copyRegion.size = vertexBufferSize;
|
|
||||||
vkCmdCopyBuffer(
|
|
||||||
copyCmd,
|
|
||||||
vertexStaging.buffer,
|
|
||||||
vertexBuffer.buffer,
|
|
||||||
1,
|
|
||||||
©Region);
|
|
||||||
|
|
||||||
copyRegion.size = indexBufferSize;
|
|
||||||
vkCmdCopyBuffer(
|
|
||||||
copyCmd,
|
|
||||||
indexStaging.buffer,
|
|
||||||
indexBuffer.buffer,
|
|
||||||
1,
|
|
||||||
©Region);
|
|
||||||
|
|
||||||
device->flushCommandBuffer(copyCmd, copyQueue, true);
|
|
||||||
|
|
||||||
vkDestroyBuffer(device->logicalDevice, vertexStaging.buffer, nullptr);
|
|
||||||
vkFreeMemory(device->logicalDevice, vertexStaging.memory, nullptr);
|
|
||||||
vkDestroyBuffer(device->logicalDevice, indexStaging.buffer, nullptr);
|
|
||||||
vkFreeMemory(device->logicalDevice, indexStaging.memory, nullptr);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* A swap chain is a collection of framebuffers used for rendering and presentation to the windowing system
|
* A swap chain is a collection of framebuffers used for rendering and presentation to the windowing system
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016-2021 by Sascha Willems - www.saschawillems.de
|
* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de
|
||||||
*
|
*
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||||
*/
|
*/
|
||||||
|
|
@ -103,7 +103,7 @@ void VulkanSwapChain::initSurface(uint32_t width, uint32_t height)
|
||||||
std::vector<VkBool32> supportsPresent(queueCount);
|
std::vector<VkBool32> supportsPresent(queueCount);
|
||||||
for (uint32_t i = 0; i < queueCount; i++)
|
for (uint32_t i = 0; i < queueCount; i++)
|
||||||
{
|
{
|
||||||
fpGetPhysicalDeviceSurfaceSupportKHR(physicalDevice, i, surface, &supportsPresent[i]);
|
vkGetPhysicalDeviceSurfaceSupportKHR(physicalDevice, i, surface, &supportsPresent[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Search for a graphics and a present queue in the array of queue
|
// Search for a graphics and a present queue in the array of queue
|
||||||
|
|
@ -157,44 +157,30 @@ void VulkanSwapChain::initSurface(uint32_t width, uint32_t height)
|
||||||
|
|
||||||
// Get list of supported surface formats
|
// Get list of supported surface formats
|
||||||
uint32_t formatCount;
|
uint32_t formatCount;
|
||||||
VK_CHECK_RESULT(fpGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &formatCount, NULL));
|
VK_CHECK_RESULT(vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &formatCount, NULL));
|
||||||
assert(formatCount > 0);
|
assert(formatCount > 0);
|
||||||
|
|
||||||
std::vector<VkSurfaceFormatKHR> surfaceFormats(formatCount);
|
std::vector<VkSurfaceFormatKHR> surfaceFormats(formatCount);
|
||||||
VK_CHECK_RESULT(fpGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &formatCount, surfaceFormats.data()));
|
VK_CHECK_RESULT(vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &formatCount, surfaceFormats.data()));
|
||||||
|
|
||||||
// If the surface format list only includes one entry with VK_FORMAT_UNDEFINED,
|
// We want to get a format that best suits our needs, so we try to get one from a set of preferred formats
|
||||||
// there is no preferred format, so we assume VK_FORMAT_B8G8R8A8_UNORM
|
// Initialize the format to the first one returned by the implementation in case we can't find one of the preffered formats
|
||||||
if ((formatCount == 1) && (surfaceFormats[0].format == VK_FORMAT_UNDEFINED))
|
VkSurfaceFormatKHR selectedFormat = surfaceFormats[0];
|
||||||
{
|
std::vector<VkFormat> preferredImageFormats = {
|
||||||
colorFormat = VK_FORMAT_B8G8R8A8_UNORM;
|
VK_FORMAT_B8G8R8A8_UNORM,
|
||||||
colorSpace = surfaceFormats[0].colorSpace;
|
VK_FORMAT_R8G8B8A8_UNORM,
|
||||||
}
|
VK_FORMAT_A8B8G8R8_UNORM_PACK32
|
||||||
else
|
};
|
||||||
{
|
|
||||||
// iterate over the list of available surface format and
|
|
||||||
// check for the presence of VK_FORMAT_B8G8R8A8_UNORM
|
|
||||||
bool found_B8G8R8A8_UNORM = false;
|
|
||||||
for (auto&& surfaceFormat : surfaceFormats)
|
|
||||||
{
|
|
||||||
if (surfaceFormat.format == VK_FORMAT_B8G8R8A8_UNORM)
|
|
||||||
{
|
|
||||||
colorFormat = surfaceFormat.format;
|
|
||||||
colorSpace = surfaceFormat.colorSpace;
|
|
||||||
found_B8G8R8A8_UNORM = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// in case VK_FORMAT_B8G8R8A8_UNORM is not available
|
for (auto& availableFormat : surfaceFormats) {
|
||||||
// select the first available color format
|
if (std::find(preferredImageFormats.begin(), preferredImageFormats.end(), availableFormat.format) != preferredImageFormats.end()) {
|
||||||
if (!found_B8G8R8A8_UNORM)
|
selectedFormat = availableFormat;
|
||||||
{
|
break;
|
||||||
colorFormat = surfaceFormats[0].format;
|
|
||||||
colorSpace = surfaceFormats[0].colorSpace;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
colorFormat = selectedFormat.format;
|
||||||
|
colorSpace = selectedFormat.colorSpace;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -210,16 +196,6 @@ void VulkanSwapChain::connect(VkInstance instance, VkPhysicalDevice physicalDevi
|
||||||
this->instance = instance;
|
this->instance = instance;
|
||||||
this->physicalDevice = physicalDevice;
|
this->physicalDevice = physicalDevice;
|
||||||
this->device = device;
|
this->device = device;
|
||||||
fpGetPhysicalDeviceSurfaceSupportKHR = reinterpret_cast<PFN_vkGetPhysicalDeviceSurfaceSupportKHR>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceSupportKHR"));
|
|
||||||
fpGetPhysicalDeviceSurfaceCapabilitiesKHR = reinterpret_cast<PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"));
|
|
||||||
fpGetPhysicalDeviceSurfaceFormatsKHR = reinterpret_cast<PFN_vkGetPhysicalDeviceSurfaceFormatsKHR>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR"));
|
|
||||||
fpGetPhysicalDeviceSurfacePresentModesKHR = reinterpret_cast<PFN_vkGetPhysicalDeviceSurfacePresentModesKHR>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"));
|
|
||||||
|
|
||||||
fpCreateSwapchainKHR = reinterpret_cast<PFN_vkCreateSwapchainKHR>(vkGetDeviceProcAddr(device, "vkCreateSwapchainKHR"));
|
|
||||||
fpDestroySwapchainKHR = reinterpret_cast<PFN_vkDestroySwapchainKHR>(vkGetDeviceProcAddr(device, "vkDestroySwapchainKHR"));
|
|
||||||
fpGetSwapchainImagesKHR = reinterpret_cast<PFN_vkGetSwapchainImagesKHR>(vkGetDeviceProcAddr(device, "vkGetSwapchainImagesKHR"));
|
|
||||||
fpAcquireNextImageKHR = reinterpret_cast<PFN_vkAcquireNextImageKHR>(vkGetDeviceProcAddr(device, "vkAcquireNextImageKHR"));
|
|
||||||
fpQueuePresentKHR = reinterpret_cast<PFN_vkQueuePresentKHR>(vkGetDeviceProcAddr(device, "vkQueuePresentKHR"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -236,15 +212,15 @@ void VulkanSwapChain::create(uint32_t *width, uint32_t *height, bool vsync, bool
|
||||||
|
|
||||||
// Get physical device surface properties and formats
|
// Get physical device surface properties and formats
|
||||||
VkSurfaceCapabilitiesKHR surfCaps;
|
VkSurfaceCapabilitiesKHR surfCaps;
|
||||||
VK_CHECK_RESULT(fpGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, &surfCaps));
|
VK_CHECK_RESULT(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, &surfCaps));
|
||||||
|
|
||||||
// Get available present modes
|
// Get available present modes
|
||||||
uint32_t presentModeCount;
|
uint32_t presentModeCount;
|
||||||
VK_CHECK_RESULT(fpGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &presentModeCount, NULL));
|
VK_CHECK_RESULT(vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &presentModeCount, NULL));
|
||||||
assert(presentModeCount > 0);
|
assert(presentModeCount > 0);
|
||||||
|
|
||||||
std::vector<VkPresentModeKHR> presentModes(presentModeCount);
|
std::vector<VkPresentModeKHR> presentModes(presentModeCount);
|
||||||
VK_CHECK_RESULT(fpGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &presentModeCount, presentModes.data()));
|
VK_CHECK_RESULT(vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &presentModeCount, presentModes.data()));
|
||||||
|
|
||||||
VkExtent2D swapchainExtent = {};
|
VkExtent2D swapchainExtent = {};
|
||||||
// If width (and height) equals the special value 0xFFFFFFFF, the size of the surface will be set by the swapchain
|
// If width (and height) equals the special value 0xFFFFFFFF, the size of the surface will be set by the swapchain
|
||||||
|
|
@ -363,7 +339,7 @@ void VulkanSwapChain::create(uint32_t *width, uint32_t *height, bool vsync, bool
|
||||||
swapchainCI.imageUsage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
swapchainCI.imageUsage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
VK_CHECK_RESULT(fpCreateSwapchainKHR(device, &swapchainCI, nullptr, &swapChain));
|
VK_CHECK_RESULT(vkCreateSwapchainKHR(device, &swapchainCI, nullptr, &swapChain));
|
||||||
|
|
||||||
// If an existing swap chain is re-created, destroy the old swap chain
|
// If an existing swap chain is re-created, destroy the old swap chain
|
||||||
// This also cleans up all the presentable images
|
// This also cleans up all the presentable images
|
||||||
|
|
@ -373,13 +349,13 @@ void VulkanSwapChain::create(uint32_t *width, uint32_t *height, bool vsync, bool
|
||||||
{
|
{
|
||||||
vkDestroyImageView(device, buffers[i].view, nullptr);
|
vkDestroyImageView(device, buffers[i].view, nullptr);
|
||||||
}
|
}
|
||||||
fpDestroySwapchainKHR(device, oldSwapchain, nullptr);
|
vkDestroySwapchainKHR(device, oldSwapchain, nullptr);
|
||||||
}
|
}
|
||||||
VK_CHECK_RESULT(fpGetSwapchainImagesKHR(device, swapChain, &imageCount, NULL));
|
VK_CHECK_RESULT(vkGetSwapchainImagesKHR(device, swapChain, &imageCount, NULL));
|
||||||
|
|
||||||
// Get the swap chain images
|
// Get the swap chain images
|
||||||
images.resize(imageCount);
|
images.resize(imageCount);
|
||||||
VK_CHECK_RESULT(fpGetSwapchainImagesKHR(device, swapChain, &imageCount, images.data()));
|
VK_CHECK_RESULT(vkGetSwapchainImagesKHR(device, swapChain, &imageCount, images.data()));
|
||||||
|
|
||||||
// Get the swap chain buffers containing the image and imageview
|
// Get the swap chain buffers containing the image and imageview
|
||||||
buffers.resize(imageCount);
|
buffers.resize(imageCount);
|
||||||
|
|
@ -425,7 +401,7 @@ VkResult VulkanSwapChain::acquireNextImage(VkSemaphore presentCompleteSemaphore,
|
||||||
{
|
{
|
||||||
// By setting timeout to UINT64_MAX we will always wait until the next image has been acquired or an actual error is thrown
|
// By setting timeout to UINT64_MAX we will always wait until the next image has been acquired or an actual error is thrown
|
||||||
// With that we don't have to handle VK_NOT_READY
|
// With that we don't have to handle VK_NOT_READY
|
||||||
return fpAcquireNextImageKHR(device, swapChain, UINT64_MAX, presentCompleteSemaphore, (VkFence)nullptr, imageIndex);
|
return vkAcquireNextImageKHR(device, swapChain, UINT64_MAX, presentCompleteSemaphore, (VkFence)nullptr, imageIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -451,7 +427,7 @@ VkResult VulkanSwapChain::queuePresent(VkQueue queue, uint32_t imageIndex, VkSem
|
||||||
presentInfo.pWaitSemaphores = &waitSemaphore;
|
presentInfo.pWaitSemaphores = &waitSemaphore;
|
||||||
presentInfo.waitSemaphoreCount = 1;
|
presentInfo.waitSemaphoreCount = 1;
|
||||||
}
|
}
|
||||||
return fpQueuePresentKHR(queue, &presentInfo);
|
return vkQueuePresentKHR(queue, &presentInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -469,7 +445,7 @@ void VulkanSwapChain::cleanup()
|
||||||
}
|
}
|
||||||
if (surface != VK_NULL_HANDLE)
|
if (surface != VK_NULL_HANDLE)
|
||||||
{
|
{
|
||||||
fpDestroySwapchainKHR(device, swapChain, nullptr);
|
vkDestroySwapchainKHR(device, swapChain, nullptr);
|
||||||
vkDestroySurfaceKHR(instance, surface, nullptr);
|
vkDestroySurfaceKHR(instance, surface, nullptr);
|
||||||
}
|
}
|
||||||
surface = VK_NULL_HANDLE;
|
surface = VK_NULL_HANDLE;
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* A swap chain is a collection of framebuffers used for rendering and presentation to the windowing system
|
* A swap chain is a collection of framebuffers used for rendering and presentation to the windowing system
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016-2017 by Sascha Willems - www.saschawillems.de
|
* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de
|
||||||
*
|
*
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||||
*/
|
*/
|
||||||
|
|
@ -39,16 +39,6 @@ private:
|
||||||
VkDevice device;
|
VkDevice device;
|
||||||
VkPhysicalDevice physicalDevice;
|
VkPhysicalDevice physicalDevice;
|
||||||
VkSurfaceKHR surface;
|
VkSurfaceKHR surface;
|
||||||
// Function pointers
|
|
||||||
PFN_vkGetPhysicalDeviceSurfaceSupportKHR fpGetPhysicalDeviceSurfaceSupportKHR;
|
|
||||||
PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR fpGetPhysicalDeviceSurfaceCapabilitiesKHR;
|
|
||||||
PFN_vkGetPhysicalDeviceSurfaceFormatsKHR fpGetPhysicalDeviceSurfaceFormatsKHR;
|
|
||||||
PFN_vkGetPhysicalDeviceSurfacePresentModesKHR fpGetPhysicalDeviceSurfacePresentModesKHR;
|
|
||||||
PFN_vkCreateSwapchainKHR fpCreateSwapchainKHR;
|
|
||||||
PFN_vkDestroySwapchainKHR fpDestroySwapchainKHR;
|
|
||||||
PFN_vkGetSwapchainImagesKHR fpGetSwapchainImagesKHR;
|
|
||||||
PFN_vkAcquireNextImageKHR fpAcquireNextImageKHR;
|
|
||||||
PFN_vkQueuePresentKHR fpQueuePresentKHR;
|
|
||||||
public:
|
public:
|
||||||
VkFormat colorFormat;
|
VkFormat colorFormat;
|
||||||
VkColorSpaceKHR colorSpace;
|
VkColorSpaceKHR colorSpace;
|
||||||
|
|
|
||||||
|
|
@ -821,7 +821,7 @@ VulkanExampleBase::VulkanExampleBase(bool enableValidation)
|
||||||
settings.vsync = true;
|
settings.vsync = true;
|
||||||
}
|
}
|
||||||
if (commandLineParser.isSet("height")) {
|
if (commandLineParser.isSet("height")) {
|
||||||
height = commandLineParser.getValueAsInt("height", width);
|
height = commandLineParser.getValueAsInt("height", height);
|
||||||
}
|
}
|
||||||
if (commandLineParser.isSet("width")) {
|
if (commandLineParser.isSet("width")) {
|
||||||
width = commandLineParser.getValueAsInt("width", width);
|
width = commandLineParser.getValueAsInt("width", width);
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,6 @@ private:
|
||||||
uint32_t destWidth;
|
uint32_t destWidth;
|
||||||
uint32_t destHeight;
|
uint32_t destHeight;
|
||||||
bool resizing = false;
|
bool resizing = false;
|
||||||
void windowResize();
|
|
||||||
void handleMouseMove(int32_t x, int32_t y);
|
void handleMouseMove(int32_t x, int32_t y);
|
||||||
void nextFrame();
|
void nextFrame();
|
||||||
void updateOverlay();
|
void updateOverlay();
|
||||||
|
|
@ -377,6 +376,8 @@ public:
|
||||||
/** @brief Loads a SPIR-V shader file for the given shader stage */
|
/** @brief Loads a SPIR-V shader file for the given shader stage */
|
||||||
VkPipelineShaderStageCreateInfo loadShader(std::string fileName, VkShaderStageFlagBits stage);
|
VkPipelineShaderStageCreateInfo loadShader(std::string fileName, VkShaderStageFlagBits stage);
|
||||||
|
|
||||||
|
void windowResize();
|
||||||
|
|
||||||
/** @brief Entry point for the main render loop */
|
/** @brief Entry point for the main render loop */
|
||||||
void renderLoop();
|
void renderLoop();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -121,7 +121,7 @@ set(EXAMPLES
|
||||||
offscreen
|
offscreen
|
||||||
oit
|
oit
|
||||||
parallaxmapping
|
parallaxmapping
|
||||||
particlefire
|
particlesystem
|
||||||
pbrbasic
|
pbrbasic
|
||||||
pbribl
|
pbribl
|
||||||
pbrtexture
|
pbrtexture
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Vulkan Example - Using VK_EXT_graphics_pipeline_library
|
* Vulkan Example - Using VK_EXT_graphics_pipeline_library
|
||||||
*
|
*
|
||||||
* Copyright (C) 2022 by Sascha Willems - www.saschawillems.de
|
* Copyright (C) 2022-2023 by Sascha Willems - www.saschawillems.de
|
||||||
*
|
*
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||||
*/
|
*/
|
||||||
|
|
@ -207,7 +207,6 @@ public:
|
||||||
{
|
{
|
||||||
#if defined(__ANDROID__)
|
#if defined(__ANDROID__)
|
||||||
// Load shader from compressed asset
|
// Load shader from compressed asset
|
||||||
// @todo
|
|
||||||
AAsset* asset = AAssetManager_open(androidApp->activity->assetManager, fileName, AASSET_MODE_STREAMING);
|
AAsset* asset = AAssetManager_open(androidApp->activity->assetManager, fileName, AASSET_MODE_STREAMING);
|
||||||
assert(asset);
|
assert(asset);
|
||||||
size_t size = AAsset_getLength(asset);
|
size_t size = AAsset_getLength(asset);
|
||||||
|
|
@ -280,7 +279,6 @@ public:
|
||||||
|
|
||||||
VkPipelineRasterizationStateCreateInfo rasterizationState = vks::initializers::pipelineRasterizationStateCreateInfo(VK_POLYGON_MODE_FILL, VK_CULL_MODE_BACK_BIT, VK_FRONT_FACE_COUNTER_CLOCKWISE, 0);
|
VkPipelineRasterizationStateCreateInfo rasterizationState = vks::initializers::pipelineRasterizationStateCreateInfo(VK_POLYGON_MODE_FILL, VK_CULL_MODE_BACK_BIT, VK_FRONT_FACE_COUNTER_CLOCKWISE, 0);
|
||||||
|
|
||||||
// @todo: we can skip the pipeline shader module info and directly consume the shader module
|
|
||||||
ShaderInfo shaderInfo{};
|
ShaderInfo shaderInfo{};
|
||||||
loadShaderFile(getShadersPath() + "graphicspipelinelibrary/shared.vert.spv", shaderInfo);
|
loadShaderFile(getShadersPath() + "graphicspipelinelibrary/shared.vert.spv", shaderInfo);
|
||||||
|
|
||||||
|
|
@ -307,6 +305,8 @@ public:
|
||||||
pipelineLibraryCI.pViewportState = &viewportState;
|
pipelineLibraryCI.pViewportState = &viewportState;
|
||||||
pipelineLibraryCI.pRasterizationState = &rasterizationState;
|
pipelineLibraryCI.pRasterizationState = &rasterizationState;
|
||||||
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineLibraryCI, nullptr, &pipelineLibrary.preRasterizationShaders));
|
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineLibraryCI, nullptr, &pipelineLibrary.preRasterizationShaders));
|
||||||
|
|
||||||
|
delete[] shaderInfo.code;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a pipeline library for the fragment output interface
|
// Create a pipeline library for the fragment output interface
|
||||||
|
|
@ -442,6 +442,8 @@ public:
|
||||||
pipelines.push_back(executable);
|
pipelines.push_back(executable);
|
||||||
// Push fragment shader to list for deletion in the sample's destructor
|
// Push fragment shader to list for deletion in the sample's destructor
|
||||||
pipelineLibrary.fragmentShaders.push_back(fragmentShader);
|
pipelineLibrary.fragmentShaders.push_back(fragmentShader);
|
||||||
|
|
||||||
|
delete[] shaderInfo.code;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prepare and initialize uniform buffer containing shader uniforms
|
// Prepare and initialize uniform buffer containing shader uniforms
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Vulkan Example - CPU based fire particle system
|
* Vulkan Example - CPU based particle system
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de
|
* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de
|
||||||
*
|
*
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||||
*/
|
*/
|
||||||
|
|
@ -402,7 +402,7 @@ public:
|
||||||
// Binding 1: Fire texture array
|
// Binding 1: Fire texture array
|
||||||
vks::initializers::writeDescriptorSet(descriptorSets.particles, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2, &texDescriptorFire)
|
vks::initializers::writeDescriptorSet(descriptorSets.particles, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2, &texDescriptorFire)
|
||||||
};
|
};
|
||||||
vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL);
|
vkUpdateDescriptorSets(device, static_cast<uint32_t>(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr);
|
||||||
|
|
||||||
// Environment
|
// Environment
|
||||||
VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.environment));
|
VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.environment));
|
||||||
|
|
@ -415,7 +415,7 @@ public:
|
||||||
// Binding 2: Normal map
|
// Binding 2: Normal map
|
||||||
vks::initializers::writeDescriptorSet(descriptorSets.environment, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2, &textures.floor.normalMap.descriptor),
|
vks::initializers::writeDescriptorSet(descriptorSets.environment, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2, &textures.floor.normalMap.descriptor),
|
||||||
};
|
};
|
||||||
vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL);
|
vkUpdateDescriptorSets(device, static_cast<uint32_t>(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void preparePipelines()
|
void preparePipelines()
|
||||||
|
|
@ -439,7 +439,7 @@ public:
|
||||||
pipelineCI.pViewportState = &viewportState;
|
pipelineCI.pViewportState = &viewportState;
|
||||||
pipelineCI.pDepthStencilState = &depthStencilState;
|
pipelineCI.pDepthStencilState = &depthStencilState;
|
||||||
pipelineCI.pDynamicState = &dynamicState;
|
pipelineCI.pDynamicState = &dynamicState;
|
||||||
pipelineCI.stageCount = shaderStages.size();
|
pipelineCI.stageCount = static_cast<uint32_t>(shaderStages.size());
|
||||||
pipelineCI.pStages = shaderStages.data();
|
pipelineCI.pStages = shaderStages.data();
|
||||||
|
|
||||||
// Particle rendering pipeline
|
// Particle rendering pipeline
|
||||||
|
|
@ -478,8 +478,8 @@ public:
|
||||||
blendAttachmentState.alphaBlendOp = VK_BLEND_OP_ADD;
|
blendAttachmentState.alphaBlendOp = VK_BLEND_OP_ADD;
|
||||||
blendAttachmentState.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
|
blendAttachmentState.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
|
||||||
|
|
||||||
shaderStages[0] = loadShader(getShadersPath() + "particlefire/particle.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
|
shaderStages[0] = loadShader(getShadersPath() + "particlesystem/particle.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
|
||||||
shaderStages[1] = loadShader(getShadersPath() + "particlefire/particle.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
|
shaderStages[1] = loadShader(getShadersPath() + "particlesystem/particle.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.particles));
|
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.particles));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -492,8 +492,8 @@ public:
|
||||||
depthStencilState.depthWriteEnable = VK_TRUE;
|
depthStencilState.depthWriteEnable = VK_TRUE;
|
||||||
inputAssemblyState.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
inputAssemblyState.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
||||||
|
|
||||||
shaderStages[0] = loadShader(getShadersPath() + "particlefire/normalmap.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
|
shaderStages[0] = loadShader(getShadersPath() + "particlesystem/normalmap.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
|
||||||
shaderStages[1] = loadShader(getShadersPath() + "particlefire/normalmap.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
|
shaderStages[1] = loadShader(getShadersPath() + "particlesystem/normalmap.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.environment));
|
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.environment));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Vulkan Example - Using different pipelines in one single renderpass
|
* Vulkan Example - Using different pipelines in one single renderpass
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de
|
* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de
|
||||||
*
|
*
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||||
*/
|
*/
|
||||||
|
|
@ -112,14 +112,14 @@ public:
|
||||||
scene.bindBuffers(drawCmdBuffers[i]);
|
scene.bindBuffers(drawCmdBuffers[i]);
|
||||||
|
|
||||||
// Left : Solid colored
|
// Left : Solid colored
|
||||||
viewport.width = (float)width / 3.0;
|
viewport.width = (float)width / 3.0f;
|
||||||
vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport);
|
vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport);
|
||||||
vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.phong);
|
vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.phong);
|
||||||
vkCmdSetLineWidth(drawCmdBuffers[i], 1.0f);
|
vkCmdSetLineWidth(drawCmdBuffers[i], 1.0f);
|
||||||
scene.draw(drawCmdBuffers[i]);
|
scene.draw(drawCmdBuffers[i]);
|
||||||
|
|
||||||
// Center : Toon
|
// Center : Toon
|
||||||
viewport.x = (float)width / 3.0;
|
viewport.x = (float)width / 3.0f;
|
||||||
vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport);
|
vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport);
|
||||||
vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.toon);
|
vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.toon);
|
||||||
// Line width > 1.0f only if wide lines feature is supported
|
// Line width > 1.0f only if wide lines feature is supported
|
||||||
|
|
@ -131,7 +131,7 @@ public:
|
||||||
if (enabledFeatures.fillModeNonSolid)
|
if (enabledFeatures.fillModeNonSolid)
|
||||||
{
|
{
|
||||||
// Right : Wireframe
|
// Right : Wireframe
|
||||||
viewport.x = (float)width / 3.0 + (float)width / 3.0;
|
viewport.x = (float)width / 3.0f + (float)width / 3.0f;
|
||||||
vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport);
|
vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport);
|
||||||
vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.wireframe);
|
vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.wireframe);
|
||||||
scene.draw(drawCmdBuffers[i]);
|
scene.draw(drawCmdBuffers[i]);
|
||||||
|
|
@ -159,10 +159,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
VkDescriptorPoolCreateInfo descriptorPoolInfo =
|
VkDescriptorPoolCreateInfo descriptorPoolInfo =
|
||||||
vks::initializers::descriptorPoolCreateInfo(
|
vks::initializers::descriptorPoolCreateInfo(poolSizes, 2);
|
||||||
poolSizes.size(),
|
|
||||||
poolSizes.data(),
|
|
||||||
2);
|
|
||||||
|
|
||||||
VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool));
|
VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool));
|
||||||
}
|
}
|
||||||
|
|
@ -213,7 +210,7 @@ public:
|
||||||
&uniformBuffer.descriptor)
|
&uniformBuffer.descriptor)
|
||||||
};
|
};
|
||||||
|
|
||||||
vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL);
|
vkUpdateDescriptorSets(device, static_cast<uint32_t>(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void preparePipelines()
|
void preparePipelines()
|
||||||
|
|
@ -237,7 +234,7 @@ public:
|
||||||
pipelineCI.pViewportState = &viewportState;
|
pipelineCI.pViewportState = &viewportState;
|
||||||
pipelineCI.pDepthStencilState = &depthStencilState;
|
pipelineCI.pDepthStencilState = &depthStencilState;
|
||||||
pipelineCI.pDynamicState = &dynamicState;
|
pipelineCI.pDynamicState = &dynamicState;
|
||||||
pipelineCI.stageCount = shaderStages.size();
|
pipelineCI.stageCount = static_cast<uint32_t>(shaderStages.size());
|
||||||
pipelineCI.pStages = shaderStages.data();
|
pipelineCI.pStages = shaderStages.data();
|
||||||
pipelineCI.pVertexInputState = vkglTF::Vertex::getPipelineVertexInputState({vkglTF::VertexComponent::Position, vkglTF::VertexComponent::Normal, vkglTF::VertexComponent::Color});
|
pipelineCI.pVertexInputState = vkglTF::Vertex::getPipelineVertexInputState({vkglTF::VertexComponent::Position, vkglTF::VertexComponent::Normal, vkglTF::VertexComponent::Color});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -119,13 +119,13 @@ public:
|
||||||
|
|
||||||
// Spheres
|
// Spheres
|
||||||
VK_CHECK_RESULT(vulkanDevice->createBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &stagingBuffer, sizeof(Sphere)* spheres.size(), spheres.data()));
|
VK_CHECK_RESULT(vulkanDevice->createBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &stagingBuffer, sizeof(Sphere)* spheres.size(), spheres.data()));
|
||||||
VK_CHECK_RESULT(vulkanDevice->createBuffer(usageFlags, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &spheresBuffer, sizeof(Sphere)* spheres.size()));
|
VK_CHECK_RESULT(vulkanDevice->createBuffer(usageFlags, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &spheresBuffer, sizeof(Sphere)* spheres.size()));
|
||||||
vulkanDevice->copyBuffer(&stagingBuffer, &spheresBuffer, queue);
|
vulkanDevice->copyBuffer(&stagingBuffer, &spheresBuffer, queue);
|
||||||
stagingBuffer.destroy();
|
stagingBuffer.destroy();
|
||||||
|
|
||||||
// AABBs
|
// AABBs
|
||||||
VK_CHECK_RESULT(vulkanDevice->createBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &stagingBuffer, sizeof(AABB)* aabbs.size(), aabbs.data()));
|
VK_CHECK_RESULT(vulkanDevice->createBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &stagingBuffer, sizeof(AABB)* aabbs.size(), aabbs.data()));
|
||||||
VK_CHECK_RESULT(vulkanDevice->createBuffer(usageFlags, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &aabbsBuffer, sizeof(AABB)* aabbs.size()));
|
VK_CHECK_RESULT(vulkanDevice->createBuffer(usageFlags, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &aabbsBuffer, sizeof(AABB)* aabbs.size()));
|
||||||
vulkanDevice->copyBuffer(&stagingBuffer, &aabbsBuffer, queue);
|
vulkanDevice->copyBuffer(&stagingBuffer, &aabbsBuffer, queue);
|
||||||
stagingBuffer.destroy();
|
stagingBuffer.destroy();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Vulkan Example - Taking screenshots
|
* Vulkan Example - Taking screenshots
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de
|
* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de
|
||||||
*
|
*
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||||
*/
|
*/
|
||||||
|
|
@ -125,7 +125,7 @@ public:
|
||||||
std::vector<VkWriteDescriptorSet> writeDescriptorSets = {
|
std::vector<VkWriteDescriptorSet> writeDescriptorSets = {
|
||||||
vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffer.descriptor), // Binding 0: Vertex shader uniform buffer
|
vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffer.descriptor), // Binding 0: Vertex shader uniform buffer
|
||||||
};
|
};
|
||||||
vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, nullptr);
|
vkUpdateDescriptorSets(device, static_cast<uint32_t>(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void preparePipelines()
|
void preparePipelines()
|
||||||
|
|
@ -153,7 +153,7 @@ public:
|
||||||
pipelineCI.pViewportState = &viewportState;
|
pipelineCI.pViewportState = &viewportState;
|
||||||
pipelineCI.pDepthStencilState = &depthStencilState;
|
pipelineCI.pDepthStencilState = &depthStencilState;
|
||||||
pipelineCI.pDynamicState = &dynamicState;
|
pipelineCI.pDynamicState = &dynamicState;
|
||||||
pipelineCI.stageCount = shaderStages.size();
|
pipelineCI.stageCount = static_cast<uint32_t>(shaderStages.size());
|
||||||
pipelineCI.pStages = shaderStages.data();
|
pipelineCI.pStages = shaderStages.data();
|
||||||
pipelineCI.pVertexInputState = vkglTF::Vertex::getPipelineVertexInputState({vkglTF::VertexComponent::Position, vkglTF::VertexComponent::Normal, vkglTF::VertexComponent::Color});
|
pipelineCI.pVertexInputState = vkglTF::Vertex::getPipelineVertexInputState({vkglTF::VertexComponent::Position, vkglTF::VertexComponent::Normal, vkglTF::VertexComponent::Color});
|
||||||
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipeline));
|
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipeline));
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* Based on https://www.clicktorelease.com/blog/creating-spherical-environment-mapping-shader
|
* Based on https://www.clicktorelease.com/blog/creating-spherical-environment-mapping-shader
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de
|
* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de
|
||||||
*
|
*
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||||
*/
|
*/
|
||||||
|
|
@ -120,10 +120,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
VkDescriptorPoolCreateInfo descriptorPoolInfo =
|
VkDescriptorPoolCreateInfo descriptorPoolInfo =
|
||||||
vks::initializers::descriptorPoolCreateInfo(
|
vks::initializers::descriptorPoolCreateInfo(poolSizes, 2);
|
||||||
poolSizes.size(),
|
|
||||||
poolSizes.data(),
|
|
||||||
2);
|
|
||||||
|
|
||||||
VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool));
|
VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool));
|
||||||
}
|
}
|
||||||
|
|
@ -145,9 +142,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
VkDescriptorSetLayoutCreateInfo descriptorLayout =
|
VkDescriptorSetLayoutCreateInfo descriptorLayout =
|
||||||
vks::initializers::descriptorSetLayoutCreateInfo(
|
vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings);
|
||||||
setLayoutBindings.data(),
|
|
||||||
setLayoutBindings.size());
|
|
||||||
|
|
||||||
VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout));
|
VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout));
|
||||||
|
|
||||||
|
|
@ -185,7 +180,7 @@ public:
|
||||||
&matCapTextureArray.descriptor)
|
&matCapTextureArray.descriptor)
|
||||||
};
|
};
|
||||||
|
|
||||||
vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL);
|
vkUpdateDescriptorSets(device, static_cast<uint32_t>(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void preparePipelines()
|
void preparePipelines()
|
||||||
|
|
@ -209,7 +204,7 @@ public:
|
||||||
pipelineCI.pViewportState = &viewportState;
|
pipelineCI.pViewportState = &viewportState;
|
||||||
pipelineCI.pDepthStencilState = &depthStencilState;
|
pipelineCI.pDepthStencilState = &depthStencilState;
|
||||||
pipelineCI.pDynamicState = &dynamicState;
|
pipelineCI.pDynamicState = &dynamicState;
|
||||||
pipelineCI.stageCount = shaderStages.size();
|
pipelineCI.stageCount = static_cast<uint32_t>(shaderStages.size());
|
||||||
pipelineCI.pStages = shaderStages.data();
|
pipelineCI.pStages = shaderStages.data();
|
||||||
pipelineCI.pVertexInputState = vkglTF::Vertex::getPipelineVertexInputState({vkglTF::VertexComponent::Position, vkglTF::VertexComponent::Normal, vkglTF::VertexComponent::Color});
|
pipelineCI.pVertexInputState = vkglTF::Vertex::getPipelineVertexInputState({vkglTF::VertexComponent::Position, vkglTF::VertexComponent::Normal, vkglTF::VertexComponent::Color});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Vulkan Example - Texture arrays and instanced rendering
|
* Vulkan Example - Texture arrays and instanced rendering
|
||||||
*
|
*
|
||||||
* Copyright (C) Sascha Willems - www.saschawillems.de
|
* Copyright (C) 2016-2023 Sascha Willems - www.saschawillems.de
|
||||||
*
|
*
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||||
*/
|
*/
|
||||||
|
|
@ -226,9 +226,8 @@ public:
|
||||||
stagingBuffer,
|
stagingBuffer,
|
||||||
textureArray.image,
|
textureArray.image,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||||
bufferCopyRegions.size(),
|
static_cast<uint32_t>(bufferCopyRegions.size()),
|
||||||
bufferCopyRegions.data()
|
bufferCopyRegions.data());
|
||||||
);
|
|
||||||
|
|
||||||
// Change texture image layout to shader read after all faces have been copied
|
// Change texture image layout to shader read after all faces have been copied
|
||||||
textureArray.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
textureArray.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||||
|
|
@ -388,7 +387,7 @@ public:
|
||||||
vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1),
|
vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1),
|
||||||
vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1)
|
vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1)
|
||||||
};
|
};
|
||||||
VkDescriptorPoolCreateInfo descriptorPoolInfo = vks::initializers::descriptorPoolCreateInfo(poolSizes.size(), poolSizes.data(), 2);
|
VkDescriptorPoolCreateInfo descriptorPoolInfo = vks::initializers::descriptorPoolCreateInfo(poolSizes, 2);
|
||||||
VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool));
|
VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -400,7 +399,7 @@ public:
|
||||||
// Binding 1 : Fragment shader image sampler (texture array)
|
// Binding 1 : Fragment shader image sampler (texture array)
|
||||||
vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 1)
|
vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 1)
|
||||||
};
|
};
|
||||||
VkDescriptorSetLayoutCreateInfo descriptorLayout = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings.data(), setLayoutBindings.size());
|
VkDescriptorSetLayoutCreateInfo descriptorLayout = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings);
|
||||||
VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout));
|
VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout));
|
||||||
|
|
||||||
VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo = vks::initializers::pipelineLayoutCreateInfo(&descriptorSetLayout, 1);
|
VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo = vks::initializers::pipelineLayoutCreateInfo(&descriptorSetLayout, 1);
|
||||||
|
|
@ -425,7 +424,7 @@ public:
|
||||||
// Binding 1 : Fragment shader cubemap sampler
|
// Binding 1 : Fragment shader cubemap sampler
|
||||||
vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &textureDescriptor)
|
vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &textureDescriptor)
|
||||||
};
|
};
|
||||||
vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL);
|
vkUpdateDescriptorSets(device, static_cast<uint32_t>(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void preparePipelines()
|
void preparePipelines()
|
||||||
|
|
@ -438,7 +437,7 @@ public:
|
||||||
VkPipelineViewportStateCreateInfo viewportStateCI = vks::initializers::pipelineViewportStateCreateInfo(1, 1, 0);
|
VkPipelineViewportStateCreateInfo viewportStateCI = vks::initializers::pipelineViewportStateCreateInfo(1, 1, 0);
|
||||||
VkPipelineMultisampleStateCreateInfo multisampleStateCI = vks::initializers::pipelineMultisampleStateCreateInfo(VK_SAMPLE_COUNT_1_BIT, 0);
|
VkPipelineMultisampleStateCreateInfo multisampleStateCI = vks::initializers::pipelineMultisampleStateCreateInfo(VK_SAMPLE_COUNT_1_BIT, 0);
|
||||||
std::vector<VkDynamicState> dynamicStateEnables = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR };
|
std::vector<VkDynamicState> dynamicStateEnables = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR };
|
||||||
VkPipelineDynamicStateCreateInfo dynamicStateCI = vks::initializers::pipelineDynamicStateCreateInfo(dynamicStateEnables.data(), dynamicStateEnables.size(), 0);
|
VkPipelineDynamicStateCreateInfo dynamicStateCI = vks::initializers::pipelineDynamicStateCreateInfo(dynamicStateEnables, 0);
|
||||||
|
|
||||||
// Vertex bindings and attributes
|
// Vertex bindings and attributes
|
||||||
VkVertexInputBindingDescription vertexInputBinding = { 0, sizeof(Vertex), VK_VERTEX_INPUT_RATE_VERTEX };
|
VkVertexInputBindingDescription vertexInputBinding = { 0, sizeof(Vertex), VK_VERTEX_INPUT_RATE_VERTEX };
|
||||||
|
|
@ -467,7 +466,7 @@ public:
|
||||||
pipelineCI.pViewportState = &viewportStateCI;
|
pipelineCI.pViewportState = &viewportStateCI;
|
||||||
pipelineCI.pDepthStencilState = &depthStencilStateCI;
|
pipelineCI.pDepthStencilState = &depthStencilStateCI;
|
||||||
pipelineCI.pDynamicState = &dynamicStateCI;
|
pipelineCI.pDynamicState = &dynamicStateCI;
|
||||||
pipelineCI.stageCount = shaderStages.size();
|
pipelineCI.stageCount = static_cast<uint32_t>(shaderStages.size());
|
||||||
pipelineCI.pStages = shaderStages.data();
|
pipelineCI.pStages = shaderStages.data();
|
||||||
|
|
||||||
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipeline));
|
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipeline));
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Vulkan Example - Cube map texture loading and displaying
|
* Vulkan Example - Cube map texture loading and displaying
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de
|
* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de
|
||||||
*
|
*
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||||
*/
|
*/
|
||||||
|
|
@ -256,7 +256,7 @@ public:
|
||||||
sampler.mipLodBias = 0.0f;
|
sampler.mipLodBias = 0.0f;
|
||||||
sampler.compareOp = VK_COMPARE_OP_NEVER;
|
sampler.compareOp = VK_COMPARE_OP_NEVER;
|
||||||
sampler.minLod = 0.0f;
|
sampler.minLod = 0.0f;
|
||||||
sampler.maxLod = cubeMap.mipLevels;
|
sampler.maxLod = static_cast<float>(cubeMap.mipLevels);
|
||||||
sampler.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
|
sampler.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
|
||||||
sampler.maxAnisotropy = 1.0f;
|
sampler.maxAnisotropy = 1.0f;
|
||||||
if (vulkanDevice->features.samplerAnisotropy)
|
if (vulkanDevice->features.samplerAnisotropy)
|
||||||
|
|
@ -364,10 +364,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
VkDescriptorPoolCreateInfo descriptorPoolInfo =
|
VkDescriptorPoolCreateInfo descriptorPoolInfo =
|
||||||
vks::initializers::descriptorPoolCreateInfo(
|
vks::initializers::descriptorPoolCreateInfo(poolSizes, 2);
|
||||||
poolSizes.size(),
|
|
||||||
poolSizes.data(),
|
|
||||||
2);
|
|
||||||
|
|
||||||
VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool));
|
VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool));
|
||||||
}
|
}
|
||||||
|
|
@ -436,7 +433,7 @@ public:
|
||||||
1,
|
1,
|
||||||
&textureDescriptor)
|
&textureDescriptor)
|
||||||
};
|
};
|
||||||
vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL);
|
vkUpdateDescriptorSets(device, static_cast<uint32_t>(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr);
|
||||||
|
|
||||||
// Sky box descriptor set
|
// Sky box descriptor set
|
||||||
VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.skybox));
|
VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.skybox));
|
||||||
|
|
@ -456,7 +453,7 @@ public:
|
||||||
1,
|
1,
|
||||||
&textureDescriptor)
|
&textureDescriptor)
|
||||||
};
|
};
|
||||||
vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL);
|
vkUpdateDescriptorSets(device, static_cast<uint32_t>(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void preparePipelines()
|
void preparePipelines()
|
||||||
|
|
@ -480,7 +477,7 @@ public:
|
||||||
pipelineCI.pViewportState = &viewportState;
|
pipelineCI.pViewportState = &viewportState;
|
||||||
pipelineCI.pDepthStencilState = &depthStencilState;
|
pipelineCI.pDepthStencilState = &depthStencilState;
|
||||||
pipelineCI.pDynamicState = &dynamicState;
|
pipelineCI.pDynamicState = &dynamicState;
|
||||||
pipelineCI.stageCount = shaderStages.size();
|
pipelineCI.stageCount = static_cast<uint32_t>(shaderStages.size());
|
||||||
pipelineCI.pStages = shaderStages.data();
|
pipelineCI.pStages = shaderStages.data();
|
||||||
pipelineCI.pVertexInputState = vkglTF::Vertex::getPipelineVertexInputState({ vkglTF::VertexComponent::Position, vkglTF::VertexComponent::Normal });
|
pipelineCI.pVertexInputState = vkglTF::Vertex::getPipelineVertexInputState({ vkglTF::VertexComponent::Position, vkglTF::VertexComponent::Normal });
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Vulkan Example - Runtime mip map generation
|
* Vulkan Example - Runtime mip map generation
|
||||||
*
|
*
|
||||||
* Copyright (C) by Sascha Willems - www.saschawillems.de
|
* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de
|
||||||
*
|
*
|
||||||
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||||
*/
|
*/
|
||||||
|
|
@ -224,7 +224,7 @@ public:
|
||||||
VkCommandBuffer blitCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
|
VkCommandBuffer blitCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
|
||||||
|
|
||||||
// Copy down mips from n-1 to n
|
// Copy down mips from n-1 to n
|
||||||
for (int32_t i = 1; i < texture.mipLevels; i++)
|
for (uint32_t i = 1; i < texture.mipLevels; i++)
|
||||||
{
|
{
|
||||||
VkImageBlit imageBlit{};
|
VkImageBlit imageBlit{};
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -3,11 +3,9 @@
|
||||||
*
|
*
|
||||||
* Don't take this a an example, it's more of a personal playground
|
* Don't take this a an example, it's more of a personal playground
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de
|
* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de
|
||||||
*
|
*
|
||||||
* Note : Different license than the other examples!
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
||||||
*
|
|
||||||
* This code is licensed under the Mozilla Public License Version 2.0 (http://opensource.org/licenses/MPL-2.0)
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "vulkanexamplebase.h"
|
#include "vulkanexamplebase.h"
|
||||||
|
|
@ -157,10 +155,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
VkDescriptorPoolCreateInfo descriptorPoolInfo =
|
VkDescriptorPoolCreateInfo descriptorPoolInfo =
|
||||||
vks::initializers::descriptorPoolCreateInfo(
|
vks::initializers::descriptorPoolCreateInfo(poolSizes, 2);
|
||||||
poolSizes.size(),
|
|
||||||
poolSizes.data(),
|
|
||||||
2);
|
|
||||||
|
|
||||||
VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool));
|
VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool));
|
||||||
}
|
}
|
||||||
|
|
@ -182,9 +177,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
VkDescriptorSetLayoutCreateInfo descriptorLayout =
|
VkDescriptorSetLayoutCreateInfo descriptorLayout =
|
||||||
vks::initializers::descriptorSetLayoutCreateInfo(
|
vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings);
|
||||||
setLayoutBindings.data(),
|
|
||||||
setLayoutBindings.size());
|
|
||||||
|
|
||||||
VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout));
|
VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout));
|
||||||
|
|
||||||
|
|
@ -229,7 +222,7 @@ public:
|
||||||
&texDescriptorCubeMap)
|
&texDescriptorCubeMap)
|
||||||
};
|
};
|
||||||
|
|
||||||
vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL);
|
vkUpdateDescriptorSets(device, static_cast<uint32_t>(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void preparePipelines()
|
void preparePipelines()
|
||||||
|
|
@ -252,7 +245,7 @@ public:
|
||||||
pipelineCI.pViewportState = &viewportState;
|
pipelineCI.pViewportState = &viewportState;
|
||||||
pipelineCI.pDepthStencilState = &depthStencilState;
|
pipelineCI.pDepthStencilState = &depthStencilState;
|
||||||
pipelineCI.pDynamicState = &dynamicState;
|
pipelineCI.pDynamicState = &dynamicState;
|
||||||
pipelineCI.stageCount = shaderStages.size();
|
pipelineCI.stageCount = static_cast<uint32_t>(shaderStages.size());
|
||||||
pipelineCI.pStages = shaderStages.data();
|
pipelineCI.pStages = shaderStages.data();
|
||||||
pipelineCI.pVertexInputState = vkglTF::Vertex::getPipelineVertexInputState({ vkglTF::VertexComponent::Position, vkglTF::VertexComponent::Normal, vkglTF::VertexComponent::UV, vkglTF::VertexComponent::Color });;
|
pipelineCI.pVertexInputState = vkglTF::Vertex::getPipelineVertexInputState({ vkglTF::VertexComponent::Position, vkglTF::VertexComponent::Normal, vkglTF::VertexComponent::UV, vkglTF::VertexComponent::Color });;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ These can be compiled with [DXC](https://github.com/microsoft/DirectXShaderCompi
|
||||||
### Known issues
|
### Known issues
|
||||||
|
|
||||||
- specialization constants can't be used to specify array size.
|
- specialization constants can't be used to specify array size.
|
||||||
- `gl_PointCoord` not supported. HLSL has no equivalent. We changed the shaders to calulate the PointCoord manually in the shader. (`computenbody`, `computeparticles`, `particlefire` examples).
|
- `gl_PointCoord` not supported. HLSL has no equivalent. We changed the shaders to calulate the PointCoord manually in the shader. (`computenbody`, `computeparticles`, `particlesystem` examples).
|
||||||
- HLSL doesn't have inverse operation (`deferred`, `hdr`, `instancing`, `skeletalanimation` & `texturecubemap` examples).
|
- HLSL doesn't have inverse operation (`deferred`, `hdr`, `instancing`, `skeletalanimation` & `texturecubemap` examples).
|
||||||
- `modf` causes compilation to fail without errors or warnings. (`modf` not used by any examples, easily confused with fmod)
|
- `modf` causes compilation to fail without errors or warnings. (`modf` not used by any examples, easily confused with fmod)
|
||||||
- In `specializationconstants` example, shader compilation fails with error:
|
- In `specializationconstants` example, shader compilation fails with error:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue