[Mesa-dev] [PATCH 1/4] radeon/vce: allocate at least 4KB of memory for the feedback buffer
Christian König
deathsimple at vodafone.de
Thu Sep 29 16:52:29 UTC 2016
NAK to the whole approach.
VCE feedback buffers are completely separated to UVD or other MM
feedback buffers, so they shouldn't be allocated in radeon_video.c
Additional to that older UVD message, feedback and bitstream buffers
have special memory placement requirements. So you clearly shouldn't
allocate those from the sub allocator.
Sorry that I didn't objected earlier, but I wasn't aware of this change
till now.
Regards,
Christian.
Am 29.09.2016 um 18:35 schrieb Nicolai Hähnle:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> The kernel's CS checker requires it. This fixes a regression introduced by
> the buffer sub-allocation.
>
> Cc: Christian König <christian.koenig at amd.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97976
> ---
> src/gallium/drivers/radeon/radeon_vce.c | 6 +++---
> src/gallium/drivers/radeon/radeon_video.c | 12 ++++++++++++
> src/gallium/drivers/radeon/radeon_video.h | 3 +++
> 3 files changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/drivers/radeon/radeon_vce.c b/src/gallium/drivers/radeon/radeon_vce.c
> index 10c5a78..dd4c367 100644
> --- a/src/gallium/drivers/radeon/radeon_vce.c
> +++ b/src/gallium/drivers/radeon/radeon_vce.c
> @@ -232,21 +232,21 @@ void rvce_frame_offset(struct rvce_encoder *enc, struct rvce_cpb_slot *slot,
> }
>
> /**
> * destroy this video encoder
> */
> static void rvce_destroy(struct pipe_video_codec *encoder)
> {
> struct rvce_encoder *enc = (struct rvce_encoder*)encoder;
> if (enc->stream_handle) {
> struct rvid_buffer fb;
> - rvid_create_buffer(enc->screen, &fb, 512, PIPE_USAGE_STAGING);
> + rvid_create_feedback_buffer(enc->screen, &fb);
> enc->fb = &fb;
> enc->session(enc);
> enc->feedback(enc);
> enc->destroy(enc);
> flush(enc);
> rvid_destroy_buffer(&fb);
> }
> rvid_destroy_buffer(&enc->cpb);
> enc->ws->cs_destroy(enc->cs);
> FREE(enc->cpb_array);
> @@ -275,21 +275,21 @@ static void rvce_begin_frame(struct pipe_video_codec *encoder,
>
> if (pic->picture_type == PIPE_H264_ENC_PICTURE_TYPE_IDR)
> reset_cpb(enc);
> else if (pic->picture_type == PIPE_H264_ENC_PICTURE_TYPE_P ||
> pic->picture_type == PIPE_H264_ENC_PICTURE_TYPE_B)
> sort_cpb(enc);
>
> if (!enc->stream_handle) {
> struct rvid_buffer fb;
> enc->stream_handle = rvid_alloc_stream_handle();
> - rvid_create_buffer(enc->screen, &fb, 512, PIPE_USAGE_STAGING);
> + rvid_create_feedback_buffer(enc->screen, &fb);
> enc->fb = &fb;
> enc->session(enc);
> enc->create(enc);
> enc->config(enc);
> enc->feedback(enc);
> flush(enc);
> //dump_feedback(enc, &fb);
> rvid_destroy_buffer(&fb);
> need_rate_control = false;
> }
> @@ -304,21 +304,21 @@ static void rvce_begin_frame(struct pipe_video_codec *encoder,
> static void rvce_encode_bitstream(struct pipe_video_codec *encoder,
> struct pipe_video_buffer *source,
> struct pipe_resource *destination,
> void **fb)
> {
> struct rvce_encoder *enc = (struct rvce_encoder*)encoder;
> enc->get_buffer(destination, &enc->bs_handle, NULL);
> enc->bs_size = destination->width0;
>
> *fb = enc->fb = CALLOC_STRUCT(rvid_buffer);
> - if (!rvid_create_buffer(enc->screen, enc->fb, 512, PIPE_USAGE_STAGING)) {
> + if (!rvid_create_feedback_buffer(enc->screen, enc->fb)) {
> RVID_ERR("Can't create feedback buffer.\n");
> return;
> }
> if (!radeon_emitted(enc->cs, 0))
> enc->session(enc);
> enc->encode(enc);
> enc->feedback(enc);
> }
>
> static void rvce_end_frame(struct pipe_video_codec *encoder,
> diff --git a/src/gallium/drivers/radeon/radeon_video.c b/src/gallium/drivers/radeon/radeon_video.c
> index d7c5a16..f60ae05 100644
> --- a/src/gallium/drivers/radeon/radeon_video.c
> +++ b/src/gallium/drivers/radeon/radeon_video.c
> @@ -65,20 +65,32 @@ bool rvid_create_buffer(struct pipe_screen *screen, struct rvid_buffer *buffer,
> unsigned size, unsigned usage)
> {
> memset(buffer, 0, sizeof(*buffer));
> buffer->usage = usage;
> buffer->res = (struct r600_resource *)
> pipe_buffer_create(screen, PIPE_BIND_CUSTOM, usage, size);
>
> return buffer->res != NULL;
> }
>
> +bool rvid_create_feedback_buffer(struct pipe_screen *screen,
> + struct rvid_buffer *buffer)
> +{
> + /* The kernel's CS checker asks for at least 4KB space.
> + *
> + * TODO If we update the kernel checker to be satisfied with less,
> + * we could save some memory here (since the sub-allocator could be
> + * used).
> + */
> + return rvid_create_buffer(screen, buffer, 4096, PIPE_USAGE_STAGING);
> +}
> +
> /* destroy a buffer */
> void rvid_destroy_buffer(struct rvid_buffer *buffer)
> {
> r600_resource_reference(&buffer->res, NULL);
> }
>
> /* reallocate a buffer, preserving its content */
> bool rvid_resize_buffer(struct pipe_screen *screen, struct radeon_winsys_cs *cs,
> struct rvid_buffer *new_buf, unsigned new_size)
> {
> diff --git a/src/gallium/drivers/radeon/radeon_video.h b/src/gallium/drivers/radeon/radeon_video.h
> index 39305b4..76c5f30 100644
> --- a/src/gallium/drivers/radeon/radeon_video.h
> +++ b/src/gallium/drivers/radeon/radeon_video.h
> @@ -47,20 +47,23 @@ struct rvid_buffer
> struct r600_resource *res;
> };
>
> /* generate an stream handle */
> unsigned rvid_alloc_stream_handle(void);
>
> /* create a buffer in the winsys */
> bool rvid_create_buffer(struct pipe_screen *screen, struct rvid_buffer *buffer,
> unsigned size, unsigned usage);
>
> +bool rvid_create_feedback_buffer(struct pipe_screen *screen,
> + struct rvid_buffer *buffer);
> +
> /* destroy a buffer */
> void rvid_destroy_buffer(struct rvid_buffer *buffer);
>
> /* reallocate a buffer, preserving its content */
> bool rvid_resize_buffer(struct pipe_screen *screen, struct radeon_winsys_cs *cs,
> struct rvid_buffer *new_buf, unsigned new_size);
>
> /* clear the buffer with zeros */
> void rvid_clear_buffer(struct pipe_context *context, struct rvid_buffer* buffer);
>
More information about the mesa-dev
mailing list