diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c index 3cef508b708..9d0851c41ca 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup.c +++ b/src/gallium/drivers/llvmpipe/lp_setup.c @@ -1179,18 +1179,13 @@ lp_setup_is_resource_referenced( const struct lp_setup_context *setup, return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE; } - /* check textures referenced by the scene */ + /* check resources referenced by the scene */ for (i = 0; i < setup->num_active_scenes; i++) { unsigned ref = lp_scene_is_resource_referenced(setup->scenes[i], texture); if (ref) return ref; } - for (i = 0; i < ARRAY_SIZE(setup->ssbos); i++) { - if (setup->ssbos[i].current.buffer == texture) - return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE; - } - for (i = 0; i < ARRAY_SIZE(setup->images); i++) { if (setup->images[i].current.resource == texture) return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE; @@ -1408,6 +1403,17 @@ try_update_scene_state( struct lp_setup_context *setup ) } } } + + for (i = 0; i < ARRAY_SIZE(setup->ssbos); i++) { + if (setup->ssbos[i].current.buffer) { + if (!lp_scene_add_resource_reference(scene, + setup->ssbos[i].current.buffer, + new_scene, setup->ssbo_write_mask & (1 << i))) { + assert(!new_scene); + return FALSE; + } + } + } } } diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c index dd250baae6c..768128f7d41 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c @@ -4042,6 +4042,12 @@ llvmpipe_set_shader_buffers(struct pipe_context *pipe, util_copy_shader_buffer(&llvmpipe->ssbos[shader][i], buffer); + if (buffer && buffer->buffer) { + boolean read_only = !(writable_bitmask & (1 << idx)); + llvmpipe_flush_resource(pipe, buffer->buffer, 0, read_only, false, + false, "buffer"); + } + if (shader == PIPE_SHADER_VERTEX || shader == PIPE_SHADER_GEOMETRY || shader == PIPE_SHADER_TESS_CTRL ||