[virglrenderer-devel] [PATCH 5/6] add framebuffer_no_attachment support

Erik Faye-Lund erik.faye-lund at collabora.com
Tue Jul 31 05:55:54 UTC 2018


On 30. juli 2018 20:54, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> This requires adding new protocol to pass the width/height/layers/sample
> default values from the host.
> ---
>   src/virgl_hw.h       |  1 +
>   src/virgl_protocol.h | 11 +++++++++++
>   src/vrend_decode.c   | 24 ++++++++++++++++++++++++
>   src/vrend_renderer.c | 21 +++++++++++++++++++++
>   src/vrend_renderer.h |  3 +++
>   5 files changed, 60 insertions(+)
>
> diff --git a/src/virgl_hw.h b/src/virgl_hw.h
> index 694a20c..6cd1c19 100644
> --- a/src/virgl_hw.h
> +++ b/src/virgl_hw.h
> @@ -225,6 +225,7 @@ enum virgl_formats {
>   #define VIRGL_CAP_TXQS                 (1 << 5)
>   #define VIRGL_CAP_MEMORY_BARRIER       (1 << 6)
>   #define VIRGL_CAP_COMPUTE_SHADER       (1 << 7)
> +#define VIRGL_CAP_FB_NO_ATTACH         (1 << 8)
>   
>   /* virgl bind flags - these are compatible with mesa 10.5 gallium.
>    * but are fixed, no other should be passed to virgl either.
> diff --git a/src/virgl_protocol.h b/src/virgl_protocol.h
> index 43c010e..91f1299 100644
> --- a/src/virgl_protocol.h
> +++ b/src/virgl_protocol.h
> @@ -89,6 +89,7 @@ enum virgl_context_cmd {
>      VIRGL_CCMD_SET_SHADER_IMAGES,
>      VIRGL_CCMD_MEMORY_BARRIER,
>      VIRGL_CCMD_LAUNCH_GRID,
> +   VIRGL_CCMD_SET_FRAMEBUFFER_STATE_NO_ATTACH,
>   };
>   
>   /*
> @@ -528,4 +529,14 @@ enum virgl_context_cmd {
>   #define VIRGL_LAUNCH_GRID_Z 6
>   #define VIRGL_LAUNCH_INDIRECT_HANDLE 7
>   #define VIRGL_LAUNCH_INDIRECT_OFFSET 8
> +
> +/* framebuffer state no attachment */
> +#define VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_SIZE 2
> +#define VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_WIDTH_HEIGHT 1
> +#define VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_WIDTH(x) (x & 0xffff)
> +#define VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_HEIGHT(x) ((x >> 16) & 0xffff)
> +#define VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_LAYERS_SAMPLES 2
> +#define VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_LAYERS(x) (x & 0xffff)
> +#define VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_SAMPLES(x) ((x >> 16) & 0xff)
> +
>   #endif
> diff --git a/src/vrend_decode.c b/src/vrend_decode.c
> index e3deb65..4e4dd7c 100644
> --- a/src/vrend_decode.c
> +++ b/src/vrend_decode.c
> @@ -157,6 +157,27 @@ static int vrend_decode_set_framebuffer_state(struct vrend_decode_ctx *ctx, int
>      return 0;
>   }
>   
> +static int vrend_decode_set_framebuffer_state_no_attach(struct vrend_decode_ctx *ctx, int length)
> +{
> +   uint32_t width, height;
> +   uint32_t layers, samples;
> +   uint32_t tmp;
> +
> +   if (length != VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_SIZE)
> +      return EINVAL;
> +
> +   tmp = get_buf_entry(ctx, VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_WIDTH_HEIGHT);
> +   width = VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_WIDTH(tmp);
> +   height = VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_HEIGHT(tmp);
> +
> +   tmp = get_buf_entry(ctx, VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_LAYERS_SAMPLES);
> +   layers = VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_LAYERS(tmp);
> +   samples = VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_SAMPLES(tmp);
> +
> +   vrend_set_framebuffer_state_no_attach(ctx->grctx, width, height, layers, samples);
> +   return 0;
> +}
> +
>   static int vrend_decode_clear(struct vrend_decode_ctx *ctx, int length)
>   {
>      union pipe_color_union color;
> @@ -1412,6 +1433,9 @@ int vrend_decode_block(uint32_t ctx_id, uint32_t *block, int ndw)
>         case VIRGL_CCMD_LAUNCH_GRID:
>            ret = vrend_decode_launch_grid(gdctx, len);
>            break;
> +      case VIRGL_CCMD_SET_FRAMEBUFFER_STATE_NO_ATTACH:
> +         ret = vrend_decode_set_framebuffer_state_no_attach(gdctx, len);
> +         break;
>         default:
>            ret = EINVAL;
>         }
> diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
> index 1eb1cc0..bcedbf4 100644
> --- a/src/vrend_renderer.c
> +++ b/src/vrend_renderer.c
> @@ -101,6 +101,7 @@ enum features_id
>      feat_debug_cb,
>      feat_draw_instance,
>      feat_dual_src_blend,
> +   feat_fb_no_attach,
>      feat_geometry_shader,
>      feat_gl_conditional_render,
>      feat_gl_prim_restart,
> @@ -158,6 +159,7 @@ static const  struct {
>      [feat_debug_cb] = { UNAVAIL, UNAVAIL, {} }, /* special case */
>      [feat_draw_instance] = { 31, 30, { "GL_ARB_draw_instanced" } },
>      [feat_dual_src_blend] = { 33, UNAVAIL, { "GL_ARB_blend_func_extended" } },
> +   [feat_fb_no_attach] = { 43, 31, { "GL_ARB_framebuffer_no_attachments" } },
>      [feat_geometry_shader] = { 32, UNAVAIL, {} },
>      [feat_gl_conditional_render] = { 30, UNAVAIL, {} },
>      [feat_gl_prim_restart] = { 31, UNAVAIL, {} },
> @@ -2091,6 +2093,22 @@ void vrend_set_framebuffer_state(struct vrend_context *ctx,
>      ctx->sub->shader_dirty = true;
>   }
>   
> +void vrend_set_framebuffer_state_no_attach(struct vrend_context *ctx,
> +                                           uint32_t width, uint32_t height,
> +                                           uint32_t layers, uint32_t samples)
> +{
> +   if (has_feature(feat_fb_no_attach)) {
> +      glFramebufferParameteri(GL_FRAMEBUFFER,
> +                              GL_FRAMEBUFFER_DEFAULT_WIDTH, width);
> +      glFramebufferParameteri(GL_FRAMEBUFFER,
> +                              GL_FRAMEBUFFER_DEFAULT_HEIGHT, height);
> +      glFramebufferParameteri(GL_FRAMEBUFFER,
> +                              GL_FRAMEBUFFER_DEFAULT_LAYERS, layers);
> +      glFramebufferParameteri(GL_FRAMEBUFFER,
> +                              GL_FRAMEBUFFER_DEFAULT_SAMPLES, samples);
> +   }
> +}
> +
>   /*
>    * if the viewport Y scale factor is > 0 then we are rendering to
>    * an FBO already so don't need to invert rendering?
> @@ -8176,6 +8194,9 @@ void vrend_renderer_fill_caps(uint32_t set, UNUSED uint32_t version,
>         caps->v2.capability_bits |= VIRGL_CAP_COMPUTE_SHADER;
>      }
>   
> +   if (has_feature(feat_fb_no_attach))
> +      caps->v2.capability_bits |= VIRGL_CAP_FB_NO_ATTACH;
> +
>      if (has_feature(feat_texture_view))
>         caps->v2.capability_bits |= VIRGL_CAP_TEXTURE_VIEW;
>   
> diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h
> index 79f4897..93185c1 100644
> --- a/src/vrend_renderer.h
> +++ b/src/vrend_renderer.h
> @@ -248,6 +248,9 @@ void vrend_launch_grid(struct vrend_context *ctx,
>                          uint32_t *grid,
>                          uint32_t indirect_handle,
>                          uint32_t indirect_offset);
> +void vrend_set_framebuffer_state_no_attach(struct vrend_context *ctx,
> +                                           uint32_t width, uint32_t height,
> +                                           uint32_t layers, uint32_t samples);
>   #define VREND_TRANSFER_WRITE 1
>   #define VREND_TRANSFER_READ 2
>   int vrend_renderer_transfer_iov(const struct vrend_transfer_info *info, int transfer_mode);

Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>


More information about the virglrenderer-devel mailing list