From a21d90912905672a52b31d44dad0988f102d29ec Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Fri, 4 Jun 2010 17:06:32 +0100 Subject: [PATCH] primitives: make sure to update texture storage before drawing We want to make sure that the material state flushing code will never result in changes to the texture storage for that material. So for example mipmaps need to be ensured by the primitives code. Changes to the texture storage will invalidate the texture coordinates in the journal and we want to avoid a recursion of journal flushing. --- cogl/cogl-material.c | 2 -- cogl/cogl-primitives.c | 58 +++++++++++++++++++++++++++++++++++---- cogl/cogl-vertex-buffer.c | 7 +++++ 3 files changed, 60 insertions(+), 7 deletions(-) diff --git a/cogl/cogl-material.c b/cogl/cogl-material.c index b6f32125e..d8d8ee150 100644 --- a/cogl/cogl-material.c +++ b/cogl/cogl-material.c @@ -1817,8 +1817,6 @@ _cogl_material_flush_layers_gl_state (CoglMaterial *material, unit = _cogl_get_texture_unit (i); - _cogl_material_layer_ensure_mipmaps (layer_handle); - new_gl_layer_info.layer0_overridden = layer0_override_texture ? TRUE : FALSE; new_gl_layer_info.fallback = diff --git a/cogl/cogl-primitives.c b/cogl/cogl-primitives.c index 61aeae524..03caecbc9 100644 --- a/cogl/cogl-primitives.c +++ b/cogl/cogl-primitives.c @@ -523,9 +523,45 @@ _cogl_rectangles_with_multitexture_coords ( continue; /* We need to ensure the mipmaps are ready before deciding - anything else about the texture because it could become - something completely different if it needs to be migrated out - of the atlas */ + * anything else about the texture because the texture storage + * could completely change if it needs to be migrated out of the + * atlas and will affect how we validate the layer. + * + * FIXME: this needs to be generalized. There could be any + * number of things that might require a shuffling of the + * underlying texture storage. We could add two mechanisms to + * generalize this a bit... + * + * 1) add a _cogl_material_layer_update_storage() function that + * would for instance consider if mipmapping is necessary and + * potentially migrate the texture from an atlas. + * + * 2) allow setting of transient primitive-flags on a material + * that may affect the outcome of _update_storage(). One flag + * could indicate that we expect to sample beyond the bounds of + * the texture border. + * + * flags = COGL_MATERIAL_PRIMITIVE_FLAG_VALID_BORDERS; + * _cogl_material_layer_assert_primitive_flags (layer, flags) + * _cogl_material_layer_update_storage (layer) + * enqueue primitive in journal + * + * when the primitive is dequeued and drawn we should: + * _cogl_material_flush_gl_state (material) + * draw primitive + * _cogl_material_unassert_primitive_flags (layer, flags); + * + * _cogl_material_layer_update_storage should take into + * consideration all the asserted primitive requirements. (E.g. + * there could be multiple primitives in the journal - or in a + * renderlist in the future - that need mipmaps or that need + * valid contents beyond their borders (for cogl_polygon) + * meaning they can't work with textures in an atas, so + * _cogl_material_layer_update_storage would pass on these + * requirements to the texture atlas backend which would make + * sure the referenced texture is migrated out of the atlas and + * mipmaps are generated.) + */ _cogl_material_layer_ensure_mipmaps (layer); tex_handle = cogl_material_layer_get_texture (layer); @@ -1041,10 +1077,22 @@ cogl_polygon (const CoglTextureVertex *vertices, continue; /* Give the texture a chance to know that we're rendering - non-quad shaped primitives. If the texture is in an atlas it - will be migrated */ + * non-quad shaped primitives. If the texture is in an atlas it + * will be migrated + * + * FIXME: this needs to be generalized. There could be any + * number of things that might require a shuffling of the + * underlying texture storage. + */ _cogl_texture_ensure_non_quad_rendering (tex_handle); + /* We need to ensure the mipmaps are ready before deciding + * anything else about the texture because the texture storate + * could completely change if it needs to be migrated out of the + * atlas and will affect how we validate the layer. + */ + _cogl_material_layer_ensure_mipmaps (layer); + if (i == 0 && cogl_texture_is_sliced (tex_handle)) { #if defined (HAVE_COGL_GLES) || defined (HAVE_COGL_GLES2) diff --git a/cogl/cogl-vertex-buffer.c b/cogl/cogl-vertex-buffer.c index 47e11a5bd..0684cba7d 100644 --- a/cogl/cogl-vertex-buffer.c +++ b/cogl/cogl-vertex-buffer.c @@ -1652,6 +1652,13 @@ enable_state_for_drawing_buffer (CoglVertexBuffer *buffer) will be migrated */ _cogl_texture_ensure_non_quad_rendering (tex_handle); + /* We need to ensure the mipmaps are ready before deciding + * anything else about the texture because the texture storate + * could completely change if it needs to be migrated out of the + * atlas and will affect how we validate the layer. + */ + _cogl_material_layer_ensure_mipmaps (layer); + if (!_cogl_texture_can_hardware_repeat (tex_handle)) { g_warning ("Disabling layer %d of the current source material, "