indexed drawing and index buffers
This commit is contained in:
@@ -8,4 +8,5 @@ typedef struct gnPlatformCommandBuffer_t {
|
|||||||
id<MTLCommandBuffer> commandBuffer;
|
id<MTLCommandBuffer> commandBuffer;
|
||||||
id<MTLCommandEncoder> encoder;
|
id<MTLCommandEncoder> encoder;
|
||||||
struct gnGraphicsPipeline_t* boundGraphcisPipeline;
|
struct gnGraphicsPipeline_t* boundGraphcisPipeline;
|
||||||
|
gnBufferHandle indexBuffer;
|
||||||
} gnPlatformCommandBuffer;
|
} gnPlatformCommandBuffer;
|
||||||
|
@@ -70,10 +70,11 @@ void gnCommandSetScissorFn(struct gnCommandBuffer_t* buffer, struct gnScissor_t
|
|||||||
[encoder setScissorRect:scissorRect];
|
[encoder setScissorRect:scissorRect];
|
||||||
}
|
}
|
||||||
void gnCommandBindBufferFn(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type) {
|
void gnCommandBindBufferFn(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type) {
|
||||||
if (type == GN_VERTEX_BUFFER) {
|
id<MTLRenderCommandEncoder> encoder = (id<MTLRenderCommandEncoder>)buffer->commandBuffer->encoder;
|
||||||
id<MTLRenderCommandEncoder> encoder = (id<MTLRenderCommandEncoder>)buffer->commandBuffer->encoder;
|
if (type == GN_VERTEX_BUFFER)
|
||||||
[encoder setVertexBuffer:bufferToBind->buffer->buffer offset:0 atIndex:0];
|
[encoder setVertexBuffer:bufferToBind->buffer->buffer offset:0 atIndex:0];
|
||||||
}
|
else if (type == GN_INDEX_BUFFER)
|
||||||
|
buffer->commandBuffer->indexBuffer = bufferToBind;
|
||||||
}
|
}
|
||||||
void gnCommandDrawFn(struct gnCommandBuffer_t* buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance) {
|
void gnCommandDrawFn(struct gnCommandBuffer_t* buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance) {
|
||||||
if (buffer->commandBuffer->boundGraphcisPipeline != NULL) {
|
if (buffer->commandBuffer->boundGraphcisPipeline != NULL) {
|
||||||
|
@@ -7,6 +7,7 @@
|
|||||||
VkBufferUsageFlags vkGryphnBufferType(gnBufferType type) {
|
VkBufferUsageFlags vkGryphnBufferType(gnBufferType type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case GN_VERTEX_BUFFER: return VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
|
case GN_VERTEX_BUFFER: return VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
|
||||||
|
case GN_INDEX_BUFFER: return VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,6 +91,7 @@ void VkCopyBuffer(VkBuffer source, VkBuffer destination, size_t size, VkCommandP
|
|||||||
gnReturnCode gnCreateBufferFn(gnBufferHandle buffer, gnOutputDeviceHandle device, gnBufferInfo info) {
|
gnReturnCode gnCreateBufferFn(gnBufferHandle buffer, gnOutputDeviceHandle device, gnBufferInfo info) {
|
||||||
buffer->buffer = malloc(sizeof(struct gnPlatformBuffer_t));
|
buffer->buffer = malloc(sizeof(struct gnPlatformBuffer_t));
|
||||||
VkBufferUsageFlags usage = vkGryphnBufferType(info.type);
|
VkBufferUsageFlags usage = vkGryphnBufferType(info.type);
|
||||||
|
buffer->buffer->useStagingBuffer = gnFalse;
|
||||||
if (info.usage == GN_STATIC_DRAW) {
|
if (info.usage == GN_STATIC_DRAW) {
|
||||||
gnReturnCode createdBuffer = VkCreateBuffer(
|
gnReturnCode createdBuffer = VkCreateBuffer(
|
||||||
&buffer->buffer->stagingBuffer, &buffer->buffer->stagingBufferMemory,
|
&buffer->buffer->stagingBuffer, &buffer->buffer->stagingBufferMemory,
|
||||||
|
@@ -1,7 +1,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "core/command/command_buffer/gryphn_command_buffer.h"
|
#include "core/command/command_buffer/gryphn_command_buffer.h"
|
||||||
|
#include "utils/gryphn_bool.h"
|
||||||
#include <vulkan/vulkan.h>
|
#include <vulkan/vulkan.h>
|
||||||
|
|
||||||
typedef struct gnPlatformCommandBuffer_t {
|
typedef struct gnPlatformCommandBuffer_t {
|
||||||
VkCommandBuffer buffer;
|
VkCommandBuffer buffer;
|
||||||
|
|
||||||
|
gnBool changedBuffer;
|
||||||
|
gnBufferHandle boundIndexBuffer;
|
||||||
} gnPlatformCommandBuffer;
|
} gnPlatformCommandBuffer;
|
||||||
|
@@ -59,7 +59,16 @@ VkDeviceSize offsets[] = {0};
|
|||||||
void gnCommandBindBufferFn(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type) {
|
void gnCommandBindBufferFn(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type) {
|
||||||
if (type == GN_VERTEX_BUFFER)
|
if (type == GN_VERTEX_BUFFER)
|
||||||
vkCmdBindVertexBuffers(buffer->commandBuffer->buffer, 0, 1, &bufferToBind->buffer->buffer, offsets);
|
vkCmdBindVertexBuffers(buffer->commandBuffer->buffer, 0, 1, &bufferToBind->buffer->buffer, offsets);
|
||||||
|
else if (type == GN_INDEX_BUFFER) {
|
||||||
|
buffer->commandBuffer->changedBuffer = gnTrue;
|
||||||
|
buffer->commandBuffer->boundIndexBuffer = bufferToBind;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void gnCommandDrawFn(struct gnCommandBuffer_t* buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance) {
|
void gnCommandDrawFn(struct gnCommandBuffer_t* buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance) {
|
||||||
vkCmdDraw(buffer->commandBuffer->buffer, vertexCount, instanceCount, firstVertex, firstInstance);
|
vkCmdDraw(buffer->commandBuffer->buffer, vertexCount, instanceCount, firstVertex, firstInstance);
|
||||||
}
|
}
|
||||||
|
void gnCommandDrawIndexedFn(gnCommandBufferHandle buffer, gnIndexType type, int indexCount, int firstIndex, int vertexOffset, int instanceCount, int firstInstance) {
|
||||||
|
if (buffer->commandBuffer->changedBuffer) vkCmdBindIndexBuffer(buffer->commandBuffer->buffer, buffer->commandBuffer->boundIndexBuffer->buffer->buffer, 0, (type == GN_UINT32) ? VK_INDEX_TYPE_UINT32 : VK_INDEX_TYPE_UINT16);
|
||||||
|
vkCmdDrawIndexed(buffer->commandBuffer->buffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
|
||||||
|
buffer->commandBuffer->changedBuffer = gnFalse;
|
||||||
|
}
|
||||||
|
@@ -3,8 +3,13 @@
|
|||||||
#include "utils/gryphn_error_code.h"
|
#include "utils/gryphn_error_code.h"
|
||||||
#include <core/gryphn_handles.h>
|
#include <core/gryphn_handles.h>
|
||||||
|
|
||||||
|
typedef enum gnIndexType {
|
||||||
|
GN_UINT16, GN_UINT32
|
||||||
|
} gnIndexType;
|
||||||
|
|
||||||
typedef enum gnBufferType {
|
typedef enum gnBufferType {
|
||||||
GN_VERTEX_BUFFER = 0x00000001
|
GN_VERTEX_BUFFER = 0x00000001f,
|
||||||
|
GN_INDEX_BUFFER = 0x00000002f,
|
||||||
} gnBufferType;
|
} gnBufferType;
|
||||||
|
|
||||||
typedef enum gnBufferUsage {
|
typedef enum gnBufferUsage {
|
||||||
|
@@ -23,3 +23,6 @@ void gnCommandBindBuffer(gnCommandBufferHandle buffer, gnBufferHandle bufferToBi
|
|||||||
void gnCommandDraw(struct gnCommandBuffer_t* buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance) {
|
void gnCommandDraw(struct gnCommandBuffer_t* buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance) {
|
||||||
buffer->commandPool->commandFunctions->_gnCommandDraw(buffer, vertexCount, firstVertex, instanceCount, firstInstance);
|
buffer->commandPool->commandFunctions->_gnCommandDraw(buffer, vertexCount, firstVertex, instanceCount, firstInstance);
|
||||||
}
|
}
|
||||||
|
void gnCommandDrawIndexed(gnCommandBufferHandle buffer, gnIndexType type, int indexCount, int firstIndex, int vertexOffset, int instanceCount, int firstInstance) {
|
||||||
|
buffer->commandPool->commandFunctions->_gnCommandDrawIndexed(buffer, type, indexCount, firstIndex, vertexOffset, instanceCount, firstInstance);
|
||||||
|
}
|
||||||
|
@@ -13,3 +13,4 @@ void gnCommandSetScissor(gnCommandBufferHandle buffer, gnScissor scissor);
|
|||||||
void gnCommandBindBuffer(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type);
|
void gnCommandBindBuffer(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type);
|
||||||
|
|
||||||
void gnCommandDraw(gnCommandBufferHandle buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance);
|
void gnCommandDraw(gnCommandBufferHandle buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance);
|
||||||
|
void gnCommandDrawIndexed(gnCommandBufferHandle buffer, gnIndexType type, int indexCount, int firstIndex, int vertexOffset, int instanceCount, int firstInstance);
|
||||||
|
@@ -113,4 +113,5 @@ typedef struct gnCommandFunctions_t {
|
|||||||
|
|
||||||
void (*_gnCommandBindBuffer)(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type);
|
void (*_gnCommandBindBuffer)(gnCommandBufferHandle buffer, gnBufferHandle bufferToBind, gnBufferType type);
|
||||||
void (*_gnCommandDraw)(gnCommandBufferHandle buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance);
|
void (*_gnCommandDraw)(gnCommandBufferHandle buffer, int vertexCount, int firstVertex, int instanceCount, int firstInstance);
|
||||||
|
void (*_gnCommandDrawIndexed)(gnCommandBufferHandle buffer, gnIndexType type, int indexCount, int firstIndex, int vertexOffset, int instanceCount, int firstInstance);
|
||||||
} gnCommandFunctions;
|
} gnCommandFunctions;
|
||||||
|
@@ -109,4 +109,5 @@ void gnLoadCommandFunctions(struct gnDynamicLibrary_t* lib, struct gnCommandFunc
|
|||||||
gnLoadDLLFunction(lib, functions->_gnCommandSetScissor, "gnCommandSetScissorFn");
|
gnLoadDLLFunction(lib, functions->_gnCommandSetScissor, "gnCommandSetScissorFn");
|
||||||
gnLoadDLLFunction(lib, functions->_gnCommandBindBuffer, "gnCommandBindBufferFn");
|
gnLoadDLLFunction(lib, functions->_gnCommandBindBuffer, "gnCommandBindBufferFn");
|
||||||
gnLoadDLLFunction(lib, functions->_gnCommandDraw, "gnCommandDrawFn");
|
gnLoadDLLFunction(lib, functions->_gnCommandDraw, "gnCommandDrawFn");
|
||||||
|
gnLoadDLLFunction(lib, functions->_gnCommandDrawIndexed, "gnCommandDrawIndexedFn");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user