summaryrefslogtreecommitdiff
path: root/gsk
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-06-18 06:50:59 -0700
committerMatthias Clasen <mclasen@redhat.com>2021-06-18 06:50:59 -0700
commitf58fc6b22e143e43b45f297795959f217a26d95f (patch)
treeda0f1ccdc358e06fd1df5d28c05b7b394c1de0f0 /gsk
parentfb052c8d2546706b49e5adb87bc88ad600f31752 (diff)
downloadgtk+-f58fc6b22e143e43b45f297795959f217a26d95f.tar.gz
gsk: Respect max element vertices limitation
We are pretty good at batching commands now, and we can easily produce batches that exceed the maximum number of elements per draw call that the hw can handle. Query that number, and respect it when merging batches. This fixes the rendering of the overview map in GtkSourceView.
Diffstat (limited to 'gsk')
-rw-r--r--gsk/ngl/gsknglcommandqueue.c6
-rw-r--r--gsk/ngl/gsknglcommandqueueprivate.h6
2 files changed, 11 insertions, 1 deletions
diff --git a/gsk/ngl/gsknglcommandqueue.c b/gsk/ngl/gsknglcommandqueue.c
index 6d61dbaad6..25eb37f53b 100644
--- a/gsk/ngl/gsknglcommandqueue.c
+++ b/gsk/ngl/gsknglcommandqueue.c
@@ -444,9 +444,12 @@ gsk_ngl_command_queue_new (GdkGLContext *context,
else
self->uniforms = gsk_ngl_uniform_state_new ();
- /* Determine max texture size immediately and restore context */
+ /* Determine max texture size and other limitations immediately
+ * and restore context
+ */
gdk_gl_context_make_current (context);
glGetIntegerv (GL_MAX_TEXTURE_SIZE, &self->max_texture_size);
+ glGetIntegerv (GL_MAX_ELEMENTS_VERTICES, &self->max_elements_vertices);
return g_steal_pointer (&self);
}
@@ -617,6 +620,7 @@ gsk_ngl_command_queue_end_draw (GskNglCommandQueue *self)
last_batch->any.viewport.height == batch->any.viewport.height &&
last_batch->draw.framebuffer == batch->draw.framebuffer &&
last_batch->draw.vbo_offset + last_batch->draw.vbo_count == batch->draw.vbo_offset &&
+ last_batch->draw.vbo_count + batch->draw.vbo_count <= self->max_elements_vertices &&
snapshots_equal (self, last_batch, batch))
{
last_batch->draw.vbo_count += batch->draw.vbo_count;
diff --git a/gsk/ngl/gsknglcommandqueueprivate.h b/gsk/ngl/gsknglcommandqueueprivate.h
index a2f50c485d..3ed52021bc 100644
--- a/gsk/ngl/gsknglcommandqueueprivate.h
+++ b/gsk/ngl/gsknglcommandqueueprivate.h
@@ -231,6 +231,12 @@ struct _GskNglCommandQueue
*/
int max_texture_size;
+ /* Discovered max element count. We must not create batches that contain
+ * more vertices than this number.
+ */
+
+ int max_elements_vertices;
+
/* The index of the last batch in @batches, which may not be the element
* at the end of the array, as batches can be reordered. This is used to
* update the "next" index when adding a new batch.