get OpenGL to work
This commit is contained in:
@@ -34,7 +34,7 @@ add_subdirectory(projects/core) # build gryphn core
|
|||||||
add_subdirectory(projects/extensions)
|
add_subdirectory(projects/extensions)
|
||||||
add_subdirectory(projects/platform) # build gryphn platform
|
add_subdirectory(projects/platform) # build gryphn platform
|
||||||
add_subdirectory(projects/validation_layers/function_loader/)
|
add_subdirectory(projects/validation_layers/function_loader/)
|
||||||
target_link_libraries(Gryphn INTERFACE GryphnUtils GryphnCore GryphnLoader GryphnPlatform GryphnFunctionValidator GryphnExtensions)
|
target_link_libraries(Gryphn INTERFACE GryphnCore GryphnLoader GryphnPlatform GryphnFunctionValidator GryphnExtensions)
|
||||||
|
|
||||||
if (VULKAN_BUILT)
|
if (VULKAN_BUILT)
|
||||||
target_link_libraries(Gryphn INTERFACE GryphnVulkanImpl)
|
target_link_libraries(Gryphn INTERFACE GryphnVulkanImpl)
|
||||||
@@ -45,3 +45,5 @@ endif()
|
|||||||
if (OPENGL_BUILT)
|
if (OPENGL_BUILT)
|
||||||
target_link_libraries(Gryphn INTERFACE GryphnOpenGLImpl)
|
target_link_libraries(Gryphn INTERFACE GryphnOpenGLImpl)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
target_link_libraries(Gryphn INTERFACE GryphnUtils)
|
||||||
|
8
projects/apis/opengl/loader/opengl_extensions.c
Normal file
8
projects/apis/opengl/loader/opengl_extensions.c
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#include "opengl_loader.h"
|
||||||
|
#include "gryphn_extensions.h"
|
||||||
|
|
||||||
|
gnBool openglIsExtensionSupported(gnExtension extension) {
|
||||||
|
if (extension == GN_EXT_SYNCHRONIZATION) return GN_FALSE;
|
||||||
|
if (extension == GN_EXT_QUEUES) return GN_FALSE;
|
||||||
|
return GN_FALSE;
|
||||||
|
}
|
@@ -4,12 +4,18 @@
|
|||||||
#include "device/opengl_physical_device.h"
|
#include "device/opengl_physical_device.h"
|
||||||
#include "device/opengl_output_device.h"
|
#include "device/opengl_output_device.h"
|
||||||
|
|
||||||
|
gryphnInstanceFunctionLayers loadOpenGLAPILayer() {
|
||||||
|
return (gryphnInstanceFunctionLayers) {
|
||||||
|
.createInstance = openglCreateInstance,
|
||||||
|
.destroyInstance = openglDestroyInstance,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
gnInstanceFunctions loadOpenGLInstanceFunctions() {
|
gnInstanceFunctions loadOpenGLInstanceFunctions() {
|
||||||
return (gnInstanceFunctions){
|
return (gnInstanceFunctions){
|
||||||
._gnCreateInstance = createOpenGLInstance,
|
|
||||||
._gnDestroyInstance = destroyOpenGLInstance,
|
|
||||||
._gnGetPhysicalDevices = getOpenGLDevice,
|
._gnGetPhysicalDevices = getOpenGLDevice,
|
||||||
._gnQueueCanPresentToSurface = openGLQueueCanPresent,
|
._gnPhysicalDeviceCanPresentToSurface = openglCanDevicePresent,
|
||||||
._gnCreateOutputDevice = createOpenGLOutputDevice,
|
._gnCreateOutputDevice = createOpenGLOutputDevice,
|
||||||
._gnDestroyOutputDevice = destroyOpenGLOutputDevice,
|
._gnDestroyOutputDevice = destroyOpenGLOutputDevice,
|
||||||
#ifdef GN_PLATFORM_LINUX
|
#ifdef GN_PLATFORM_LINUX
|
||||||
|
@@ -2,7 +2,11 @@
|
|||||||
#include "loader/src/gryphn_instance_functions.h"
|
#include "loader/src/gryphn_instance_functions.h"
|
||||||
#include "loader/src/gryphn_device_functions.h"
|
#include "loader/src/gryphn_device_functions.h"
|
||||||
#include "loader/src/gryphn_command_functions.h"
|
#include "loader/src/gryphn_command_functions.h"
|
||||||
|
#include "gryphn_extensions.h"
|
||||||
|
|
||||||
gnInstanceFunctions loadOpenGLInstanceFunctions();
|
gnInstanceFunctions loadOpenGLInstanceFunctions();
|
||||||
gnDeviceFunctions loadOpenGLDeviceFunctions();
|
gnDeviceFunctions loadOpenGLDeviceFunctions();
|
||||||
gnCommandFunctions loadOpenGLCommandFunctions();
|
gnCommandFunctions loadOpenGLCommandFunctions();
|
||||||
|
|
||||||
|
gryphnInstanceFunctionLayers loadOpenGLAPILayer();
|
||||||
|
gnBool openglIsExtensionSupported(gnExtension extension);
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
#include "opengl_output_device.h"
|
#include "opengl_output_device.h"
|
||||||
|
|
||||||
gnReturnCode createOpenGLOutputDevice(gnOutputDeviceHandle outputDevice, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo) { return GN_SUCCESS; }
|
gnReturnCode createOpenGLOutputDevice(gnInstanceHandle instance, gnOutputDeviceHandle device, gnOutputDeviceInfo deviceInfo) { return GN_SUCCESS; }
|
||||||
void waitForOpenGLDevice(const gnOutputDeviceHandle device) {}
|
void waitForOpenGLDevice(const gnOutputDeviceHandle device) {}
|
||||||
void destroyOpenGLOutputDevice(gnOutputDeviceHandle device) {}
|
void destroyOpenGLOutputDevice(gnOutputDeviceHandle device) {}
|
||||||
|
@@ -3,6 +3,6 @@
|
|||||||
|
|
||||||
typedef struct gnPlatformOutputDevice_t {} gnPlatformOutputDevice;
|
typedef struct gnPlatformOutputDevice_t {} gnPlatformOutputDevice;
|
||||||
|
|
||||||
gnReturnCode createOpenGLOutputDevice(gnOutputDeviceHandle outputDevice, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo);
|
gnReturnCode createOpenGLOutputDevice(gnInstanceHandle instance, gnOutputDeviceHandle device, gnOutputDeviceInfo deviceInfo);
|
||||||
void waitForOpenGLDevice(const gnOutputDeviceHandle device);
|
void waitForOpenGLDevice(const gnOutputDeviceHandle device);
|
||||||
void destroyOpenGLOutputDevice(gnOutputDeviceHandle device);
|
void destroyOpenGLOutputDevice(gnOutputDeviceHandle device);
|
||||||
|
@@ -1,11 +1,12 @@
|
|||||||
#include "opengl_physical_device.h"
|
#include "opengl_physical_device.h"
|
||||||
|
#include "stdlib.h"
|
||||||
|
|
||||||
gnPhysicalDevice* getOpenGLDevice(gnInstanceHandle instance, uint32_t* deviceCount) {
|
gnPhysicalDevice* getOpenGLDevice(gnInstanceHandle instance, uint32_t* deviceCount) {
|
||||||
*deviceCount = 1;
|
*deviceCount = 1;
|
||||||
|
|
||||||
gnPhysicalDevice* devices = malloc(sizeof(gnPhysicalDevice));
|
gnPhysicalDevice* devices = malloc(sizeof(gnPhysicalDevice));
|
||||||
|
devices[0] = malloc(sizeof(struct gnPhysicalOutputDevice_t));
|
||||||
gnPhysicalDevice device = {
|
*devices[0] = (struct gnPhysicalOutputDevice_t){
|
||||||
.physicalDevice = malloc(sizeof(gnPlatformPhysicalDevice)),
|
.physicalDevice = malloc(sizeof(gnPlatformPhysicalDevice)),
|
||||||
.features = {
|
.features = {
|
||||||
.maxColorSamples = GN_SAMPLE_BIT_1,
|
.maxColorSamples = GN_SAMPLE_BIT_1,
|
||||||
@@ -16,20 +17,10 @@ gnPhysicalDevice* getOpenGLDevice(gnInstanceHandle instance, uint32_t* deviceCou
|
|||||||
.properties = {
|
.properties = {
|
||||||
.deviceType = GN_DEDICATED_DEVICE,
|
.deviceType = GN_DEDICATED_DEVICE,
|
||||||
.name = gnCreateString("Generic OpenGL device")
|
.name = gnCreateString("Generic OpenGL device")
|
||||||
},
|
|
||||||
.queueProperties = {
|
|
||||||
.queueCount = 1,
|
|
||||||
.queueProperties = (gnQueueProperties[1]){
|
|
||||||
(gnQueueProperties){
|
|
||||||
.queueCount = 1,
|
|
||||||
.queueType = GN_QUEUE_GRAPHICS
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
devices[0] = device;
|
|
||||||
return devices;
|
return devices;
|
||||||
}
|
}
|
||||||
gnBool openGLQueueCanPresent(const gnPhysicalDevice device, uint32_t queueIndex, gnWindowSurfaceHandle windowSurface) {
|
gnBool openglCanDevicePresent(gnPhysicalDevice device, gnWindowSurfaceHandle windowSurface) {
|
||||||
return gnTrue;
|
return GN_TRUE;
|
||||||
}
|
}
|
||||||
|
@@ -5,4 +5,4 @@
|
|||||||
typedef struct gnPlatformPhysicalDevice_t {} gnPlatformPhysicalDevice;
|
typedef struct gnPlatformPhysicalDevice_t {} gnPlatformPhysicalDevice;
|
||||||
|
|
||||||
gnPhysicalDevice* getOpenGLDevice(gnInstanceHandle instance, uint32_t* deviceCount);
|
gnPhysicalDevice* getOpenGLDevice(gnInstanceHandle instance, uint32_t* deviceCount);
|
||||||
gnBool openGLQueueCanPresent(const gnPhysicalDevice device, uint32_t queueIndex, gnWindowSurfaceHandle windowSurface);
|
gnBool openglCanDevicePresent(gnPhysicalDevice device, gnWindowSurfaceHandle windowSurface);
|
||||||
|
@@ -1,8 +1,9 @@
|
|||||||
#include "opengl_instance.h"
|
#include "opengl_instance.h"
|
||||||
|
|
||||||
gnReturnCode createOpenGLInstance(gnInstanceHandle instance, gnInstanceInfo instanceInfo) {
|
gnReturnCode openglCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, gryphnInstanceFunctionLayers* next) {
|
||||||
|
if (instanceInfo->coreAPI != GN_RENDERINGAPI_OPENGL) return GN_UNSUPPORTED_API;
|
||||||
return GN_SUCCESS;
|
return GN_SUCCESS;
|
||||||
}
|
}
|
||||||
void destroyOpenGLInstance(gnInstanceHandle instance) {
|
void openglDestroyInstance(gnInstanceHandle instance, gryphnInstanceFunctionLayers* next) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -4,5 +4,5 @@
|
|||||||
|
|
||||||
typedef struct gnPlatformInstance_t {} gnPlatformInstance;
|
typedef struct gnPlatformInstance_t {} gnPlatformInstance;
|
||||||
|
|
||||||
gnReturnCode createOpenGLInstance(gnInstanceHandle instance, gnInstanceInfo instanceInfo);
|
gnReturnCode openglCreateInstance(gnInstanceHandle instance, gnInstanceCreateInfo* instanceInfo, gryphnInstanceFunctionLayers* next);
|
||||||
void destroyOpenGLInstance(gnInstanceHandle instance);
|
void openglDestroyInstance(gnInstanceHandle instance, gryphnInstanceFunctionLayers* next);
|
||||||
|
@@ -27,17 +27,21 @@ gnReturnCode createOpenGLPresentationQueue(gnPresentationQueueHandle presentatio
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
GLuintArrayListAdd(&presentationQueue->presentationQueue->textures, presentationQueue->images[i]->texture->id);
|
GLuintArrayListAdd(presentationQueue->presentationQueue->textures, presentationQueue->images[i]->texture->id);
|
||||||
uint32_tArrayListAdd(&presentationQueue->presentationQueue->avaliableTextures, i);
|
uint32_tArrayListAdd(presentationQueue->presentationQueue->avaliableTextures, i);
|
||||||
}
|
}
|
||||||
return GN_SUCCESS;
|
return GN_SUCCESS;
|
||||||
}
|
}
|
||||||
gnReturnCode getOpenGLPresentationQueueImage(gnPresentationQueue presentationQueue, uint32_t* imageIndex) {
|
gnReturnCode getOpenGLPresentationQueueImage(gnPresentationQueue presentationQueue, uint32_t* imageIndex) {
|
||||||
while (presentationQueue->presentationQueue->avaliableTextures.count == 0) {}
|
while (uint32_tArrayListCount(presentationQueue->presentationQueue->avaliableTextures) == 0) {}
|
||||||
*imageIndex = presentationQueue->presentationQueue->avaliableTextures.data[0];
|
*imageIndex = uint32_tArrayListAt(presentationQueue->presentationQueue->avaliableTextures, 0);
|
||||||
uint32_tArrayListPopHead(&presentationQueue->presentationQueue->avaliableTextures);
|
uint32_tArrayListPopHead(presentationQueue->presentationQueue->avaliableTextures);
|
||||||
return GN_SUCCESS;
|
return GN_SUCCESS;
|
||||||
}
|
}
|
||||||
void destroyOpenGLPresentationQueue(gnPresentationQueueHandle presentationQueue) {
|
void destroyOpenGLPresentationQueue(gnPresentationQueueHandle presentationQueue) {
|
||||||
free(presentationQueue->presentationQueue);
|
free(presentationQueue->presentationQueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GN_ARRAY_LIST_DEFINITION(GLuint);
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
#include <glad/glad.h>
|
#include <glad/glad.h>
|
||||||
#include "presentation_queue/gryphn_presentation_queue.h"
|
#include "presentation_queue/gryphn_presentation_queue.h"
|
||||||
|
|
||||||
GN_ARRAY_LIST(GLuint);
|
GN_ARRAY_LIST_HEADER(GLuint);
|
||||||
|
|
||||||
typedef struct gnPlatformPresentationQueue_t {
|
typedef struct gnPlatformPresentationQueue_t {
|
||||||
GLuintArrayList textures;
|
GLuintArrayList textures;
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
#include <glad/glad.h>
|
#include <glad/glad.h>
|
||||||
#include "GL/glext.h"
|
#include "GL/glext.h"
|
||||||
#include "opengl_surface.h"
|
#include "opengl_surface.h"
|
||||||
|
#include "utils/gryphn_string.h"
|
||||||
|
|
||||||
#ifdef GN_PLATFORM_LINUX
|
#ifdef GN_PLATFORM_LINUX
|
||||||
#ifdef GN_WINDOW_X11
|
#ifdef GN_WINDOW_X11
|
||||||
@@ -17,11 +18,16 @@ gnReturnCode createGLXContext(gnWindowSurfaceHandle windowSurface, gnInstanceHan
|
|||||||
XVisualInfo* vi = glXChooseVisual(createInfo.display, 0, attribs);
|
XVisualInfo* vi = glXChooseVisual(createInfo.display, 0, attribs);
|
||||||
windowSurface->windowSurface->context = glXCreateContext(createInfo.display, vi, NULL, GL_TRUE);
|
windowSurface->windowSurface->context = glXCreateContext(createInfo.display, vi, NULL, GL_TRUE);
|
||||||
if (glXMakeCurrent(createInfo.display, createInfo.window, windowSurface->windowSurface->context) == GL_FALSE)
|
if (glXMakeCurrent(createInfo.display, createInfo.window, windowSurface->windowSurface->context) == GL_FALSE)
|
||||||
return GN_FAILED_TO_ATTACH_WINDOW;
|
return GN_WINDOW_IN_USE;
|
||||||
windowSurface->windowSurface->window = createInfo.window;
|
windowSurface->windowSurface->window = createInfo.window;
|
||||||
windowSurface->windowSurface->display = createInfo.display;
|
windowSurface->windowSurface->display = createInfo.display;
|
||||||
if (!gladLoadGLLoader((GLADloadproc)glXGetProcAddress))
|
if (!gladLoadGLLoader((GLADloadproc)glXGetProcAddress)) {
|
||||||
return GN_FAILED_TO_INIT_OPENGL;
|
gnDebuggerSetErrorMessage(instance->debugger, (gnMessageData){
|
||||||
|
.message = gnCreateString("Failed to load OpenGL functions")
|
||||||
|
});
|
||||||
|
|
||||||
|
return GN_UNKNOWN_ERROR;
|
||||||
|
}
|
||||||
return GN_SUCCESS;
|
return GN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user