Compare commits

...

2 Commits

Author SHA1 Message Date
Christian Hergert
c6ef3d02fe gsk/gpu: use glMapBufferRange()
This is just a dummy commit for testing the branch.
2024-03-13 13:04:03 -07:00
Christian Hergert
f5575bc3e9 gsk/gpu: avoid reusing same GskGpuFrame twice in a row
Currently, GskGlFrame does not have a wait implementation which means
we'll always be reusing the same frame. This tries to avoid colliding a
bit by ensuring we flip between a second GskGpuFrame.
2024-03-13 12:38:45 -07:00
2 changed files with 37 additions and 11 deletions

View File

@@ -16,15 +16,14 @@ 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)
{
GskGLBuffer *self = GSK_GL_BUFFER (object);
g_free (self->data);
gsk_gl_buffer_bind (self);
glUnmapBuffer (self->target);
glDeleteBuffers (1, &self->buffer_id);
G_OBJECT_CLASS (gsk_gl_buffer_parent_class)->finalize (object);
@@ -49,9 +48,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);
glFlushMappedBufferRange (self->target, 0, used);
}
static void
@@ -64,8 +61,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
@@ -79,6 +74,7 @@ gsk_gl_buffer_new (GLenum target,
GLenum access)
{
GskGLBuffer *self;
int flags;
self = g_object_new (GSK_TYPE_GL_BUFFER, NULL);
@@ -90,7 +86,23 @@ gsk_gl_buffer_new (GLenum target,
glGenBuffers (1, &self->buffer_id);
glBindBuffer (target, self->buffer_id);
glBufferData (target, size, NULL, GL_STATIC_DRAW);
self->data = malloc (size);
switch (access)
{
case GL_READ_ONLY:
flags = GL_MAP_READ_BIT;
break;
case GL_WRITE_ONLY:
flags = GL_MAP_WRITE_BIT;
break;
case GL_READ_WRITE:
flags = GL_MAP_READ_BIT | GL_MAP_WRITE_BIT;
break;
default:
g_assert_not_reached ();
}
self->data = glMapBufferRange (self->target, 0, size, flags);
return GSK_GPU_BUFFER (self);
}

View File

@@ -43,6 +43,8 @@ struct _GskGpuRendererPrivate
GskGpuOptimizations optimizations;
GskGpuFrame *frames[GSK_GPU_MAX_FRAMES];
GskGpuFrame *last_frame;
};
static void gsk_gpu_renderer_dmabuf_downloader_init (GdkDmabufDownloaderInterface *iface);
@@ -175,13 +177,23 @@ gsk_gpu_renderer_get_frame (GskGpuRenderer *self)
if (priv->frames[i] == NULL)
{
priv->frames[i] = gsk_gpu_renderer_create_frame (self);
g_set_object (&priv->last_frame, priv->frames[i]);
return priv->frames[i];
}
/* Always skip re-use of previous frame */
if (priv->frames[i] == priv->last_frame)
continue;
if (!gsk_gpu_frame_is_busy (priv->frames[i]))
return priv->frames[i];
{
g_set_object (&priv->last_frame, priv->frames[i]);
return priv->frames[i];
}
}
g_clear_object (&priv->last_frame);
GSK_GPU_RENDERER_GET_CLASS (self)->wait (self, priv->frames, GSK_GPU_MAX_FRAMES);
}
}
@@ -221,6 +233,8 @@ gsk_gpu_renderer_unrealize (GskRenderer *renderer)
gsk_gpu_renderer_make_current (self);
g_clear_object (&priv->last_frame);
while (TRUE)
{
for (i = 0, j = 0; i < G_N_ELEMENTS (priv->frames); i++)