Compare commits
6 Commits
ebassi/css
...
wip/cherge
Author | SHA1 | Date | |
---|---|---|---|
|
a86fd41013 | ||
|
40f8e59525 | ||
|
760659e754 | ||
|
9212cf8ab1 | ||
|
40e5a37795 | ||
|
f69cfd3d12 |
@@ -52,6 +52,13 @@ G_BEGIN_DECLS
|
||||
#define gdk_array_paste(GDK_ARRAY_NAME, func_name) gdk_array_paste_more (GDK_ARRAY_NAME, func_name)
|
||||
#define gdk_array(func_name) gdk_array_paste (GDK_ARRAY_NAME, func_name)
|
||||
|
||||
#if !defined(INCLUDE_DECL) && !defined(INCLUDE_IMPL)
|
||||
#define INCLUDE_DECL 1
|
||||
#define INCLUDE_IMPL 1
|
||||
#endif
|
||||
|
||||
#ifdef INCLUDE_DECL
|
||||
|
||||
typedef struct GdkArray GdkArray;
|
||||
|
||||
struct GdkArray
|
||||
@@ -82,6 +89,9 @@ gdk_array(init) (GdkArray *self)
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* INCLUDE_DECL */
|
||||
#ifdef INCLUDE_IMPL
|
||||
|
||||
G_GNUC_UNUSED static inline gsize
|
||||
gdk_array(get_capacity) (const GdkArray *self)
|
||||
{
|
||||
@@ -304,6 +314,8 @@ gdk_array(get) (const GdkArray *self,
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* INCLUDE_IMPL */
|
||||
|
||||
#ifndef GDK_ARRAY_NO_UNDEF
|
||||
|
||||
#undef _T_
|
||||
@@ -321,6 +333,9 @@ gdk_array(get) (const GdkArray *self,
|
||||
#undef GDK_ARRAY_PREALLOC
|
||||
#undef GDK_ARRAY_TYPE_NAME
|
||||
#undef GDK_ARRAY_NO_MEMSET
|
||||
|
||||
#undef INCLUDE_DECL
|
||||
#undef INCLUDE_IMPL
|
||||
#endif
|
||||
|
||||
G_END_DECLS
|
||||
|
@@ -1,7 +1,5 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <gdk/gdkprofilerprivate.h>
|
||||
|
||||
#include "gskglbufferprivate.h"
|
||||
|
||||
struct _GskGLBuffer
|
||||
@@ -16,9 +14,6 @@ struct _GskGLBuffer
|
||||
|
||||
G_DEFINE_TYPE (GskGLBuffer, gsk_gl_buffer, GSK_TYPE_GPU_BUFFER)
|
||||
|
||||
static guint profiler_buffer_uploads_id;
|
||||
static gint64 profiler_buffer_uploads;
|
||||
|
||||
static void
|
||||
gsk_gl_buffer_finalize (GObject *object)
|
||||
{
|
||||
@@ -49,9 +44,7 @@ gsk_gl_buffer_unmap (GskGpuBuffer *buffer,
|
||||
|
||||
gsk_gl_buffer_bind (self);
|
||||
|
||||
profiler_buffer_uploads += used;
|
||||
glBufferSubData (self->target, 0, used, self->data);
|
||||
gdk_profiler_set_int_counter (profiler_buffer_uploads_id, profiler_buffer_uploads);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -64,8 +57,6 @@ gsk_gl_buffer_class_init (GskGLBufferClass *klass)
|
||||
buffer_class->unmap = gsk_gl_buffer_unmap;
|
||||
|
||||
gobject_class->finalize = gsk_gl_buffer_finalize;
|
||||
|
||||
profiler_buffer_uploads_id = gdk_profiler_define_int_counter ("ngl-buffer-uploads", "Number of bytes uploaded to GPU");
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -5,24 +5,14 @@
|
||||
#include "gskglbufferprivate.h"
|
||||
#include "gskglimageprivate.h"
|
||||
|
||||
struct _GskGLDescriptors
|
||||
{
|
||||
GskGpuDescriptors parent_instance;
|
||||
|
||||
GskGLDevice *device;
|
||||
guint n_external;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GskGLDescriptors, gsk_gl_descriptors, GSK_TYPE_GPU_DESCRIPTORS)
|
||||
|
||||
static void
|
||||
gsk_gl_descriptors_finalize (GObject *object)
|
||||
gsk_gl_descriptors_finalize (GskGpuDescriptors *desc)
|
||||
{
|
||||
GskGLDescriptors *self = GSK_GL_DESCRIPTORS (object);
|
||||
GskGLDescriptors *self = GSK_GL_DESCRIPTORS (desc);
|
||||
|
||||
g_object_unref (self->device);
|
||||
|
||||
G_OBJECT_CLASS (gsk_gl_descriptors_parent_class)->finalize (object);
|
||||
gsk_gpu_descriptors_finalize (&self->parent_instance);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -72,29 +62,25 @@ gsk_gl_descriptors_add_buffer (GskGpuDescriptors *desc,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_gl_descriptors_class_init (GskGLDescriptorsClass *klass)
|
||||
static GskGpuDescriptorsClass GSK_GL_DESCRIPTORS_CLASS =
|
||||
{
|
||||
GskGpuDescriptorsClass *descriptors_class = GSK_GPU_DESCRIPTORS_CLASS (klass);
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->finalize = gsk_gl_descriptors_finalize;
|
||||
|
||||
descriptors_class->add_image = gsk_gl_descriptors_add_image;
|
||||
descriptors_class->add_buffer = gsk_gl_descriptors_add_buffer;
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_gl_descriptors_init (GskGLDescriptors *self)
|
||||
{
|
||||
}
|
||||
.finalize = gsk_gl_descriptors_finalize,
|
||||
.add_image = gsk_gl_descriptors_add_image,
|
||||
.add_buffer = gsk_gl_descriptors_add_buffer,
|
||||
};
|
||||
|
||||
GskGpuDescriptors *
|
||||
gsk_gl_descriptors_new (GskGLDevice *device)
|
||||
{
|
||||
GskGLDescriptors *self;
|
||||
GskGpuDescriptors *desc;
|
||||
|
||||
self = g_object_new (GSK_TYPE_GL_DESCRIPTORS, NULL);
|
||||
self = g_new0 (GskGLDescriptors, 1);
|
||||
desc = GSK_GPU_DESCRIPTORS (self);
|
||||
|
||||
desc->ref_count = 1;
|
||||
desc->desc_class = (GskGpuDescriptorsClass *) &GSK_GL_DESCRIPTORS_CLASS;
|
||||
gsk_gpu_descriptors_init (&self->parent_instance);
|
||||
|
||||
self->device = g_object_ref (device);
|
||||
|
||||
@@ -110,7 +96,7 @@ gsk_gl_descriptors_get_n_external (GskGLDescriptors *self)
|
||||
void
|
||||
gsk_gl_descriptors_use (GskGLDescriptors *self)
|
||||
{
|
||||
GskGpuDescriptors *desc = GSK_GPU_DESCRIPTORS (self);
|
||||
GskGpuDescriptors *desc = &self->parent_instance;
|
||||
gsize i, ext, n_textures;
|
||||
|
||||
n_textures = 16 - 3 * self->n_external;
|
||||
|
@@ -6,9 +6,17 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GSK_TYPE_GL_DESCRIPTORS (gsk_gl_descriptors_get_type ())
|
||||
typedef struct _GskGLDescriptors GskGLDescriptors;
|
||||
|
||||
G_DECLARE_FINAL_TYPE (GskGLDescriptors, gsk_gl_descriptors, GSK, GL_DESCRIPTORS, GskGpuDescriptors)
|
||||
#define GSK_GL_DESCRIPTORS(d) ((GskGLDescriptors *) (d))
|
||||
|
||||
struct _GskGLDescriptors
|
||||
{
|
||||
GskGpuDescriptors parent_instance;
|
||||
|
||||
GskGLDevice *device;
|
||||
guint n_external;
|
||||
};
|
||||
|
||||
GskGpuDescriptors * gsk_gl_descriptors_new (GskGLDevice *device);
|
||||
|
||||
|
@@ -6,6 +6,7 @@
|
||||
#include "gskgpuopprivate.h"
|
||||
#include "gskgpushaderopprivate.h"
|
||||
#include "gskglbufferprivate.h"
|
||||
#include "gskglmapbufferprivate.h"
|
||||
#include "gskgldescriptorsprivate.h"
|
||||
#include "gskgldeviceprivate.h"
|
||||
#include "gskglimageprivate.h"
|
||||
@@ -124,14 +125,20 @@ gsk_gl_frame_create_vertex_buffer (GskGpuFrame *frame,
|
||||
*/
|
||||
g_hash_table_remove_all (self->vaos);
|
||||
|
||||
return gsk_gl_buffer_new (GL_ARRAY_BUFFER, size, GL_WRITE_ONLY);
|
||||
if (gsk_gpu_frame_should_optimize (frame, GSK_GPU_OPTIMIZE_MAP_BUFFER))
|
||||
return gsk_gl_map_buffer_new (GL_ARRAY_BUFFER, size, GL_WRITE_ONLY);
|
||||
else
|
||||
return gsk_gl_buffer_new (GL_ARRAY_BUFFER, size, GL_WRITE_ONLY);
|
||||
}
|
||||
|
||||
static GskGpuBuffer *
|
||||
gsk_gl_frame_create_storage_buffer (GskGpuFrame *frame,
|
||||
gsize size)
|
||||
{
|
||||
return gsk_gl_buffer_new (GL_UNIFORM_BUFFER, size, GL_WRITE_ONLY);
|
||||
if (gsk_gpu_frame_should_optimize (frame, GSK_GPU_OPTIMIZE_MAP_BUFFER))
|
||||
return gsk_gl_map_buffer_new (GL_UNIFORM_BUFFER, size, GL_WRITE_ONLY);
|
||||
else
|
||||
return gsk_gl_buffer_new (GL_UNIFORM_BUFFER, size, GL_WRITE_ONLY);
|
||||
}
|
||||
|
||||
static void
|
||||
|
95
gsk/gpu/gskglmapbuffer.c
Normal file
95
gsk/gpu/gskglmapbuffer.c
Normal file
@@ -0,0 +1,95 @@
|
||||
#include "config.h"
|
||||
|
||||
#include "gskglmapbufferprivate.h"
|
||||
|
||||
struct _GskGLMapBuffer
|
||||
{
|
||||
GskGpuBuffer parent_instance;
|
||||
|
||||
GLenum target;
|
||||
GLuint buffer_id;
|
||||
GLenum access;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GskGLMapBuffer, gsk_gl_map_buffer, GSK_TYPE_GPU_BUFFER)
|
||||
|
||||
static void
|
||||
gsk_gl_map_buffer_finalize (GObject *object)
|
||||
{
|
||||
GskGLMapBuffer *self = GSK_GL_MAP_BUFFER (object);
|
||||
|
||||
glDeleteBuffers (1, &self->buffer_id);
|
||||
|
||||
G_OBJECT_CLASS (gsk_gl_map_buffer_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static guchar *
|
||||
gsk_gl_map_buffer_map (GskGpuBuffer *buffer)
|
||||
{
|
||||
GskGLMapBuffer *self = GSK_GL_MAP_BUFFER (buffer);
|
||||
|
||||
gsk_gl_map_buffer_bind (self);
|
||||
|
||||
return glMapBuffer (self->target, self->access);
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_gl_map_buffer_unmap (GskGpuBuffer *buffer,
|
||||
gsize used)
|
||||
{
|
||||
GskGLMapBuffer *self = GSK_GL_MAP_BUFFER (buffer);
|
||||
|
||||
if (!glUnmapBuffer (self->target))
|
||||
g_warning ("glUnmapBuffer failed");
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_gl_map_buffer_class_init (GskGLMapBufferClass *klass)
|
||||
{
|
||||
GskGpuBufferClass *buffer_class = GSK_GPU_BUFFER_CLASS (klass);
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
buffer_class->map = gsk_gl_map_buffer_map;
|
||||
buffer_class->unmap = gsk_gl_map_buffer_unmap;
|
||||
|
||||
gobject_class->finalize = gsk_gl_map_buffer_finalize;
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_gl_map_buffer_init (GskGLMapBuffer *self)
|
||||
{
|
||||
}
|
||||
|
||||
GskGpuBuffer *
|
||||
gsk_gl_map_buffer_new (GLenum target,
|
||||
gsize size,
|
||||
GLenum access)
|
||||
{
|
||||
GskGLMapBuffer *self;
|
||||
|
||||
self = g_object_new (GSK_TYPE_GL_MAP_BUFFER, NULL);
|
||||
|
||||
gsk_gpu_buffer_setup (GSK_GPU_BUFFER (self), size);
|
||||
|
||||
self->target = target;
|
||||
self->access = access;
|
||||
|
||||
glGenBuffers (1, &self->buffer_id);
|
||||
glBindBuffer (target, self->buffer_id);
|
||||
glBufferData (target, size, NULL, GL_STATIC_DRAW);
|
||||
|
||||
return GSK_GPU_BUFFER (self);
|
||||
}
|
||||
|
||||
void
|
||||
gsk_gl_map_buffer_bind (GskGLMapBuffer *self)
|
||||
{
|
||||
glBindBuffer (self->target, self->buffer_id);
|
||||
}
|
||||
|
||||
void
|
||||
gsk_gl_map_buffer_bind_base (GskGLMapBuffer *self,
|
||||
GLuint index)
|
||||
{
|
||||
glBindBufferBase (self->target, index, self->buffer_id);
|
||||
}
|
22
gsk/gpu/gskglmapbufferprivate.h
Normal file
22
gsk/gpu/gskglmapbufferprivate.h
Normal file
@@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include "gskgpubufferprivate.h"
|
||||
|
||||
#include "gskgldeviceprivate.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GSK_TYPE_GL_MAP_BUFFER (gsk_gl_map_buffer_get_type ())
|
||||
|
||||
G_DECLARE_FINAL_TYPE (GskGLMapBuffer, gsk_gl_map_buffer, GSK, GL_MAP_BUFFER, GskGpuBuffer)
|
||||
|
||||
GskGpuBuffer * gsk_gl_map_buffer_new (GLenum target,
|
||||
gsize size,
|
||||
GLenum access);
|
||||
|
||||
void gsk_gl_map_buffer_bind (GskGLMapBuffer *self);
|
||||
void gsk_gl_map_buffer_bind_base (GskGLMapBuffer *self,
|
||||
GLuint index);
|
||||
|
||||
G_END_DECLS
|
||||
|
@@ -2,6 +2,8 @@
|
||||
|
||||
#include "gskgpubufferprivate.h"
|
||||
|
||||
#include <gdk/gdkprofilerprivate.h>
|
||||
|
||||
typedef struct _GskGpuBufferPrivate GskGpuBufferPrivate;
|
||||
|
||||
struct _GskGpuBufferPrivate
|
||||
@@ -11,9 +13,13 @@ struct _GskGpuBufferPrivate
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (GskGpuBuffer, gsk_gpu_buffer, G_TYPE_OBJECT)
|
||||
|
||||
static guint profiler_buffer_uploads_id;
|
||||
static gint64 profiler_buffer_uploads;
|
||||
|
||||
static void
|
||||
gsk_gpu_buffer_class_init (GskGpuBufferClass *klass)
|
||||
{
|
||||
profiler_buffer_uploads_id = gdk_profiler_define_int_counter ("ngl-buffer-uploads", "Number of bytes uploaded to GPU");
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -29,7 +35,7 @@ gsk_gpu_buffer_setup (GskGpuBuffer *self,
|
||||
|
||||
priv->size = size;
|
||||
}
|
||||
|
||||
|
||||
gsize
|
||||
gsk_gpu_buffer_get_size (GskGpuBuffer *self)
|
||||
{
|
||||
@@ -49,5 +55,8 @@ gsk_gpu_buffer_unmap (GskGpuBuffer *self,
|
||||
gsize size)
|
||||
{
|
||||
GSK_GPU_BUFFER_GET_CLASS (self)->unmap (self, size);
|
||||
|
||||
profiler_buffer_uploads += size;
|
||||
gdk_profiler_set_int_counter (profiler_buffer_uploads_id, profiler_buffer_uploads);
|
||||
}
|
||||
|
||||
|
@@ -2,22 +2,6 @@
|
||||
|
||||
#include "gskgpudescriptorsprivate.h"
|
||||
|
||||
typedef struct _GskGpuImageEntry GskGpuImageEntry;
|
||||
typedef struct _GskGpuBufferEntry GskGpuBufferEntry;
|
||||
|
||||
struct _GskGpuImageEntry
|
||||
{
|
||||
GskGpuImage *image;
|
||||
GskGpuSampler sampler;
|
||||
guint32 descriptor;
|
||||
};
|
||||
|
||||
struct _GskGpuBufferEntry
|
||||
{
|
||||
GskGpuBuffer *buffer;
|
||||
guint32 descriptor;
|
||||
};
|
||||
|
||||
static void
|
||||
gsk_gpu_image_entry_clear (gpointer data)
|
||||
{
|
||||
@@ -34,6 +18,8 @@ gsk_gpu_buffer_entry_clear (gpointer data)
|
||||
g_object_unref (entry->buffer);
|
||||
}
|
||||
|
||||
#define INCLUDE_IMPL 1
|
||||
|
||||
#define GDK_ARRAY_NAME gsk_gpu_image_entries
|
||||
#define GDK_ARRAY_TYPE_NAME GskGpuImageEntries
|
||||
#define GDK_ARRAY_ELEMENT_TYPE GskGpuImageEntry
|
||||
@@ -43,6 +29,8 @@ gsk_gpu_buffer_entry_clear (gpointer data)
|
||||
#define GDK_ARRAY_NO_MEMSET 1
|
||||
#include "gdk/gdkarrayimpl.c"
|
||||
|
||||
#define INCLUDE_IMPL 1
|
||||
|
||||
#define GDK_ARRAY_NAME gsk_gpu_buffer_entries
|
||||
#define GDK_ARRAY_TYPE_NAME GskGpuBufferEntries
|
||||
#define GDK_ARRAY_ELEMENT_TYPE GskGpuBufferEntry
|
||||
@@ -52,80 +40,48 @@ gsk_gpu_buffer_entry_clear (gpointer data)
|
||||
#define GDK_ARRAY_NO_MEMSET 1
|
||||
#include "gdk/gdkarrayimpl.c"
|
||||
|
||||
typedef struct _GskGpuDescriptorsPrivate GskGpuDescriptorsPrivate;
|
||||
|
||||
struct _GskGpuDescriptorsPrivate
|
||||
void
|
||||
gsk_gpu_descriptors_finalize (GskGpuDescriptors *self)
|
||||
{
|
||||
GskGpuImageEntries images;
|
||||
GskGpuBufferEntries buffers;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (GskGpuDescriptors, gsk_gpu_descriptors, G_TYPE_OBJECT)
|
||||
|
||||
static void
|
||||
gsk_gpu_descriptors_finalize (GObject *object)
|
||||
{
|
||||
GskGpuDescriptors *self = GSK_GPU_DESCRIPTORS (object);
|
||||
GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self);
|
||||
|
||||
gsk_gpu_image_entries_clear (&priv->images);
|
||||
gsk_gpu_buffer_entries_clear (&priv->buffers);
|
||||
|
||||
G_OBJECT_CLASS (gsk_gpu_descriptors_parent_class)->finalize (object);
|
||||
gsk_gpu_image_entries_clear (&self->images);
|
||||
gsk_gpu_buffer_entries_clear (&self->buffers);
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_gpu_descriptors_class_init (GskGpuDescriptorsClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->finalize = gsk_gpu_descriptors_finalize;
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
gsk_gpu_descriptors_init (GskGpuDescriptors *self)
|
||||
{
|
||||
GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self);
|
||||
|
||||
gsk_gpu_image_entries_init (&priv->images);
|
||||
gsk_gpu_buffer_entries_init (&priv->buffers);
|
||||
gsk_gpu_image_entries_init (&self->images);
|
||||
gsk_gpu_buffer_entries_init (&self->buffers);
|
||||
}
|
||||
|
||||
gsize
|
||||
gsk_gpu_descriptors_get_n_images (GskGpuDescriptors *self)
|
||||
{
|
||||
GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self);
|
||||
|
||||
return gsk_gpu_image_entries_get_size (&priv->images);
|
||||
return gsk_gpu_image_entries_get_size (&self->images);
|
||||
}
|
||||
|
||||
gsize
|
||||
gsk_gpu_descriptors_get_n_buffers (GskGpuDescriptors *self)
|
||||
{
|
||||
GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self);
|
||||
|
||||
return gsk_gpu_buffer_entries_get_size (&priv->buffers);
|
||||
return gsk_gpu_buffer_entries_get_size (&self->buffers);
|
||||
}
|
||||
void
|
||||
gsk_gpu_descriptors_set_size (GskGpuDescriptors *self,
|
||||
gsize n_images,
|
||||
gsize n_buffers)
|
||||
{
|
||||
GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self);
|
||||
g_assert (n_images <= gsk_gpu_image_entries_get_size (&self->images));
|
||||
gsk_gpu_image_entries_set_size (&self->images, n_images);
|
||||
|
||||
g_assert (n_images <= gsk_gpu_image_entries_get_size (&priv->images));
|
||||
gsk_gpu_image_entries_set_size (&priv->images, n_images);
|
||||
|
||||
g_assert (n_buffers <= gsk_gpu_buffer_entries_get_size (&priv->buffers));
|
||||
gsk_gpu_buffer_entries_set_size (&priv->buffers, n_buffers);
|
||||
g_assert (n_buffers <= gsk_gpu_buffer_entries_get_size (&self->buffers));
|
||||
gsk_gpu_buffer_entries_set_size (&self->buffers, n_buffers);
|
||||
}
|
||||
|
||||
GskGpuImage *
|
||||
gsk_gpu_descriptors_get_image (GskGpuDescriptors *self,
|
||||
gsize id)
|
||||
{
|
||||
GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self);
|
||||
const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&priv->images, id);
|
||||
const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&self->images, id);
|
||||
|
||||
return entry->image;
|
||||
}
|
||||
@@ -134,8 +90,7 @@ GskGpuSampler
|
||||
gsk_gpu_descriptors_get_sampler (GskGpuDescriptors *self,
|
||||
gsize id)
|
||||
{
|
||||
GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self);
|
||||
const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&priv->images, id);
|
||||
const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&self->images, id);
|
||||
|
||||
return entry->sampler;
|
||||
}
|
||||
@@ -144,12 +99,11 @@ gsize
|
||||
gsk_gpu_descriptors_find_image (GskGpuDescriptors *self,
|
||||
guint32 descriptor)
|
||||
{
|
||||
GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self);
|
||||
gsize i;
|
||||
|
||||
for (i = 0; i < gsk_gpu_image_entries_get_size (&priv->images); i++)
|
||||
for (i = 0; i < gsk_gpu_image_entries_get_size (&self->images); i++)
|
||||
{
|
||||
const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&priv->images, i);
|
||||
const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&self->images, i);
|
||||
|
||||
if (entry->descriptor == descriptor)
|
||||
return i;
|
||||
@@ -162,8 +116,7 @@ GskGpuBuffer *
|
||||
gsk_gpu_descriptors_get_buffer (GskGpuDescriptors *self,
|
||||
gsize id)
|
||||
{
|
||||
GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self);
|
||||
const GskGpuBufferEntry *entry = gsk_gpu_buffer_entries_get (&priv->buffers, id);
|
||||
const GskGpuBufferEntry *entry = gsk_gpu_buffer_entries_get (&self->buffers, id);
|
||||
|
||||
return entry->buffer;
|
||||
}
|
||||
@@ -174,13 +127,12 @@ gsk_gpu_descriptors_add_image (GskGpuDescriptors *self,
|
||||
GskGpuSampler sampler,
|
||||
guint32 *out_descriptor)
|
||||
{
|
||||
GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self);
|
||||
gsize i;
|
||||
guint32 descriptor;
|
||||
|
||||
for (i = 0; i < gsk_gpu_image_entries_get_size (&priv->images); i++)
|
||||
for (i = 0; i < gsk_gpu_image_entries_get_size (&self->images); i++)
|
||||
{
|
||||
const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&priv->images, i);
|
||||
const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&self->images, i);
|
||||
|
||||
if (entry->image == image && entry->sampler == sampler)
|
||||
{
|
||||
@@ -189,10 +141,10 @@ gsk_gpu_descriptors_add_image (GskGpuDescriptors *self,
|
||||
}
|
||||
}
|
||||
|
||||
if (!GSK_GPU_DESCRIPTORS_GET_CLASS (self)->add_image (self, image, sampler, &descriptor))
|
||||
if (!self->desc_class->add_image (self, image, sampler, &descriptor))
|
||||
return FALSE;
|
||||
|
||||
gsk_gpu_image_entries_append (&priv->images,
|
||||
gsk_gpu_image_entries_append (&self->images,
|
||||
&(GskGpuImageEntry) {
|
||||
.image = g_object_ref (image),
|
||||
.sampler = sampler,
|
||||
@@ -209,13 +161,12 @@ gsk_gpu_descriptors_add_buffer (GskGpuDescriptors *self,
|
||||
GskGpuBuffer *buffer,
|
||||
guint32 *out_descriptor)
|
||||
{
|
||||
GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self);
|
||||
gsize i;
|
||||
guint32 descriptor;
|
||||
|
||||
for (i = 0; i < gsk_gpu_buffer_entries_get_size (&priv->buffers); i++)
|
||||
for (i = 0; i < gsk_gpu_buffer_entries_get_size (&self->buffers); i++)
|
||||
{
|
||||
const GskGpuBufferEntry *entry = gsk_gpu_buffer_entries_get (&priv->buffers, i);
|
||||
const GskGpuBufferEntry *entry = gsk_gpu_buffer_entries_get (&self->buffers, i);
|
||||
|
||||
if (entry->buffer == buffer)
|
||||
{
|
||||
@@ -224,10 +175,10 @@ gsk_gpu_descriptors_add_buffer (GskGpuDescriptors *self,
|
||||
}
|
||||
}
|
||||
|
||||
if (!GSK_GPU_DESCRIPTORS_GET_CLASS (self)->add_buffer (self, buffer, &descriptor))
|
||||
if (!self->desc_class->add_buffer (self, buffer, &descriptor))
|
||||
return FALSE;
|
||||
|
||||
gsk_gpu_buffer_entries_append (&priv->buffers,
|
||||
gsk_gpu_buffer_entries_append (&self->buffers,
|
||||
&(GskGpuBufferEntry) {
|
||||
.buffer = g_object_ref (buffer),
|
||||
.descriptor = descriptor
|
||||
@@ -238,3 +189,22 @@ gsk_gpu_descriptors_add_buffer (GskGpuDescriptors *self,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
GskGpuDescriptors *
|
||||
gsk_gpu_descriptors_ref (GskGpuDescriptors *self)
|
||||
{
|
||||
self->ref_count++;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
void
|
||||
gsk_gpu_descriptors_unref (GskGpuDescriptors *self)
|
||||
{
|
||||
self->ref_count--;
|
||||
|
||||
if (self->ref_count == 0)
|
||||
{
|
||||
self->desc_class->finalize (self);
|
||||
g_free (self);
|
||||
}
|
||||
}
|
||||
|
@@ -2,26 +2,62 @@
|
||||
|
||||
#include "gskgputypesprivate.h"
|
||||
|
||||
typedef struct _GskGpuImageEntry GskGpuImageEntry;
|
||||
typedef struct _GskGpuBufferEntry GskGpuBufferEntry;
|
||||
|
||||
struct _GskGpuImageEntry
|
||||
{
|
||||
GskGpuImage *image;
|
||||
GskGpuSampler sampler;
|
||||
guint32 descriptor;
|
||||
};
|
||||
|
||||
struct _GskGpuBufferEntry
|
||||
{
|
||||
GskGpuBuffer *buffer;
|
||||
guint32 descriptor;
|
||||
};
|
||||
|
||||
#define INCLUDE_DECL 1
|
||||
|
||||
#define GDK_ARRAY_NAME gsk_gpu_image_entries
|
||||
#define GDK_ARRAY_TYPE_NAME GskGpuImageEntries
|
||||
#define GDK_ARRAY_ELEMENT_TYPE GskGpuImageEntry
|
||||
#define GDK_ARRAY_BY_VALUE 1
|
||||
#define GDK_ARRAY_PREALLOC 16
|
||||
#define GDK_ARRAY_NO_MEMSET 1
|
||||
#include "gdk/gdkarrayimpl.c"
|
||||
|
||||
#define INCLUDE_DECL 1
|
||||
|
||||
#define GDK_ARRAY_NAME gsk_gpu_buffer_entries
|
||||
#define GDK_ARRAY_TYPE_NAME GskGpuBufferEntries
|
||||
#define GDK_ARRAY_ELEMENT_TYPE GskGpuBufferEntry
|
||||
#define GDK_ARRAY_BY_VALUE 1
|
||||
#define GDK_ARRAY_PREALLOC 4
|
||||
#define GDK_ARRAY_NO_MEMSET 1
|
||||
#include "gdk/gdkarrayimpl.c"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GSK_TYPE_GPU_DESCRIPTORS (gsk_gpu_descriptors_get_type ())
|
||||
#define GSK_GPU_DESCRIPTORS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSK_TYPE_GPU_DESCRIPTORS, GskGpuDescriptors))
|
||||
#define GSK_GPU_DESCRIPTORS_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GSK_TYPE_GPU_DESCRIPTORS, GskGpuDescriptorsClass))
|
||||
#define GSK_IS_GPU_DESCRIPTORS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSK_TYPE_GPU_DESCRIPTORS))
|
||||
#define GSK_IS_GPU_DESCRIPTORS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSK_TYPE_GPU_DESCRIPTORS))
|
||||
#define GSK_GPU_DESCRIPTORS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSK_TYPE_GPU_DESCRIPTORS, GskGpuDescriptorsClass))
|
||||
|
||||
typedef struct _GskGpuDescriptors GskGpuDescriptors;
|
||||
typedef struct _GskGpuDescriptorsClass GskGpuDescriptorsClass;
|
||||
|
||||
#define GSK_GPU_DESCRIPTORS(d) ((GskGpuDescriptors *) (d))
|
||||
|
||||
struct _GskGpuDescriptors
|
||||
{
|
||||
GObject parent_instance;
|
||||
GskGpuDescriptorsClass *desc_class;
|
||||
|
||||
int ref_count;
|
||||
|
||||
GskGpuImageEntries images;
|
||||
GskGpuBufferEntries buffers;
|
||||
};
|
||||
|
||||
struct _GskGpuDescriptorsClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
|
||||
void (* finalize) (GskGpuDescriptors *self);
|
||||
gboolean (* add_image) (GskGpuDescriptors *self,
|
||||
GskGpuImage *image,
|
||||
GskGpuSampler sampler,
|
||||
@@ -31,7 +67,9 @@ struct _GskGpuDescriptorsClass
|
||||
guint32 *out_id);
|
||||
};
|
||||
|
||||
GType gsk_gpu_descriptors_get_type (void) G_GNUC_CONST;
|
||||
GskGpuDescriptors * gsk_gpu_descriptors_ref (GskGpuDescriptors *self);
|
||||
void gsk_gpu_descriptors_unref (GskGpuDescriptors *self);
|
||||
|
||||
|
||||
gsize gsk_gpu_descriptors_get_n_images (GskGpuDescriptors *self);
|
||||
gsize gsk_gpu_descriptors_get_n_buffers (GskGpuDescriptors *self);
|
||||
@@ -55,7 +93,7 @@ gboolean gsk_gpu_descriptors_add_buffer (GskGpuD
|
||||
GskGpuBuffer *buffer,
|
||||
guint32 *out_descriptor);
|
||||
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GskGpuDescriptors, g_object_unref)
|
||||
void gsk_gpu_descriptors_finalize (GskGpuDescriptors *self);
|
||||
void gsk_gpu_descriptors_init (GskGpuDescriptors *self);
|
||||
|
||||
G_END_DECLS
|
||||
|
@@ -152,7 +152,7 @@ static void
|
||||
gsk_gpu_node_processor_finish (GskGpuNodeProcessor *self)
|
||||
{
|
||||
g_clear_pointer (&self->modelview, gsk_transform_unref);
|
||||
g_clear_object (&self->desc);
|
||||
g_clear_pointer (&self->desc, gsk_gpu_descriptors_unref);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -170,7 +170,7 @@ gsk_gpu_node_processor_init (GskGpuNodeProcessor *self,
|
||||
|
||||
self->frame = frame;
|
||||
if (desc)
|
||||
self->desc = g_object_ref (desc);
|
||||
self->desc = gsk_gpu_descriptors_ref (desc);
|
||||
else
|
||||
self->desc = NULL;
|
||||
|
||||
@@ -268,7 +268,7 @@ gsk_gpu_node_processor_add_image (GskGpuNodeProcessor *self,
|
||||
if (gsk_gpu_descriptors_add_image (self->desc, image, sampler, &descriptor))
|
||||
return descriptor;
|
||||
|
||||
g_object_unref (self->desc);
|
||||
gsk_gpu_descriptors_unref (self->desc);
|
||||
}
|
||||
|
||||
self->desc = gsk_gpu_frame_create_descriptors (self->frame);
|
||||
@@ -545,7 +545,7 @@ gsk_gpu_pattern_writer_finish (GskGpuPatternWriter *self)
|
||||
{
|
||||
pattern_buffer_clear (&self->buffer);
|
||||
g_assert (self->stack == 0);
|
||||
g_clear_object (&self->desc);
|
||||
g_clear_pointer (&self->desc, gsk_gpu_descriptors_unref);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@@ -31,6 +31,7 @@ static const GdkDebugKey gsk_gpu_optimization_keys[] = {
|
||||
{ "gradients", GSK_GPU_OPTIMIZE_GRADIENTS, "Don't supersample gradients" },
|
||||
{ "mipmap", GSK_GPU_OPTIMIZE_MIPMAP, "Avoid creating mipmaps" },
|
||||
{ "glyph-align", GSK_GPU_OPTIMIZE_GLYPH_ALIGN, "Never align glyphs to the subpixel grid" },
|
||||
{ "map-buffer", GSK_GPU_OPTIMIZE_MAP_BUFFER, "Don't use glMapBuffer" },
|
||||
|
||||
{ "gl-baseinstance", GSK_GPU_OPTIMIZE_GL_BASE_INSTANCE, "Assume no ARB/EXT_base_instance support" },
|
||||
};
|
||||
|
@@ -23,7 +23,7 @@ gsk_gpu_shader_op_finish (GskGpuOp *op)
|
||||
{
|
||||
GskGpuShaderOp *self = (GskGpuShaderOp *) op;
|
||||
|
||||
g_clear_object (&self->desc);
|
||||
g_clear_pointer (&self->desc, gsk_gpu_descriptors_unref);
|
||||
}
|
||||
|
||||
#ifdef GDK_RENDERING_VULKAN
|
||||
@@ -197,7 +197,7 @@ gsk_gpu_shader_op_alloc (GskGpuFrame *frame,
|
||||
self->variation = variation;
|
||||
self->clip = clip;
|
||||
if (desc)
|
||||
self->desc = g_object_ref (desc);
|
||||
self->desc = gsk_gpu_descriptors_ref (desc);
|
||||
else
|
||||
self->desc = NULL;
|
||||
self->vertex_offset = gsk_gpu_frame_reserve_vertex_data (frame, op_class->vertex_size);
|
||||
|
@@ -119,6 +119,8 @@ typedef enum {
|
||||
GSK_GPU_OPTIMIZE_GRADIENTS = 1 << 4,
|
||||
GSK_GPU_OPTIMIZE_MIPMAP = 1 << 5,
|
||||
GSK_GPU_OPTIMIZE_GLYPH_ALIGN = 1 << 6,
|
||||
GSK_GPU_OPTIMIZE_MAP_BUFFER = 1 << 7,
|
||||
|
||||
/* These require hardware support */
|
||||
GSK_GPU_OPTIMIZE_GL_BASE_INSTANCE = 1 << 7,
|
||||
} GskGpuOptimizations;
|
||||
|
@@ -6,22 +6,13 @@
|
||||
#include "gskvulkanframeprivate.h"
|
||||
#include "gskvulkanimageprivate.h"
|
||||
|
||||
G_DEFINE_TYPE (GskVulkanDescriptors, gsk_vulkan_descriptors, GSK_TYPE_GPU_DESCRIPTORS)
|
||||
|
||||
static void
|
||||
gsk_vulkan_descriptors_class_init (GskVulkanDescriptorsClass *klass)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_vulkan_descriptors_init (GskVulkanDescriptors *self)
|
||||
{
|
||||
}
|
||||
|
||||
GskVulkanPipelineLayout *
|
||||
gsk_vulkan_descriptors_get_pipeline_layout (GskVulkanDescriptors *self)
|
||||
{
|
||||
return GSK_VULKAN_DESCRIPTORS_GET_CLASS (self)->get_pipeline_layout (self);
|
||||
GskGpuDescriptors *desc = GSK_GPU_DESCRIPTORS (self);
|
||||
GskVulkanDescriptorsClass *class = GSK_VULKAN_DESCRIPTORS_CLASS (desc->desc_class);
|
||||
|
||||
return class->get_pipeline_layout (self);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -48,5 +39,20 @@ gsk_vulkan_descriptors_bind (GskVulkanDescriptors *self,
|
||||
GskVulkanDescriptors *previous,
|
||||
VkCommandBuffer vk_command_buffer)
|
||||
{
|
||||
return GSK_VULKAN_DESCRIPTORS_GET_CLASS (self)->bind (self, previous, vk_command_buffer);
|
||||
GskGpuDescriptors *desc = GSK_GPU_DESCRIPTORS (self);
|
||||
GskVulkanDescriptorsClass *class = GSK_VULKAN_DESCRIPTORS_CLASS (desc->desc_class);
|
||||
|
||||
return class->bind (self, previous, vk_command_buffer);
|
||||
}
|
||||
|
||||
void
|
||||
gsk_vulkan_descriptors_init (GskVulkanDescriptors *self)
|
||||
{
|
||||
gsk_gpu_descriptors_init ((GskGpuDescriptors *) self);
|
||||
}
|
||||
|
||||
void
|
||||
gsk_vulkan_descriptors_finalize (GskVulkanDescriptors *self)
|
||||
{
|
||||
gsk_gpu_descriptors_finalize ((GskGpuDescriptors *) self);
|
||||
}
|
||||
|
@@ -6,15 +6,12 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GSK_TYPE_VULKAN_DESCRIPTORS (gsk_vulkan_descriptors_get_type ())
|
||||
#define GSK_VULKAN_DESCRIPTORS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSK_TYPE_VULKAN_DESCRIPTORS, GskVulkanDescriptors))
|
||||
#define GSK_VULKAN_DESCRIPTORS_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GSK_TYPE_VULKAN_DESCRIPTORS, GskVulkanDescriptorsClass))
|
||||
#define GSK_IS_VULKAN_DESCRIPTORS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSK_TYPE_VULKAN_DESCRIPTORS))
|
||||
#define GSK_IS_VULKAN_DESCRIPTORS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSK_TYPE_VULKAN_DESCRIPTORS))
|
||||
#define GSK_VULKAN_DESCRIPTORS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSK_TYPE_VULKAN_DESCRIPTORS, GskVulkanDescriptorsClass))
|
||||
|
||||
typedef struct _GskVulkanDescriptors GskVulkanDescriptors;
|
||||
typedef struct _GskVulkanDescriptorsClass GskVulkanDescriptorsClass;
|
||||
|
||||
#define GSK_VULKAN_DESCRIPTORS(d) ((GskVulkanDescriptors *) (d))
|
||||
#define GSK_VULKAN_DESCRIPTORS_CLASS(d) ((GskVulkanDescriptorsClass *) (d))
|
||||
|
||||
struct _GskVulkanDescriptors
|
||||
{
|
||||
GskGpuDescriptors parent_instance;
|
||||
@@ -30,8 +27,6 @@ struct _GskVulkanDescriptorsClass
|
||||
VkCommandBuffer vk_command_buffer);
|
||||
};
|
||||
|
||||
GType gsk_vulkan_descriptors_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GskVulkanPipelineLayout * gsk_vulkan_descriptors_get_pipeline_layout (GskVulkanDescriptors *self);
|
||||
|
||||
void gsk_vulkan_descriptors_transition (GskVulkanDescriptors *self,
|
||||
@@ -41,7 +36,8 @@ void gsk_vulkan_descriptors_bind
|
||||
GskVulkanDescriptors *previous,
|
||||
VkCommandBuffer vk_command_buffer);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GskVulkanDescriptors, g_object_unref)
|
||||
void gsk_vulkan_descriptors_init (GskVulkanDescriptors *self);
|
||||
void gsk_vulkan_descriptors_finalize (GskVulkanDescriptors *self);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@@ -13,10 +13,16 @@
|
||||
#include "gdk/gdkdisplayprivate.h"
|
||||
#include "gdk/gdkdmabuftextureprivate.h"
|
||||
|
||||
static inline void
|
||||
gsk_vulkan_real_descriptors_unref (GskVulkanRealDescriptors *desc)
|
||||
{
|
||||
gsk_gpu_descriptors_unref (GSK_GPU_DESCRIPTORS (desc));
|
||||
}
|
||||
|
||||
#define GDK_ARRAY_NAME gsk_descriptors
|
||||
#define GDK_ARRAY_TYPE_NAME GskDescriptors
|
||||
#define GDK_ARRAY_ELEMENT_TYPE GskVulkanRealDescriptors *
|
||||
#define GDK_ARRAY_FREE_FUNC g_object_unref
|
||||
#define GDK_ARRAY_FREE_FUNC gsk_vulkan_real_descriptors_unref
|
||||
#define GDK_ARRAY_NO_MEMSET 1
|
||||
#include "gdk/gdkarrayimpl.c"
|
||||
|
||||
@@ -262,7 +268,7 @@ gsk_vulkan_frame_create_descriptors (GskGpuFrame *frame)
|
||||
desc = gsk_vulkan_real_descriptors_new (self);
|
||||
gsk_descriptors_append (&self->descriptors, desc);
|
||||
|
||||
return GSK_GPU_DESCRIPTORS (g_object_ref (desc));
|
||||
return gsk_gpu_descriptors_ref (GSK_GPU_DESCRIPTORS (desc));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2,9 +2,7 @@
|
||||
|
||||
#include "gskvulkanrealdescriptorsprivate.h"
|
||||
|
||||
#include "gskvulkanbufferprivate.h"
|
||||
#include "gskvulkanframeprivate.h"
|
||||
#include "gskvulkanimageprivate.h"
|
||||
#define INCLUDE_IMPL 1
|
||||
|
||||
#define GDK_ARRAY_NAME gsk_descriptor_image_infos
|
||||
#define GDK_ARRAY_TYPE_NAME GskDescriptorImageInfos
|
||||
@@ -14,6 +12,8 @@
|
||||
#define GDK_ARRAY_NO_MEMSET 1
|
||||
#include "gdk/gdkarrayimpl.c"
|
||||
|
||||
#define INCLUDE_IMPL 1
|
||||
|
||||
#define GDK_ARRAY_NAME gsk_descriptor_buffer_infos
|
||||
#define GDK_ARRAY_TYPE_NAME GskDescriptorBufferInfos
|
||||
#define GDK_ARRAY_ELEMENT_TYPE VkDescriptorBufferInfo
|
||||
@@ -22,6 +22,8 @@
|
||||
#define GDK_ARRAY_NO_MEMSET 1
|
||||
#include "gdk/gdkarrayimpl.c"
|
||||
|
||||
#define INCLUDE_IMPL 1
|
||||
|
||||
#define GDK_ARRAY_NAME gsk_samplers
|
||||
#define GDK_ARRAY_TYPE_NAME GskSamplers
|
||||
#define GDK_ARRAY_ELEMENT_TYPE VkSampler
|
||||
@@ -29,24 +31,6 @@
|
||||
#define GDK_ARRAY_NO_MEMSET 1
|
||||
#include "gdk/gdkarrayimpl.c"
|
||||
|
||||
struct _GskVulkanRealDescriptors
|
||||
{
|
||||
GskVulkanDescriptors parent_instance;
|
||||
|
||||
GskVulkanFrame *frame; /* no reference, the frame owns us */
|
||||
|
||||
GskVulkanPipelineLayout *pipeline_layout;
|
||||
|
||||
GskSamplers immutable_samplers;
|
||||
GskDescriptorImageInfos descriptor_immutable_images;
|
||||
GskDescriptorImageInfos descriptor_images;
|
||||
GskDescriptorBufferInfos descriptor_buffers;
|
||||
|
||||
VkDescriptorSet descriptor_sets[GSK_VULKAN_N_DESCRIPTOR_SETS];
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GskVulkanRealDescriptors, gsk_vulkan_real_descriptors, GSK_TYPE_VULKAN_DESCRIPTORS)
|
||||
|
||||
static GskVulkanPipelineLayout *
|
||||
gsk_vulkan_real_descriptors_get_pipeline_layout (GskVulkanDescriptors *desc)
|
||||
{
|
||||
@@ -154,9 +138,9 @@ gsk_vulkan_real_descriptors_add_buffer (GskGpuDescriptors *desc,
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_vulkan_real_descriptors_finalize (GObject *object)
|
||||
gsk_vulkan_real_descriptors_finalize (GskGpuDescriptors *desc)
|
||||
{
|
||||
GskVulkanRealDescriptors *self = GSK_VULKAN_REAL_DESCRIPTORS (object);
|
||||
GskVulkanRealDescriptors *self = GSK_VULKAN_REAL_DESCRIPTORS (desc);
|
||||
|
||||
gsk_samplers_clear (&self->immutable_samplers);
|
||||
gsk_descriptor_image_infos_clear (&self->descriptor_immutable_images);
|
||||
@@ -166,28 +150,25 @@ gsk_vulkan_real_descriptors_finalize (GObject *object)
|
||||
gsk_vulkan_device_release_pipeline_layout (GSK_VULKAN_DEVICE (gsk_gpu_frame_get_device (GSK_GPU_FRAME (self->frame))),
|
||||
self->pipeline_layout);
|
||||
|
||||
G_OBJECT_CLASS (gsk_vulkan_real_descriptors_parent_class)->finalize (object);
|
||||
gsk_vulkan_descriptors_finalize ((GskVulkanDescriptors *) desc);
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_vulkan_real_descriptors_class_init (GskVulkanRealDescriptorsClass *klass)
|
||||
static GskVulkanDescriptorsClass GSK_VULKAN_REAL_DESCRIPTORS_CLASS =
|
||||
{
|
||||
GskVulkanDescriptorsClass *vulkan_descriptors_class = GSK_VULKAN_DESCRIPTORS_CLASS (klass);
|
||||
GskGpuDescriptorsClass *descriptors_class = GSK_GPU_DESCRIPTORS_CLASS (klass);
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->finalize = gsk_vulkan_real_descriptors_finalize;
|
||||
|
||||
descriptors_class->add_image = gsk_vulkan_real_descriptors_add_image;
|
||||
descriptors_class->add_buffer = gsk_vulkan_real_descriptors_add_buffer;
|
||||
|
||||
vulkan_descriptors_class->get_pipeline_layout = gsk_vulkan_real_descriptors_get_pipeline_layout;
|
||||
vulkan_descriptors_class->bind = gsk_vulkan_real_descriptors_bind;
|
||||
}
|
||||
.parent_class = (GskGpuDescriptorsClass) {
|
||||
.finalize = gsk_vulkan_real_descriptors_finalize,
|
||||
.add_image = gsk_vulkan_real_descriptors_add_image,
|
||||
.add_buffer = gsk_vulkan_real_descriptors_add_buffer,
|
||||
},
|
||||
.get_pipeline_layout = gsk_vulkan_real_descriptors_get_pipeline_layout,
|
||||
.bind = gsk_vulkan_real_descriptors_bind
|
||||
};
|
||||
|
||||
static void
|
||||
gsk_vulkan_real_descriptors_init (GskVulkanRealDescriptors *self)
|
||||
{
|
||||
gsk_vulkan_descriptors_init (GSK_VULKAN_DESCRIPTORS (self));
|
||||
|
||||
gsk_samplers_init (&self->immutable_samplers);
|
||||
gsk_descriptor_image_infos_init (&self->descriptor_immutable_images);
|
||||
gsk_descriptor_image_infos_init (&self->descriptor_images);
|
||||
@@ -198,8 +179,15 @@ GskVulkanRealDescriptors *
|
||||
gsk_vulkan_real_descriptors_new (GskVulkanFrame *frame)
|
||||
{
|
||||
GskVulkanRealDescriptors *self;
|
||||
GskGpuDescriptors *desc;
|
||||
|
||||
self = g_object_new (GSK_TYPE_VULKAN_REAL_DESCRIPTORS, NULL);
|
||||
self = g_new0 (GskVulkanRealDescriptors, 1);
|
||||
|
||||
desc = GSK_GPU_DESCRIPTORS (self);
|
||||
desc->ref_count = 1;
|
||||
desc->desc_class = (GskGpuDescriptorsClass *) &GSK_VULKAN_REAL_DESCRIPTORS_CLASS;
|
||||
|
||||
gsk_vulkan_real_descriptors_init (self);
|
||||
|
||||
self->frame = frame;
|
||||
|
||||
|
@@ -3,11 +3,61 @@
|
||||
#include "gskvulkandescriptorsprivate.h"
|
||||
#include "gskvulkanframeprivate.h"
|
||||
|
||||
#include "gskvulkanbufferprivate.h"
|
||||
#include "gskvulkanframeprivate.h"
|
||||
#include "gskvulkanimageprivate.h"
|
||||
|
||||
#define INCLUDE_DECL 1
|
||||
|
||||
#define GDK_ARRAY_NAME gsk_descriptor_image_infos
|
||||
#define GDK_ARRAY_TYPE_NAME GskDescriptorImageInfos
|
||||
#define GDK_ARRAY_ELEMENT_TYPE VkDescriptorImageInfo
|
||||
#define GDK_ARRAY_BY_VALUE 1
|
||||
#define GDK_ARRAY_PREALLOC 128
|
||||
#define GDK_ARRAY_NO_MEMSET 1
|
||||
#include "gdk/gdkarrayimpl.c"
|
||||
|
||||
#define INCLUDE_DECL 1
|
||||
|
||||
#define GDK_ARRAY_NAME gsk_descriptor_buffer_infos
|
||||
#define GDK_ARRAY_TYPE_NAME GskDescriptorBufferInfos
|
||||
#define GDK_ARRAY_ELEMENT_TYPE VkDescriptorBufferInfo
|
||||
#define GDK_ARRAY_BY_VALUE 1
|
||||
#define GDK_ARRAY_PREALLOC 32
|
||||
#define GDK_ARRAY_NO_MEMSET 1
|
||||
#include "gdk/gdkarrayimpl.c"
|
||||
|
||||
#define INCLUDE_DECL 1
|
||||
|
||||
#define GDK_ARRAY_NAME gsk_samplers
|
||||
#define GDK_ARRAY_TYPE_NAME GskSamplers
|
||||
#define GDK_ARRAY_ELEMENT_TYPE VkSampler
|
||||
#define GDK_ARRAY_PREALLOC 32
|
||||
#define GDK_ARRAY_NO_MEMSET 1
|
||||
#include "gdk/gdkarrayimpl.c"
|
||||
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GSK_TYPE_VULKAN_REAL_DESCRIPTORS (gsk_vulkan_real_descriptors_get_type ())
|
||||
typedef struct _GskVulkanRealDescriptors GskVulkanRealDescriptors;
|
||||
|
||||
G_DECLARE_FINAL_TYPE (GskVulkanRealDescriptors, gsk_vulkan_real_descriptors, GSK, VULKAN_REAL_DESCRIPTORS, GskVulkanDescriptors)
|
||||
#define GSK_VULKAN_REAL_DESCRIPTORS(d) ((GskVulkanRealDescriptors *) (d))
|
||||
|
||||
struct _GskVulkanRealDescriptors
|
||||
{
|
||||
GskVulkanDescriptors parent_instance;
|
||||
|
||||
GskVulkanFrame *frame; /* no reference, the frame owns us */
|
||||
|
||||
GskVulkanPipelineLayout *pipeline_layout;
|
||||
|
||||
GskSamplers immutable_samplers;
|
||||
GskDescriptorImageInfos descriptor_immutable_images;
|
||||
GskDescriptorImageInfos descriptor_images;
|
||||
GskDescriptorBufferInfos descriptor_buffers;
|
||||
|
||||
VkDescriptorSet descriptor_sets[GSK_VULKAN_N_DESCRIPTOR_SETS];
|
||||
};
|
||||
|
||||
GskVulkanRealDescriptors * gsk_vulkan_real_descriptors_new (GskVulkanFrame *frame);
|
||||
|
||||
|
@@ -2,15 +2,32 @@
|
||||
|
||||
#include "gskvulkansubdescriptorsprivate.h"
|
||||
|
||||
struct _GskVulkanSubDescriptors
|
||||
|
||||
static void gsk_vulkan_sub_descriptors_finalize (GskGpuDescriptors *desc);
|
||||
static gboolean gsk_vulkan_sub_descriptors_add_buffer (GskGpuDescriptors *desc,
|
||||
GskGpuBuffer *buffer,
|
||||
guint32 *out_descriptor);
|
||||
static gboolean gsk_vulkan_sub_descriptors_add_image (GskGpuDescriptors *desc,
|
||||
GskGpuImage *image,
|
||||
GskGpuSampler sampler,
|
||||
guint32 *out_descriptor);
|
||||
static GskVulkanPipelineLayout *
|
||||
gsk_vulkan_sub_descriptors_get_pipeline_layout (GskVulkanDescriptors *desc);
|
||||
static void gsk_vulkan_sub_descriptors_bind (GskVulkanDescriptors *desc,
|
||||
GskVulkanDescriptors *previous,
|
||||
VkCommandBuffer vk_command_buffer);
|
||||
|
||||
static GskVulkanDescriptorsClass GSK_VULKAN_SUB_DESCRIPTORS_CLASS =
|
||||
{
|
||||
GskVulkanDescriptors parent_instance;
|
||||
|
||||
GskVulkanDescriptors *parent;
|
||||
.parent_class = (GskGpuDescriptorsClass) {
|
||||
.finalize = gsk_vulkan_sub_descriptors_finalize,
|
||||
.add_image = gsk_vulkan_sub_descriptors_add_image,
|
||||
.add_buffer = gsk_vulkan_sub_descriptors_add_buffer,
|
||||
},
|
||||
.get_pipeline_layout = gsk_vulkan_sub_descriptors_get_pipeline_layout,
|
||||
.bind = gsk_vulkan_sub_descriptors_bind,
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GskVulkanSubDescriptors, gsk_vulkan_sub_descriptors, GSK_TYPE_VULKAN_DESCRIPTORS)
|
||||
|
||||
static GskVulkanPipelineLayout *
|
||||
gsk_vulkan_sub_descriptors_get_pipeline_layout (GskVulkanDescriptors *desc)
|
||||
{
|
||||
@@ -26,7 +43,7 @@ gsk_vulkan_sub_descriptors_bind (GskVulkanDescriptors *desc,
|
||||
{
|
||||
GskVulkanSubDescriptors *self = GSK_VULKAN_SUB_DESCRIPTORS (desc);
|
||||
|
||||
if (GSK_IS_VULKAN_SUB_DESCRIPTORS (previous))
|
||||
if (GSK_GPU_DESCRIPTORS (previous)->desc_class == (GskGpuDescriptorsClass *) &GSK_VULKAN_SUB_DESCRIPTORS_CLASS)
|
||||
previous = GSK_VULKAN_SUB_DESCRIPTORS (previous)->parent;
|
||||
|
||||
if (self->parent == previous)
|
||||
@@ -62,45 +79,35 @@ gsk_vulkan_sub_descriptors_add_buffer (GskGpuDescriptors *desc,
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_vulkan_sub_descriptors_finalize (GObject *object)
|
||||
gsk_vulkan_sub_descriptors_finalize (GskGpuDescriptors *desc)
|
||||
{
|
||||
GskVulkanSubDescriptors *self = GSK_VULKAN_SUB_DESCRIPTORS (object);
|
||||
GskVulkanSubDescriptors *self = GSK_VULKAN_SUB_DESCRIPTORS (desc);
|
||||
|
||||
g_object_unref (self->parent);
|
||||
gsk_gpu_descriptors_unref (GSK_GPU_DESCRIPTORS (self->parent));
|
||||
|
||||
G_OBJECT_CLASS (gsk_vulkan_sub_descriptors_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_vulkan_sub_descriptors_class_init (GskVulkanSubDescriptorsClass *klass)
|
||||
{
|
||||
GskVulkanDescriptorsClass *vulkan_descriptors_class = GSK_VULKAN_DESCRIPTORS_CLASS (klass);
|
||||
GskGpuDescriptorsClass *descriptors_class = GSK_GPU_DESCRIPTORS_CLASS (klass);
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->finalize = gsk_vulkan_sub_descriptors_finalize;
|
||||
|
||||
descriptors_class->add_image = gsk_vulkan_sub_descriptors_add_image;
|
||||
descriptors_class->add_buffer = gsk_vulkan_sub_descriptors_add_buffer;
|
||||
|
||||
vulkan_descriptors_class->get_pipeline_layout = gsk_vulkan_sub_descriptors_get_pipeline_layout;
|
||||
vulkan_descriptors_class->bind = gsk_vulkan_sub_descriptors_bind;
|
||||
gsk_vulkan_descriptors_finalize (GSK_VULKAN_DESCRIPTORS (self));
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_vulkan_sub_descriptors_init (GskVulkanSubDescriptors *self)
|
||||
{
|
||||
gsk_vulkan_descriptors_init (GSK_VULKAN_DESCRIPTORS (self));
|
||||
}
|
||||
|
||||
GskVulkanSubDescriptors *
|
||||
gsk_vulkan_sub_descriptors_new (GskVulkanDescriptors *parent)
|
||||
{
|
||||
GskVulkanSubDescriptors *self;
|
||||
GskGpuDescriptors *desc;
|
||||
|
||||
self = g_object_new (GSK_TYPE_VULKAN_SUB_DESCRIPTORS, NULL);
|
||||
self = g_new0 (GskVulkanSubDescriptors, 1);
|
||||
desc = GSK_GPU_DESCRIPTORS (self);
|
||||
|
||||
self->parent = g_object_ref (parent);
|
||||
desc->ref_count = 1;
|
||||
desc->desc_class = (GskGpuDescriptorsClass *) &GSK_VULKAN_SUB_DESCRIPTORS_CLASS;
|
||||
gsk_vulkan_sub_descriptors_init (self);
|
||||
|
||||
self->parent = GSK_VULKAN_DESCRIPTORS (gsk_gpu_descriptors_ref (GSK_GPU_DESCRIPTORS (parent)));
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
|
@@ -4,9 +4,16 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GSK_TYPE_VULKAN_SUB_DESCRIPTORS (gsk_vulkan_sub_descriptors_get_type ())
|
||||
typedef struct _GskVulkanSubDescriptors GskVulkanSubDescriptors;
|
||||
|
||||
G_DECLARE_FINAL_TYPE (GskVulkanSubDescriptors, gsk_vulkan_sub_descriptors, GSK, VULKAN_SUB_DESCRIPTORS, GskVulkanDescriptors)
|
||||
#define GSK_VULKAN_SUB_DESCRIPTORS(d) ((GskVulkanSubDescriptors *) (d))
|
||||
|
||||
struct _GskVulkanSubDescriptors
|
||||
{
|
||||
GskVulkanDescriptors parent_instance;
|
||||
|
||||
GskVulkanDescriptors *parent;
|
||||
};
|
||||
|
||||
GskVulkanSubDescriptors * gsk_vulkan_sub_descriptors_new (GskVulkanDescriptors *parent);
|
||||
|
||||
|
@@ -68,6 +68,7 @@ gsk_private_sources = files([
|
||||
'gl/stb_rect_pack.c',
|
||||
'gl/fp16.c',
|
||||
'gpu/gskglbuffer.c',
|
||||
'gpu/gskglmapbuffer.c',
|
||||
'gpu/gskgldevice.c',
|
||||
'gpu/gskgldescriptors.c',
|
||||
'gpu/gskglframe.c',
|
||||
|
Reference in New Issue
Block a user