mirror of
https://github.com/Kugelschieber/vk-experiments.git
synced 2026-01-18 06:40:27 +00:00
Started adding validation layer.
This commit is contained in:
14
run.sh
14
run.sh
@@ -1,6 +1,14 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
mkdir -p build
|
echo "Building..."
|
||||||
gcc `pkg-config --static --libs glfw3` -c src/window.c -o build/window.o
|
rm -rf ./build
|
||||||
gcc `pkg-config --static --libs glfw3` build/window.o -o main src/main.c
|
mkdir -p ./build
|
||||||
|
gcc -c src/log.c -o build/log.o || exit
|
||||||
|
gcc `pkg-config --static --libs glfw3` -c src/window.c -o build/window.o || exit
|
||||||
|
gcc `pkg-config --static --libs glfw3` \
|
||||||
|
`pkg-config --static --libs vulkan` \
|
||||||
|
build/log.o \
|
||||||
|
build/window.o \
|
||||||
|
-o main src/main.c || exit
|
||||||
|
echo "Done. Starting app..."
|
||||||
./main
|
./main
|
||||||
|
|||||||
37
src/log.c
Normal file
37
src/log.c
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
#include "log.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int logLevel = 0;
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
/*const char* timeStr() {
|
||||||
|
time_t now = time(NULL);
|
||||||
|
struct tm * p = localtime(&now);
|
||||||
|
char buffer[25];
|
||||||
|
strftime(buffer, 25, "%Y-%m-%d %H:%M:%S", p);
|
||||||
|
//buffer[24] = '\0';
|
||||||
|
const char* str = buffer;
|
||||||
|
return str;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
void vkeSetLogLevel(int level) {
|
||||||
|
logLevel = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vkeLogDebug(const char* message) {
|
||||||
|
if(logLevel == 0) {
|
||||||
|
time_t now;
|
||||||
|
time(&now);
|
||||||
|
printf("%s [DEBUG] %s\n", ctime(&now), message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void vkeLogError(const char* message) {
|
||||||
|
if(logLevel > 0) {
|
||||||
|
time_t now;
|
||||||
|
time(&now);
|
||||||
|
printf("%s [ERROR] %s\n", ctime(&now), message);
|
||||||
|
}
|
||||||
|
}
|
||||||
16
src/log.h
Normal file
16
src/log.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#ifndef VKE_LOG_H
|
||||||
|
#define VKE_LOG_H
|
||||||
|
|
||||||
|
#define VKE_LOG_DEBUG = 0
|
||||||
|
#define VKE_LOG_ERROR = 1
|
||||||
|
|
||||||
|
// Sets the global log level (VKE_LOG_DEBUG by default).
|
||||||
|
void vkeSetLogLevel(int level);
|
||||||
|
|
||||||
|
// Logs the given message with the DEBUG tag.
|
||||||
|
void vkeLogDebug(const char* message);
|
||||||
|
|
||||||
|
// Logs the given message with the ERROR tag.
|
||||||
|
void vkeLogError(const char* message);
|
||||||
|
|
||||||
|
#endif
|
||||||
109
src/main.c
109
src/main.c
@@ -1,7 +1,97 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
#include <vulkan/vulkan.h>
|
||||||
|
#include "log.h"
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
|
||||||
|
struct VKEContext {
|
||||||
|
VkInstance instance;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VKEConfig {
|
||||||
|
const char* title;
|
||||||
|
int validationLayerCount;
|
||||||
|
const char** validationLayers;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool vkeCheckValidationLayerSupport(const char** validationLayers, int n) {
|
||||||
|
if(n == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t layerCount;
|
||||||
|
vkEnumerateInstanceLayerProperties(&layerCount, NULL);
|
||||||
|
VkLayerProperties availableLayers[layerCount];
|
||||||
|
vkEnumerateInstanceLayerProperties(&layerCount, availableLayers);
|
||||||
|
|
||||||
|
for(int i = 0; i < n; i++) {
|
||||||
|
bool layerFound = false;
|
||||||
|
|
||||||
|
for(int j = 0; j < layerCount; j++) {
|
||||||
|
if(strcmp(validationLayers[i], availableLayers[j].layerName) == 0) {
|
||||||
|
layerFound = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!layerFound) {
|
||||||
|
// log supported validation layers
|
||||||
|
for(int j = 0; j < layerCount; j++) {
|
||||||
|
vkeLogDebug(availableLayers[j].layerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int vkeInit(struct VKEContext* ctx, struct VKEConfig* config) {
|
||||||
|
if(!vkeCheckValidationLayerSupport(config->validationLayers, config->validationLayerCount)) {
|
||||||
|
vkeLogError("validation layer not supported\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t glfwExtensionCount = 0;
|
||||||
|
const char** glfwExtensions;
|
||||||
|
glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
|
||||||
|
VkApplicationInfo appInfo = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
|
||||||
|
.pApplicationName = config->title,
|
||||||
|
.applicationVersion = VK_MAKE_VERSION(1, 0, 0),
|
||||||
|
.pEngineName = "No Engine",
|
||||||
|
.engineVersion = VK_MAKE_VERSION(1, 0, 0),
|
||||||
|
.apiVersion = VK_API_VERSION_1_0
|
||||||
|
};
|
||||||
|
VkInstanceCreateInfo createInfo = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
|
||||||
|
.enabledExtensionCount = glfwExtensionCount,
|
||||||
|
.ppEnabledExtensionNames = glfwExtensions,
|
||||||
|
.enabledLayerCount = 0,
|
||||||
|
.pApplicationInfo = &appInfo
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
/*if(config->validationLayerCount > 0) {
|
||||||
|
createInfo.enabledLayerCount = config->validationLayerCount;
|
||||||
|
createInfo.ppEnabledExtensionNames = config->validationLayers;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
if(vkCreateInstance(&createInfo, NULL, &ctx->instance) != VK_SUCCESS) {
|
||||||
|
vkeLogError("error creating vulkan instance\n");
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vkeDestroy(struct VKEContext* ctx) {
|
||||||
|
vkDestroyInstance(ctx->instance, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void loop(GLFWwindow* window) {
|
void loop(GLFWwindow* window) {
|
||||||
while(!glfwWindowShouldClose(window)) {
|
while(!glfwWindowShouldClose(window)) {
|
||||||
// ...
|
// ...
|
||||||
@@ -10,13 +100,30 @@ void loop(GLFWwindow* window) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, const char *argv[]) {
|
int main(int argc, const char *argv[]) {
|
||||||
GLFWwindow* window = vkeCreateWindow("Test", 800, 600);
|
vkeSetLogLevel(0);
|
||||||
|
const char* title = "Test";
|
||||||
|
GLFWwindow* window = vkeCreateWindow(title, 800, 600);
|
||||||
|
|
||||||
if(window == NULL) {
|
if(window == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct VKEContext ctx;
|
||||||
|
const char* validationLayers[] = {
|
||||||
|
"VK_LAYER_KHRONOS_validation"
|
||||||
|
};
|
||||||
|
struct VKEConfig config = {
|
||||||
|
.title = title,
|
||||||
|
.validationLayerCount = 1,
|
||||||
|
.validationLayers = validationLayers
|
||||||
|
};
|
||||||
|
|
||||||
|
if(vkeInit(&ctx, &config) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
loop(window);
|
loop(window);
|
||||||
vkeDestroyWindow(window);
|
vkeDestroyWindow(window);
|
||||||
|
vkeDestroy(&ctx);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user