diff --git a/projects/apis/opengl/src/buffer/opengl_buffer.c b/projects/apis/opengl/src/buffer/opengl_buffer.c index d63633b..35077b6 100644 --- a/projects/apis/opengl/src/buffer/opengl_buffer.c +++ b/projects/apis/opengl/src/buffer/opengl_buffer.c @@ -1,4 +1,5 @@ #include "opengl_buffer.h" +#include "string.h" GLenum gnBufferTypeToGLEnum(gnBufferType type) { switch (type) { @@ -22,11 +23,12 @@ void openglBufferData(gnBufferHandle buffer, size_t dataSize, void* data) { } #include "stdio.h" void openglBufferSubData(gnBufferHandle buffer, size_t offset, size_t dataSize, gnBufferMemory data) { - glBindBuffer(buffer->buffer->type, buffer->buffer->id); - glBufferSubData(buffer->buffer->type, 0, dataSize, data); + void* buff = glMapNamedBufferRange(buffer->buffer->id, offset, buffer->info.size, GL_MAP_WRITE_BIT); + memcpy(buff, data, dataSize); + glUnmapNamedBuffer(buffer->buffer->id); } void* openglMapBuffer(gnBufferHandle buffer) { - return glMapNamedBuffer(buffer->buffer->id, GL_READ_WRITE); + return glMapNamedBufferRange(buffer->buffer->id, 0, buffer->info.size, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); } void openglUnmapBuffer(gnBufferHandle buffer) { glUnmapNamedBuffer(buffer->buffer->id); diff --git a/projects/apis/opengl/src/commands/commands/opengl_commands.cpp b/projects/apis/opengl/src/commands/commands/opengl_commands.cpp index 0c8ae35..c3f26ec 100644 --- a/projects/apis/opengl/src/commands/commands/opengl_commands.cpp +++ b/projects/apis/opengl/src/commands/commands/opengl_commands.cpp @@ -19,11 +19,9 @@ GN_CPP_FUNCTION void openglBeginRenderPass(gnCommandBuffer buffer, gnRenderPassI glBindFramebuffer(GL_FRAMEBUFFER, passInfo.framebuffer->framebuffer->framebuffers[0]); if (passInfo.renderPassDescriptor->renderPassDescriptor->subpasses[0].colorAttachments[0].format == GL_SRGB8_ALPHA8) glEnable(GL_FRAMEBUFFER_SRGB); glClearColor(values[0].r, values[0].g, values[0].b, values[0].a); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(passInfo.offset.x, passInfo.offset.y, passInfo.size.x, passInfo.size.y); - - free(values); })); } @@ -91,6 +89,7 @@ GN_CPP_FUNCTION void openglDrawIndexed(gnCommandBufferHandle sBuffer, gnIndexTyp glDrawElementsInstancedBaseVertexBaseInstance(GL_TRIANGLES, indexCount, (type == GN_UINT16) ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(sizeof(GLuint) * firstIndex), instanceCount, vertexOffset, firstInstance); })); } +#include "stdio.h" GN_CPP_FUNCTION void openglBindUniform(gnCommandBufferHandle sBuffer, gnUniform sUniform, uint32_t sSet, uint32_t dynamicOffsetCount, uint32_t* dynamicOffsets) { gnCommandBufferHandle buffer = sBuffer; gnUniform uniform = sUniform; @@ -98,10 +97,20 @@ GN_CPP_FUNCTION void openglBindUniform(gnCommandBufferHandle sBuffer, gnUniform openglCommandRunnerBindFunction(buffer->commandBuffer->commmandRunner, std::function([buffer, uniform, set]{ for (int i = 0; i < MAX_OPENGL_BINDINGS; i++) { - if (!uniform->uniform->bindings[i].isUpdated) continue; + if (uniform->uniform->bindings[i].isUpdated != GN_TRUE) continue; if (uniform->uniform->bindings[i].type == gl_image) { glActiveTexture(GL_TEXTURE0 + buffer->commandBuffer->boundGraphicsPipeline->graphicsPipeline->setMap[set].bindings[uniform->uniform->bindings[i].image_info.binding]); glBindTexture(GL_TEXTURE_2D, uniform->uniform->bindings[i].image_info.texture->texture->id); + } else if (uniform->uniform->bindings[i].type == gl_buffer) { + glBindBufferBase(GL_UNIFORM_BUFFER, 0, uniform->uniform->bindings[i].buffer_info.buffer->buffer->id); + glUniformBlockBinding( + buffer->commandBuffer->boundGraphicsPipeline->graphicsPipeline->program, + buffer->commandBuffer->boundGraphicsPipeline->graphicsPipeline->setMap[set].bindings[uniform->uniform->bindings[i].buffer_info.binding], + 0 + ); + } else if (uniform->uniform->bindings[i].type == gl_storage) { + // glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, uniform->uniform->bindings[i].storage_info.buffer->buffer->id); + // glFlushMappedNamedBufferRange(uniform->uniform->bindings[i].buffer_info.buffer->buffer->id, 0, uniform->uniform->bindings[i].buffer_info.buffer->info.size); } } })); diff --git a/projects/apis/opengl/src/present/opengl_present.c b/projects/apis/opengl/src/present/opengl_present.c index 376a816..e18255d 100644 --- a/projects/apis/opengl/src/present/opengl_present.c +++ b/projects/apis/opengl/src/present/opengl_present.c @@ -9,6 +9,7 @@ gnReturnCode openglPresent(gnOutputDeviceHandle device, gnPresentInfo info) { glBindVertexArray(0); + glDisable(GL_DEPTH_TEST); if (info.presentationQueues[i]->presentationQueue->format == GL_SRGB8_ALPHA8) glEnable(GL_FRAMEBUFFER_SRGB); glUseProgram(device->outputDevice->shaderProgram); diff --git a/projects/apis/opengl/src/uniforms/pool/opengl_uniform_pool.c b/projects/apis/opengl/src/uniforms/pool/opengl_uniform_pool.c index 052fed2..06bbdfc 100644 --- a/projects/apis/opengl/src/uniforms/pool/opengl_uniform_pool.c +++ b/projects/apis/opengl/src/uniforms/pool/opengl_uniform_pool.c @@ -9,6 +9,7 @@ gnUniform* openglAllocateUniforms(gnUniformPool pool, const gnUniformAllocationI for (int i = 0; i < allocInfo.setCount; i++) { uniforms[i] = malloc(sizeof(struct gnUniform_t)); uniforms[i]->uniform = malloc(sizeof(struct gnPlatformUniform_t)); + for (int c = 0; c < MAX_OPENGL_BINDINGS; c++) uniforms[i]->uniform->bindings[c].isUpdated = GN_FALSE; } return uniforms; }