Skip to content

Commit

Permalink
pipeline_compat: improve API related to pgcraft_texture_info/image
Browse files Browse the repository at this point in the history
pgcraft_texture_info and image structures/pointers are now stored in separate
array in pgcraft_compat_info.

ngli_pgcraft_get_texture_infos() is removed since all the required
information can now be found in the pgcraft_compat_info structure.

ngli_pipeline_compat_update_texture_infos() is renamed to
ngli_pipeline_compat_update_image() and now takes an index and an image as
arguments.
  • Loading branch information
mbouron committed Nov 21, 2023
1 parent cc6fb58 commit e33e6b7
Show file tree
Hide file tree
Showing 8 changed files with 47 additions and 53 deletions.
8 changes: 1 addition & 7 deletions libnopegl/src/hwconv.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,13 +167,7 @@ int ngli_hwconv_convert_image(struct hwconv *hwconv, const struct image *image)

struct pipeline_compat *pipeline = hwconv->pipeline_compat;

const struct darray *texture_infos_array = ngli_pgcraft_get_texture_infos(hwconv->crafter);
ngli_assert(ngli_darray_count(texture_infos_array) == 1);

struct pgcraft_texture_info *info = ngli_darray_data(texture_infos_array);
info->image = image;

ngli_pipeline_compat_update_texture_info(pipeline, info);
ngli_pipeline_compat_update_image(pipeline, 0, image);
ngli_pipeline_compat_draw(pipeline, 3, 1);

ngli_gpu_ctx_end_render_pass(gpu_ctx);
Expand Down
18 changes: 7 additions & 11 deletions libnopegl/src/node_colorstats.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ struct colorstats_priv {
struct pipeline_compat *pipeline_compat;
uint32_t wg_count;
int32_t block_index;
const struct pgcraft_texture_info *texture_info;
size_t texture_image_rev;
const struct image *image;
size_t image_rev;
} waveform;

/* Summary-scale compute */
Expand Down Expand Up @@ -169,9 +169,8 @@ static int setup_waveform_compute(struct colorstats_priv *s, const struct pgcraf
if (ret < 0)
return ret;

const struct darray *texture_infos_array = ngli_pgcraft_get_texture_infos(s->waveform.crafter);
s->waveform.texture_info = ngli_darray_get(texture_infos_array, 0);
s->waveform.texture_image_rev = SIZE_MAX;
s->waveform.image = &texture_priv->image;
s->waveform.image_rev = SIZE_MAX;

s->waveform.block_index = ngli_pgcraft_get_block_index(s->waveform.crafter, block->name, block->stage);

Expand Down Expand Up @@ -401,13 +400,10 @@ static void colorstats_draw(struct ngl_node *node)
ngli_pipeline_compat_dispatch(s->init.pipeline_compat, s->init.wg_count, 1, 1);

/* Waveform */
const struct image *image = s->waveform.texture_info->image;
ngli_assert(image);
if (s->waveform.texture_image_rev != image->rev) {
ngli_pipeline_compat_update_texture_info(s->waveform.pipeline_compat, s->waveform.texture_info);
s->waveform.texture_image_rev = image->rev;
if (s->waveform.image_rev != s->waveform.image->rev) {
ngli_pipeline_compat_update_image(s->waveform.pipeline_compat, 0, s->waveform.image);
s->waveform.image_rev = s->waveform.image->rev;
}

ngli_pipeline_compat_dispatch(s->waveform.pipeline_compat, s->waveform.wg_count, 1, 1);

/* Summary-scale */
Expand Down
23 changes: 10 additions & 13 deletions libnopegl/src/node_renderother.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ struct resource_map {
};

struct texture_map {
const struct pgcraft_texture_info *info;
const struct image *image;
size_t image_rev;
};

Expand Down Expand Up @@ -975,10 +975,9 @@ static int renderdisplace_prepare(struct ngl_node *node)
return ret;

ngli_darray_init(&desc->textures_map, sizeof(struct texture_map), 0);
const struct darray *texture_infos_array = ngli_pgcraft_get_texture_infos(desc->crafter);
const struct pgcraft_texture_info *infos = ngli_darray_data(texture_infos_array);
for (size_t i = 0; i < ngli_darray_count(texture_infos_array); i++) {
const struct texture_map map = {.info = &infos[i], .image_rev = SIZE_MAX};
const struct pgcraft_compat_info *info = ngli_pgcraft_get_compat_info(desc->crafter);
for (size_t i = 0; i < info->nb_texture_infos; i++) {
const struct texture_map map = {.image = info->images[i], .image_rev = SIZE_MAX};
if (!ngli_darray_push(&desc->textures_map, &map))
return NGL_ERROR_MEMORY;
}
Expand Down Expand Up @@ -1245,10 +1244,9 @@ static int rendertexture_prepare(struct ngl_node *node)
return ret;

ngli_darray_init(&desc->textures_map, sizeof(struct texture_map), 0);
const struct darray *texture_infos_array = ngli_pgcraft_get_texture_infos(desc->crafter);
const struct pgcraft_texture_info *infos = ngli_darray_data(texture_infos_array);
for (size_t i = 0; i < ngli_darray_count(texture_infos_array); i++) {
const struct texture_map map = {.info = &infos[i], .image_rev = SIZE_MAX};
const struct pgcraft_compat_info *info = ngli_pgcraft_get_compat_info(desc->crafter);
for (size_t i = 0; i < info->nb_texture_infos; i++) {
const struct texture_map map = {.image = info->images[i], .image_rev = SIZE_MAX};
if (!ngli_darray_push(&desc->textures_map, &map))
return NGL_ERROR_MEMORY;
}
Expand Down Expand Up @@ -1345,10 +1343,9 @@ static void renderother_draw(struct ngl_node *node, struct render_common *s, con
if (node->cls->id == NGL_NODE_RENDERTEXTURE || node->cls->id == NGL_NODE_RENDERDISPLACE) {
struct texture_map *texture_map = ngli_darray_data(&desc->textures_map);
for (size_t i = 0; i < ngli_darray_count(&desc->textures_map); i++) {
const struct pgcraft_texture_info *info = texture_map[i].info;
if (texture_map[i].image_rev != info->image->rev) {
ngli_pipeline_compat_update_texture_info(pl_compat, info);
texture_map[i].image_rev = info->image->rev;
if (texture_map[i].image_rev != texture_map[i].image->rev) {
ngli_pipeline_compat_update_image(pl_compat, (int32_t)i, texture_map[i].image);
texture_map[i].image_rev = texture_map[i].image->rev;
}
}
}
Expand Down
16 changes: 7 additions & 9 deletions libnopegl/src/pass.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ struct resource_map {
};

struct texture_map {
const struct pgcraft_texture_info *info;
const struct image *image;
size_t image_rev;
};

Expand Down Expand Up @@ -622,10 +622,9 @@ int ngli_pass_prepare(struct pass *s)
desc->resolution_index = ngli_pgcraft_get_uniform_index(desc->crafter, "ngl_resolution", NGLI_PROGRAM_SHADER_FRAG);

ngli_darray_init(&desc->textures_map, sizeof(struct texture_map), 0);
const struct darray *texture_infos_array = ngli_pgcraft_get_texture_infos(desc->crafter);
const struct pgcraft_texture_info *infos = ngli_darray_data(texture_infos_array);
for (size_t i = 0; i < ngli_darray_count(texture_infos_array); i++) {
const struct texture_map map = {.info = &infos[i], .image_rev = SIZE_MAX};
const struct pgcraft_compat_info *info = ngli_pgcraft_get_compat_info(desc->crafter);
for (size_t i = 0; i < info->nb_texture_infos; i++) {
const struct texture_map map = {.image = info->images[i], .image_rev = SIZE_MAX};
if (!ngli_darray_push(&desc->textures_map, &map))
return NGL_ERROR_MEMORY;
}
Expand Down Expand Up @@ -721,10 +720,9 @@ int ngli_pass_exec(struct pass *s)

struct texture_map *texture_map = ngli_darray_data(&desc->textures_map);
for (size_t i = 0; i < ngli_darray_count(&desc->textures_map); i++) {
const struct pgcraft_texture_info *info = texture_map[i].info;
if (texture_map[i].image_rev != info->image->rev) {
ngli_pipeline_compat_update_texture_info(pipeline_compat, info);
texture_map[i].image_rev = info->image->rev;
if (texture_map[i].image_rev != texture_map[i].image->rev) {
ngli_pipeline_compat_update_image(pipeline_compat, (int32_t)i, texture_map[i].image);
texture_map[i].image_rev = texture_map[i].image->rev;
}
}

Expand Down
19 changes: 11 additions & 8 deletions libnopegl/src/pgcraft.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ struct pgcraft {
struct ngl_ctx *ctx;

struct darray texture_infos; // pgcraft_texture_info
struct darray images; // image pointer
struct pgcraft_compat_info compat_info;

struct bstr *shaders[NGLI_PROGRAM_SHADER_NB];
Expand Down Expand Up @@ -424,16 +425,16 @@ static int prepare_texture_infos(struct pgcraft *s, const struct pgcraft_params
if (!ngli_darray_push(&s->symbols, texture->name))
return NGL_ERROR_MEMORY;

struct pgcraft_texture_info info = {
.id = ngli_darray_count(&s->symbols) - 1,
.image = texture->image,
};
struct pgcraft_texture_info info = {.id = ngli_darray_count(&s->symbols) - 1};
int ret = prepare_texture_info_fields(s, params, graphics, texture, &info);
if (ret < 0)
return ret;

if (!ngli_darray_push(&s->texture_infos, &info))
return NGL_ERROR_MEMORY;

if (!ngli_darray_push(&s->images, &texture->image))
return NGL_ERROR_MEMORY;
}
return 0;
}
Expand Down Expand Up @@ -1415,6 +1416,7 @@ struct pgcraft *ngli_pgcraft_create(struct ngl_ctx *ctx)
setup_glsl_info(s);

ngli_darray_init(&s->texture_infos, sizeof(struct pgcraft_texture_info), 0);
ngli_darray_init(&s->images, sizeof(struct image *), 0);

struct pgcraft_compat_info *compat_info = &s->compat_info;
for (size_t i = 0; i < NGLI_ARRAY_NB(compat_info->ublocks); i++) {
Expand Down Expand Up @@ -1512,6 +1514,10 @@ int ngli_pgcraft_craft(struct pgcraft *s, const struct pgcraft_params *params)
if (ret < 0)
return ret;

s->compat_info.texture_infos = ngli_darray_data(&s->texture_infos);
s->compat_info.images = ngli_darray_data(&s->images);
s->compat_info.nb_texture_infos = ngli_darray_count(&s->texture_infos);

#if defined(BACKEND_GL) || defined(BACKEND_GLES)
struct ngl_ctx *ctx = s->ctx;
struct ngl_config *config = &ctx->config;
Expand Down Expand Up @@ -1547,10 +1553,6 @@ int32_t ngli_pgcraft_get_block_index(const struct pgcraft *s, const char *name,
}
return -1;
}
const struct darray *ngli_pgcraft_get_texture_infos(const struct pgcraft *s)
{
return &s->texture_infos;
}

int32_t ngli_pgcraft_get_image_index(const struct pgcraft *s, const char *name)
{
Expand Down Expand Up @@ -1636,6 +1638,7 @@ void ngli_pgcraft_freep(struct pgcraft **sp)

ngli_darray_reset(&s->textures);
ngli_darray_reset(&s->texture_infos);
ngli_darray_reset(&s->images);
ngli_darray_reset(&s->vert_out_vars);

struct pgcraft_compat_info *compat_info = &s->compat_info;
Expand Down
6 changes: 4 additions & 2 deletions libnopegl/src/pgcraft.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,6 @@ struct pgcraft_texture_info_field {

struct pgcraft_texture_info {
size_t id;
const struct image *image;
struct pgcraft_texture_info_field fields[NGLI_INFO_FIELD_NB];
};

Expand All @@ -167,6 +166,10 @@ struct pgcraft_compat_info {
struct block ublocks[NGLI_PROGRAM_SHADER_NB];
int32_t ubindings[NGLI_PROGRAM_SHADER_NB];
int32_t uindices[NGLI_PROGRAM_SHADER_NB];

const struct pgcraft_texture_info *texture_infos;
const struct image **images;
size_t nb_texture_infos;
};

struct pgcraft_params {
Expand Down Expand Up @@ -198,7 +201,6 @@ struct pgcraft *ngli_pgcraft_create(struct ngl_ctx *ctx);
int ngli_pgcraft_craft(struct pgcraft *s, const struct pgcraft_params *params);
int32_t ngli_pgcraft_get_uniform_index(const struct pgcraft *s, const char *name, int stage);
int32_t ngli_pgcraft_get_block_index(const struct pgcraft *s, const char *name, int stage);
const struct darray *ngli_pgcraft_get_texture_infos(const struct pgcraft *s);
int32_t ngli_pgcraft_get_image_index(const struct pgcraft *s, const char *name);
const struct pgcraft_compat_info *ngli_pgcraft_get_compat_info(const struct pgcraft *s);
const char *ngli_pgcraft_get_symbol_name(const struct pgcraft *s, size_t id);
Expand Down
8 changes: 6 additions & 2 deletions libnopegl/src/pipeline_compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -317,10 +317,14 @@ int ngli_pipeline_compat_update_dynamic_offsets(struct pipeline_compat *s, const
return 0;
}

void ngli_pipeline_compat_update_texture_info(struct pipeline_compat *s, const struct pgcraft_texture_info *info)
void ngli_pipeline_compat_update_image(struct pipeline_compat *s, int32_t index, const struct image *image)
{
if (index == -1)
return;

ngli_assert(index >= 0 && index < s->compat_info->nb_texture_infos);
const struct pgcraft_texture_info *info = &s->compat_info->texture_infos[index];
const struct pgcraft_texture_info_field *fields = info->fields;
const struct image *image = info->image;

ngli_pipeline_compat_update_uniform(s, fields[NGLI_INFO_FIELD_COORDINATE_MATRIX].index, image->coordinates_matrix);
ngli_pipeline_compat_update_uniform(s, fields[NGLI_INFO_FIELD_COLOR_MATRIX].index, image->color_matrix);
Expand Down
2 changes: 1 addition & 1 deletion libnopegl/src/pipeline_compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ int ngli_pipeline_compat_update_vertex_buffer(struct pipeline_compat *s, int32_t
int ngli_pipeline_compat_update_uniform(struct pipeline_compat *s, int32_t index, const void *value);
int ngli_pipeline_compat_update_uniform_count(struct pipeline_compat *s, int32_t index, const void *value, size_t count);
int ngli_pipeline_compat_update_texture(struct pipeline_compat *s, int32_t index, const struct texture *texture);
void ngli_pipeline_compat_update_texture_info(struct pipeline_compat *s, const struct pgcraft_texture_info *info);
void ngli_pipeline_compat_update_image(struct pipeline_compat *s, int32_t index, const struct image *image);
int ngli_pipeline_compat_update_buffer(struct pipeline_compat *s, int32_t index, const struct buffer *buffer, size_t offset, size_t size);
int ngli_pipeline_compat_update_dynamic_offsets(struct pipeline_compat *s, const uint32_t *offsets, size_t nb_offsets);
void ngli_pipeline_compat_draw(struct pipeline_compat *s, int nb_vertices, int nb_instances);
Expand Down

0 comments on commit e33e6b7

Please sign in to comment.