105 lines
4.5 KiB
Diff
105 lines
4.5 KiB
Diff
From d92a15788e777dcac3f2ac901f4befd74a05f856 Mon Sep 17 00:00:00 2001
|
|
From: ptitSeb <sebastien.chev@gmail.com>
|
|
Date: Tue, 27 Oct 2020 09:40:49 +0100
|
|
Subject: [PATCH 079/233] Improved Buffers a bit
|
|
|
|
---
|
|
src/gl/buffers.c | 27 +++++++++++++++++++++++++++
|
|
src/gl/buffers.h | 2 ++
|
|
src/gl/const.h | 7 +++++++
|
|
src/gl/gl_lookup.c | 2 ++
|
|
4 files changed, 38 insertions(+)
|
|
|
|
diff --git a/src/gl/buffers.c b/src/gl/buffers.c
|
|
index cb7f6c23..b5ca14f1 100755
|
|
--- a/src/gl/buffers.c
|
|
+++ b/src/gl/buffers.c
|
|
@@ -664,6 +664,32 @@ void gl4es_glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr l
|
|
}
|
|
}
|
|
|
|
+void gl4es_glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
|
|
+{
|
|
+ DBG(printf("glCopyBufferSubData(%s, %s, %p, %p, %d)\n", PrintEnum(readTarget), PrintEnum(writeTarget), (void*)readOffset, (void*)writeOffset, size);)
|
|
+ //TODO: Add GL_COPY_READ_BUFFER and GL_COPY_WRITE_BUFFER (and GL_QUERY_BUFFER?)
|
|
+ glbuffer_t *readbuff = getbuffer_buffer(readTarget);
|
|
+ glbuffer_t *writebuff = getbuffer_buffer(writeTarget);
|
|
+ if(!readbuff || !writebuff) {
|
|
+ errorShim(GL_INVALID_VALUE);
|
|
+ return;
|
|
+ }
|
|
+ if(writebuff->ranged && !(writebuff->access&GL_MAP_PERSISTENT_BIT)) {
|
|
+ errorShim(GL_INVALID_OPERATION);
|
|
+ return;
|
|
+ }
|
|
+ // TODO: check memory overlap and overread/overwrite
|
|
+ memcpy(writebuff->data+writeOffset, readbuff->data+readOffset, size);
|
|
+ if(writebuff->real_buffer && (writebuff->type==GL_ARRAY_BUFFER || writebuff->type==GL_ELEMENT_ARRAY_BUFFER) && writebuff->mapped && (writebuff->access==GL_WRITE_ONLY || writebuff->access==GL_READ_WRITE)) {
|
|
+ LOAD_GLES(glBufferSubData);
|
|
+ LOAD_GLES(glBindBuffer);
|
|
+ gles_glBindBuffer(writebuff->type, writebuff->real_buffer);
|
|
+ gles_glBufferSubData(writebuff->type, writeOffset, size, writebuff->data+writeOffset);
|
|
+ gles_glBindBuffer(writebuff->type, 0);
|
|
+ }
|
|
+ noerrorShim();
|
|
+}
|
|
+
|
|
|
|
//Direct wrapper
|
|
void glGenBuffers(GLsizei n, GLuint * buffers) AliasExport("gl4es_glGenBuffers");
|
|
@@ -681,6 +707,7 @@ void glGetBufferPointerv(GLenum target, GLenum pname, GLvoid ** params) AliasExp
|
|
void *glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) AliasExport("gl4es_glMapBufferRange");
|
|
void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) AliasExport("gl4es_glFlushMappedBufferRange");
|
|
|
|
+void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) AliasExport("gl4es_glCopyBufferSubData");
|
|
//ARB wrapper
|
|
#ifndef AMIGAOS4
|
|
void glGenBuffersARB(GLsizei n, GLuint * buffers) AliasExport("gl4es_glGenBuffers");
|
|
diff --git a/src/gl/buffers.h b/src/gl/buffers.h
|
|
index dc8c5e1c..b8b304c8 100755
|
|
--- a/src/gl/buffers.h
|
|
+++ b/src/gl/buffers.h
|
|
@@ -38,6 +38,8 @@ void gl4es_glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, G
|
|
void *gl4es_glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
|
|
void gl4es_glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
|
|
|
|
+void gl4es_glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
|
|
+
|
|
void glGenBuffers(GLsizei n, GLuint * buffers);
|
|
void glBindBuffer(GLenum target, GLuint buffer);
|
|
void glBufferData(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage);
|
|
diff --git a/src/gl/const.h b/src/gl/const.h
|
|
index f781a849..a2dd6ae9 100755
|
|
--- a/src/gl/const.h
|
|
+++ b/src/gl/const.h
|
|
@@ -563,6 +563,13 @@
|
|
#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
|
|
#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
|
|
#define GL_CURRENT_VERTEX_ATTRIB 0x8626
|
|
+#define GL_MAP_PERSISTENT_BIT 0x00000040
|
|
+#define GL_QUERY_BUFFER_BINDING_AMD 0x9193
|
|
+#define GL_COPY_READ_BUFFER_BINDING 0x8F36
|
|
+#define GL_COPY_READ_BUFFER GL_COPY_READ_BUFFER_BINDING
|
|
+#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37
|
|
+#define GL_COPY_WRITE_BUFFER GL_COPY_WRITE_BUFFER_BINDING
|
|
+
|
|
|
|
/* Framebuffers */
|
|
#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
|
|
diff --git a/src/gl/gl_lookup.c b/src/gl/gl_lookup.c
|
|
index 2ad3ca9b..c981c116 100755
|
|
--- a/src/gl/gl_lookup.c
|
|
+++ b/src/gl/gl_lookup.c
|
|
@@ -60,6 +60,8 @@ void *gl4es_GetProcAddress(const char *name) {
|
|
_ARB(glGetBufferParameteriv);
|
|
_EX(glGetBufferSubData);
|
|
_ARB(glGetBufferSubData);
|
|
+ _EX(glCopyBufferSubData);
|
|
+ _ARB(glCopyBufferSubData);
|
|
|
|
_EX(glMapBufferRange);
|
|
_EX(glFlushMappedBufferRange);
|
|
--
|
|
2.11.0
|
|
|