mcst-linux-kernel/patches-2024.06.26/gl4es-1.1.4/0079-Improved-Buffers-a-bit...

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