Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2020-09-02 02:25:32 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-09-05 18:49:14 +0300
commita92d77acf715f5a775e99b575cc8cc5238b11557 (patch)
tree1361ba0795758d8989a5ed87762822a32a47845b /source/blender/gpu/opengl
parentf72c1c4547e5fab769c22652d9872192029ad7fe (diff)
GPUTexture: Add skeleton of the new GLTexture class
Diffstat (limited to 'source/blender/gpu/opengl')
-rw-r--r--source/blender/gpu/opengl/gl_backend.hh6
-rw-r--r--source/blender/gpu/opengl/gl_texture.cc98
-rw-r--r--source/blender/gpu/opengl/gl_texture.hh97
3 files changed, 199 insertions, 2 deletions
diff --git a/source/blender/gpu/opengl/gl_backend.hh b/source/blender/gpu/opengl/gl_backend.hh
index 332350e47b5..6029ff9e309 100644
--- a/source/blender/gpu/opengl/gl_backend.hh
+++ b/source/blender/gpu/opengl/gl_backend.hh
@@ -32,6 +32,7 @@
#include "gl_drawlist.hh"
#include "gl_framebuffer.hh"
#include "gl_shader.hh"
+#include "gl_texture.hh"
#include "gl_uniform_buffer.hh"
namespace blender {
@@ -72,6 +73,11 @@ class GLBackend : public GPUBackend {
return new GLShader(name);
};
+ Texture *texture_alloc(const char *name)
+ {
+ return new GLTexture(name);
+ };
+
UniformBuf *uniformbuf_alloc(int size, const char *name)
{
return new GLUniformBuf(size, name);
diff --git a/source/blender/gpu/opengl/gl_texture.cc b/source/blender/gpu/opengl/gl_texture.cc
new file mode 100644
index 00000000000..aaad281ed4e
--- /dev/null
+++ b/source/blender/gpu/opengl/gl_texture.cc
@@ -0,0 +1,98 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2020 Blender Foundation.
+ * All rights reserved.
+ */
+
+/** \file
+ * \ingroup gpu
+ */
+
+#include "BKE_global.h"
+
+#include "gl_backend.hh"
+
+#include "gl_texture.hh"
+
+namespace blender::gpu {
+
+/* -------------------------------------------------------------------- */
+/** \name Creation & Deletion
+ * \{ */
+
+GLTexture::GLTexture(const char *name) : Texture(name)
+{
+ BLI_assert(GPU_context_active_get() != NULL);
+
+ glGenTextures(1, &tex_id_);
+
+#ifndef __APPLE__
+ if ((G.debug & G_DEBUG_GPU) && (GLEW_VERSION_4_3 || GLEW_KHR_debug)) {
+ char sh_name[64];
+ SNPRINTF(sh_name, "Texture-%s", name);
+ glObjectLabel(GL_TEXTURE, tex_id_, -1, sh_name);
+ }
+#endif
+}
+
+GLTexture::~GLTexture()
+{
+ GLBackend::get()->tex_free(tex_id_);
+}
+
+void GLTexture::init(void)
+{
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Operations
+ * \{ */
+
+void GLTexture::bind(int /*slot*/)
+{
+}
+
+void GLTexture::update(void * /*data*/)
+{
+}
+
+void GLTexture::update_sub(void * /*data*/, int /*offset*/[3], int /*size*/[3])
+{
+}
+
+void GLTexture::generate_mipmap(void)
+{
+}
+
+void GLTexture::copy_to(Texture * /*tex*/)
+{
+}
+
+void GLTexture::swizzle_set(char /*swizzle_mask*/[4])
+{
+}
+
+/** \} */
+
+/* TODO(fclem) Legacy. Should be removed at some point. */
+uint GLTexture::gl_bindcode_get(void)
+{
+ return tex_id_;
+}
+
+} // namespace blender::gpu
diff --git a/source/blender/gpu/opengl/gl_texture.hh b/source/blender/gpu/opengl/gl_texture.hh
index c1194941038..513cef59e85 100644
--- a/source/blender/gpu/opengl/gl_texture.hh
+++ b/source/blender/gpu/opengl/gl_texture.hh
@@ -31,14 +31,107 @@
#pragma once
+#include "MEM_guardedalloc.h"
+
#include "BLI_assert.h"
+#include "gpu_texture_private.hh"
+
#include "glew-mx.h"
namespace blender {
namespace gpu {
-static GLenum to_gl(eGPUDataFormat format)
+#if 0
+class GLContext {
+ /** Currently bound textures. Updated before drawing. */
+ GLuint bound_textures[64];
+ GLuint bound_samplers[64];
+ /** All sampler objects. Last one is for icon sampling. */
+ GLuint samplers[GPU_SAMPLER_MAX + 1];
+};
+#endif
+
+class GLTexture : public Texture {
+ private:
+ /** Texture unit to which this texture is bound. */
+ int slot = -1;
+ /** Target to bind the texture to (GL_TEXTURE_1D, GL_TEXTURE_2D, etc...)*/
+ GLenum target_ = -1;
+ /** opengl identifier for texture. */
+ GLuint tex_id_ = 0;
+ /** Legacy workaround for texture copy. */
+ GLuint copy_fb = 0;
+ GPUContext *copy_fb_ctx = NULL;
+
+ public:
+ GLTexture(const char *name);
+ ~GLTexture();
+
+ void bind(int slot) override;
+ void update(void *data) override;
+ void update_sub(void *data, int offset[3], int size[3]) override;
+ void generate_mipmap(void) override;
+ void copy_to(Texture *tex) override;
+
+ void swizzle_set(char swizzle_mask[4]) override;
+
+ /* TODO(fclem) Legacy. Should be removed at some point. */
+ uint gl_bindcode_get(void) override;
+
+ private:
+ void init(void);
+};
+
+static inline GLenum target_to_gl(eGPUTextureFlag target)
+{
+ switch (target & GPU_TEXTURE_TARGET) {
+ case GPU_TEXTURE_1D:
+ return GL_TEXTURE_1D;
+ case GPU_TEXTURE_1D | GPU_TEXTURE_ARRAY:
+ return GL_TEXTURE_1D_ARRAY;
+ case GPU_TEXTURE_2D:
+ return GL_TEXTURE_2D;
+ case GPU_TEXTURE_2D | GPU_TEXTURE_ARRAY:
+ return GL_TEXTURE_2D_ARRAY;
+ case GPU_TEXTURE_3D:
+ return GL_TEXTURE_3D;
+ case GPU_TEXTURE_CUBE:
+ return GL_TEXTURE_CUBE_MAP;
+ case GPU_TEXTURE_CUBE | GPU_TEXTURE_ARRAY:
+ return GL_TEXTURE_CUBE_MAP_ARRAY_ARB;
+ case GPU_TEXTURE_BUFFER:
+ return GL_TEXTURE_BUFFER;
+ default:
+ BLI_assert(0);
+ return GPU_TEXTURE_1D;
+ }
+}
+
+static inline GLenum swizzle_to_gl(const char swizzle)
+{
+ switch (swizzle) {
+ default:
+ case 'x':
+ case 'r':
+ return GL_RED;
+ case 'y':
+ case 'g':
+ return GL_GREEN;
+ case 'z':
+ case 'b':
+ return GL_BLUE;
+ case 'w':
+ case 'a':
+ return GL_ALPHA;
+ case '0':
+ return GL_ZERO;
+ case '1':
+ return GL_ONE;
+ }
+}
+
+static inline GLenum to_gl(eGPUDataFormat format)
{
switch (format) {
case GPU_DATA_FLOAT:
@@ -60,7 +153,7 @@ static GLenum to_gl(eGPUDataFormat format)
}
/* Assume Unorm / Float target. Used with glReadPixels. */
-static GLenum channel_len_to_gl(int channel_len)
+static inline GLenum channel_len_to_gl(int channel_len)
{
switch (channel_len) {
case 1: