[Mesa-dev] [PATCH 3/6] gallium\auxiliary\vl: Add compute shader to support video compositor render

James Zhu jamesz at amd.com
Mon Feb 4 19:20:36 UTC 2019


On 2019-02-04 2:15 p.m., Christian König wrote:
> Am 04.02.19 um 20:12 schrieb James Zhu:
>> On 2019-02-04 1:47 p.m., Liu, Leo wrote:
>>> On 2/1/19 11:28 AM, Zhu, James wrote:
>>>> Add compute shader to support video compositor render.
>>>>
>>>> Signed-off-by: James Zhu <James.Zhu at amd.com>
>>>> ---
>>>>     src/gallium/auxiliary/Makefile.sources      |   2 +
>>>>     src/gallium/auxiliary/meson.build           |   2 +
>>>>     src/gallium/auxiliary/vl/vl_compositor_cs.c | 414 
>>>> ++++++++++++++++++++++++++++
>>>>     src/gallium/auxiliary/vl/vl_compositor_cs.h |  56 ++++
>>>>     4 files changed, 474 insertions(+)
>>>>     create mode 100644 src/gallium/auxiliary/vl/vl_compositor_cs.c
>>>>     create mode 100644 src/gallium/auxiliary/vl/vl_compositor_cs.h
>>>>
>>>> diff --git a/src/gallium/auxiliary/Makefile.sources 
>>>> b/src/gallium/auxiliary/Makefile.sources
>>>> index 50e8808..df000f6 100644
>>>> --- a/src/gallium/auxiliary/Makefile.sources
>>>> +++ b/src/gallium/auxiliary/Makefile.sources
>>>> @@ -348,6 +348,8 @@ VL_SOURCES := \
>>>>         vl/vl_bicubic_filter.h \
>>>>         vl/vl_compositor.c \
>>>>         vl/vl_compositor.h \
>>>> +    vl/vl_compositor_cs.c \
>>>> +    vl/vl_compositor_cs.h \
>>>>         vl/vl_csc.c \
>>>>         vl/vl_csc.h \
>>>>         vl/vl_decoder.c \
>>>> diff --git a/src/gallium/auxiliary/meson.build 
>>>> b/src/gallium/auxiliary/meson.build
>>>> index 57f7e69..74e4b48 100644
>>>> --- a/src/gallium/auxiliary/meson.build
>>>> +++ b/src/gallium/auxiliary/meson.build
>>>> @@ -445,6 +445,8 @@ files_libgalliumvl = files(
>>>>       'vl/vl_bicubic_filter.h',
>>>>       'vl/vl_compositor.c',
>>>>       'vl/vl_compositor.h',
>>>> +  'vl/vl_compositor_cs.c',
>>>> +  'vl/vl_compositor_cs.h',
>>>>       'vl/vl_csc.c', (refer to MI100 frame capture feature with 
>>>> computer shader support)
>>>>       'vl/vl_csc.h',
>>>>       'vl/vl_decoder.c',
>>>> diff --git a/src/gallium/auxiliary/vl/vl_compositor_cs.c 
>>>> b/src/gallium/auxiliary/vl/vl_compositor_cs.c
>>>> new file mode 100644
>>>> index 0000000..3cd1a76
>>>> --- /dev/null
>>>> +++ b/src/gallium/auxiliary/vl/vl_compositor_cs.c
>>>> @@ -0,0 +1,414 @@
>>>> +/************************************************************************** 
>>>>
>>>> + *
>>>> + * Copyright 2019 Advanced Micro Devices, Inc.
>>>> + * All Rights Reserved.
>>>> + *
>>>> + * Permission is hereby granted, free of charge, to any person 
>>>> obtaining a
>>>> + * copy of this software and associated documentation files (the
>>>> + * "Software"), to deal in the Software without restriction, 
>>>> including
>>>> + * without limitation the rights to use, copy, modify, merge, 
>>>> publish,
>>>> + * distribute, sub license, and/or sell copies of the Software, 
>>>> and to
>>>> + * permit persons to whom the Software is furnished to do so, 
>>>> subject to
>>>> + * the following conditions:
>>>> + *
>>>> + * The above copyright notice and this permission notice 
>>>> (including the
>>>> + * next paragraph) shall be included in all copies or substantial 
>>>> portions
>>>> + * of the Software.
>>>> + *
>>>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
>>>> EXPRESS
>>>> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>>>> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
>>>> NON-INFRINGEMENT.
>>>> + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
>>>> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
>>>> CONTRACT,
>>>> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
>>>> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>>>> + *
>>>> + * Authors: James Zhu <james.zhu<@amd.com>
>>>> + *
>>>> + 
>>>> **************************************************************************/
>>>> +
>>>> +#include <assert.h>
>>>> +
>>>> +#include "tgsi/tgsi_text.h"
>>>> +#include "vl_compositor_cs.h"
>>>> +
>>>> +struct cs_viewport {
>>>> +   float scale_x;
>>>> +   float scale_y;
>>>> +   int translate_x;
>>>> +   int translate_y;
>>>> +   struct u_rect area;
>>>> +};
>>>> +
>>>> +char *compute_shader_video_buffer =
>>>> +      "COMP\n"
>>>> +      "PROPERTY CS_FIXED_BLOCK_WIDTH 8\n"
>>>> +      "PROPERTY CS_FIXED_BLOCK_HEIGHT 8\n"
>>>> +      "PROPERTY CS_FIXED_BLOCK_DEPTH 1\n"
>>>> +
>>>> +      "DCL SV[0], THREAD_ID\n"
>>>> +      "DCL SV[1], BLOCK_ID\n"
>>>> +
>>>> +      "DCL CONST[0..5]\n"
>>>> +      "DCL SVIEW[0..2], RECT, FLOAT\n"
>>>> +      "DCL SAMP[0..2]\n"
>>>> +
>>>> +      "DCL IMAGE[0], 2D, WR\n"
>>>> +      "DCL TEMP[0..7]\n"
>>>> +
>>>> +      "IMM[0] UINT32 { 8, 8, 1, 0}\n"
>>>> +      "IMM[1] FLT32 { 1.0, 2.0, 0.0, 0.0}\n"
>>>> +
>>>> +      "UMAD TEMP[0], SV[1], IMM[0], SV[0]\n"
>>>> +
>>>> +      /* Drawn area check */
>>>> +      "USGE TEMP[1].xy, TEMP[0].xyxy, CONST[4].xyxy\n"
>>>> +      "USLT TEMP[1].zw, TEMP[0].xyxy, CONST[4].zwzw\n"
>>>> +      "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].yyyy\n"
>>>> +      "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].zzzz\n"
>>>> +      "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].wwww\n"
>>>> +
>>>> +      "UIF TEMP[1]\n"
>>>> +         /* Translate */
>>>> +         "UADD TEMP[2].xy, TEMP[0], -CONST[5].xyxy\n"
>>>> +         "U2F TEMP[2], TEMP[2]\n"
>>>> +         "DIV TEMP[3], TEMP[2], IMM[1].yyyy\n"
>>>> +
>>>> +         /* Scale */
>>>> +         "DIV TEMP[2], TEMP[2], CONST[3].zwzw\n"
>>>> +         "DIV TEMP[3], TEMP[3], CONST[3].zwzw\n"
>>>> +
>>>> +         /* Fetch texels */
>>>> +         "TEX_LZ TEMP[4].x, TEMP[2], SAMP[0], RECT\n"
>>>> +         "TEX_LZ TEMP[4].y, TEMP[3], SAMP[1], RECT\n"
>>>> +         "TEX_LZ TEMP[4].z, TEMP[3], SAMP[2], RECT\n"
>>>> +
>>>> +         "MOV TEMP[4].w, IMM[1].xxxx\n"
>>>> +
>>>> +         /* Color Space Conversion */
>>>> +         "DP4 TEMP[7].x, CONST[0], TEMP[4]\n"
>>>> +         "DP4 TEMP[7].y, CONST[1], TEMP[4]\n"
>>>> +         "DP4 TEMP[7].z, CONST[2], TEMP[4]\n"
>>>> +
>>>> +         "MOV TEMP[5].w, TEMP[4].zzzz\n"
>>>> +         "SLE TEMP[6].w, TEMP[5], CONST[3].xxxx\n"
>>>> +         "SGT TEMP[5].w, TEMP[5], CONST[3].yyyy\n"
>>>> +
>>>> +         "MAX TEMP[7].w, TEMP[5], TEMP[6]\n"
>>>> +
>>>> +         "STORE IMAGE[0], TEMP[0], TEMP[7], 2D\n"
>>>> +      "ENDIF\n"
>>>> +
>>>> +      "END\n";
>>>> +
>>>> +char *compute_shader_weave =
>>>> +      "COMP\n"
>>>> +      "PROPERTY CS_FIXED_BLOCK_WIDTH 8\n"
>>>> +      "PROPERTY CS_FIXED_BLOCK_HEIGHT 8\n"
>>>> +      "PROPERTY CS_FIXED_BLOCK_DEPTH 1\n"
>>>> +
>>>> +      "DCL SV[0], THREAD_ID\n"
>>>> +      "DCL SV[1], BLOCK_ID\n"
>>>> +
>>>> +      "DCL CONST[0..5]\n"
>>>> +      "DCL SVIEW[0..2], RECT, FLOAT\n"
>>>> +      "DCL SAMP[0..2]\n"
>>>> +
>>>> +      "DCL IMAGE[0], 2D, WR\n"
>>>> +      "DCL TEMP[0..9]\n"
>>>> +
>>>> +      "IMM[0] UINT32 { 8, 8, 1, 0}\n"
>>>> +      "IMM[1] FLT32 { 1.0, 2.0, 0.0, 0.0}\n"
>>>> +      "IMM[2] UINT32 { 1, 2, 4, 0}\n"
>>>> +
>>>> +      "UMAD TEMP[0], SV[1], IMM[0], SV[0]\n"
>>>> +
>>>> +      /* Drawn area check */
>>>> +      "USGE TEMP[1].xy, TEMP[0].xyxy, CONST[4].xyxy\n"
>>>> +      "USLT TEMP[1].zw, TEMP[0].xyxy, CONST[4].zwzw\n"
>>>> +      "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].yyyy\n"
>>>> +      "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].zzzz\n"
>>>> +      "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].wwww\n"
>>>> +
>>>> +      "UIF TEMP[1]\n"
>>>> +         "MOV TEMP[2], TEMP[0]\n"
>>>> +         /* Translate */
>>>> +         "UADD TEMP[2].xy, TEMP[2], -CONST[5].xyxy\n"
>>>> +
>>>> +         /* Texture layer */
>>>> +         "UMOD TEMP[2].z, TEMP[2].yyyy, IMM[2].yyyy\n"
>>>> +         "UMOD TEMP[3].z, TEMP[2].yyyy, IMM[2].zzzz\n"
>>>> +         "USHR TEMP[3].z, TEMP[3].zzzz, IMM[2].xxxx\n"
>>>> +
>>>> +         "USHR TEMP[2].y, TEMP[2], IMM[2].xxxx\n"
>>>> +         "USHR TEMP[3].xy, TEMP[2], IMM[2].xxxx\n"
>>>> +
>>>> +         "U2F TEMP[4], TEMP[2]\n"
>>>> +         "U2F TEMP[5], TEMP[3]\n"
>>>> +
>>>> +         /* Scale */
>>>> +         "DIV TEMP[4], TEMP[4], CONST[3].zwzw\n"
>>>> +         "DIV TEMP[5], TEMP[5], CONST[3].zwzw\n"
>>>> +
>>>> +         /* Fetch texels */
>>>> +         "TEX_LZ TEMP[6].x, TEMP[4], SAMP[0], RECT\n"
>>>> +         "TEX_LZ TEMP[6].y, TEMP[5], SAMP[1], RECT\n"
>>>> +         "TEX_LZ TEMP[6].z, TEMP[5], SAMP[2], RECT\n"
>>>> +
>>>> +         "MOV TEMP[6].w, IMM[1].xxxx\n"
>>>> +
>>>> +         /* Color Space Conversion */
>>>> +         "DP4 TEMP[9].x, CONST[0], TEMP[6]\n"
>>>> +         "DP4 TEMP[9].y, CONST[1], TEMP[6]\n"
>>>> +         "DP4 TEMP[9].z, CONST[2], TEMP[6]\n"
>>>> +
>>>> +         "MOV TEMP[7].w, TEMP[6].zzzz\n"
>>>> +         "SLE TEMP[8].w, TEMP[7], CONST[3].xxxx\n"
>>>> +         "SGT TEMP[7].w, TEMP[7], CONST[3].yyyy\n"
>>>> +
>>>> +         "MAX TEMP[9].w, TEMP[7], TEMP[8]\n"
>>>> +
>>>> +         "STORE IMAGE[0], TEMP[0], TEMP[9], 2D\n"
>>>> +      "ENDIF\n"
>>>> +
>>>> +      "END\n";
>>>> +
>>>> +char *compute_shader_sub_pic =
>>>> +      "COMP\n"
>>>> +      "PROPERTY CS_FIXED_BLOCK_WIDTH 8\n"
>>>> +      "PROPERTY CS_FIXED_BLOCK_HEIGHT 8\n"
>>>> +      "PROPERTY CS_FIXED_BLOCK_DEPTH 1\n"
>>>> +
>>>> +      "DCL SV[0], THREAD_ID\n"
>>>> +      "DCL SV[1], BLOCK_ID\n"
>>>> +
>>>> +      "DCL CONST[0..5]\n"
>>>> +      "DCL SVIEW[0..2], RECT, FLOAT\n"
>>>> +      "DCL SAMP[0..2]\n"
>>>> +
>>>> +      "DCL IMAGE[0], 2D, WR\n"
>>>> +      "DCL TEMP[0..3]\n"
>>>> +
>>>> +      "IMM[0] UINT32 { 8, 8, 1, 0}\n"
>>>> +      "IMM[1] FLT32 { 1.0, 2.0, 0.0, 0.0}\n"
>>>> +
>>>> +      "UMAD TEMP[0], SV[1], IMM[0], SV[0]\n"
>>>> +
>>>> +      /* Drawn area check */
>>>> +      "USGE TEMP[1].xy, TEMP[0].xyxy, CONST[4].xyxy\n"
>>>> +      "USLT TEMP[1].zw, TEMP[0].xyxy, CONST[4].zwzw\n"
>>>> +      "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].yyyy\n"
>>>> +      "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].zzzz\n"
>>>> +      "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].wwww\n"
>>>> +
>>>> +      "UIF TEMP[1]\n"
>>>> +         /* Translate */
>>>> +         "UADD TEMP[2].xy, TEMP[0], -CONST[5].xyxy\n"
>>>> +         "U2F TEMP[2], TEMP[2]\n"
>>>> +
>>>> +         /* Scale */
>>>> +         "DIV TEMP[2], TEMP[2], CONST[3].zwzw\n"
>>>> +
>>>> +         /* Fetch texels */
>>>> +         "TEX_LZ TEMP[3].x, TEMP[2], SAMP[0], RECT\n"
>>>> +
>>>> +         "STORE IMAGE[0], TEMP[0], TEMP[3].xxxx, 2D\n"
>>>> +      "ENDIF\n"
>>>> +
>>>> +      "END\n";
>>>> +
>>>> +static void
>>>> +cs_launch(struct vl_compositor       *c,
>>>> +          struct vl_compositor_state *s,
>>>> +          void                       *cs)
>>>> +{
>>>> +   struct pipe_context *ctx = c->pipe;
>>>> +
>>>> +   /* Bind the image */
>>>> +   struct pipe_image_view image = {};
>>>> +   image.resource = c->fb_state.cbufs[0]->texture;
>>>> +   image.shader_access = image.access = PIPE_IMAGE_ACCESS_READ_WRITE;
>>>> +   image.format = c->fb_state.cbufs[0]->texture->format;
>>>> +
>>>> +   ctx->set_shader_images(c->pipe, PIPE_SHADER_COMPUTE, 0, 1, 
>>>> &image);
>>>> +
>>>> +   /* Bind compute shader */
>>>> +   ctx->bind_compute_state(ctx, cs);
>>>> +
>>>> +   /* Dispatch compute */
>>>> +   struct pipe_grid_info info = {};
>>>> +   info.block[0] = 8;
>>>> +   info.block[1] = 8;
>>>> +   info.block[2] = 1;
>>>> +   info.grid[0] = DIV_ROUND_UP(c->fb_state.width, info.block[0]);
>>>> +   info.grid[1] = DIV_ROUND_UP(c->fb_state.height, info.block[1]);
>>>> +   info.grid[2] = 1;
>>>> +
>>>> +   ctx->launch_grid(ctx, &info);
>>>> +}
>>>> +
>>>> +static inline struct u_rect
>>>> +cs_calc_drawn_area(struct vl_compositor_state *s,
>>>> +                   struct vl_compositor_layer *layer)
>>>> +{
>>>> +   struct vertex2f tl, br;
>>>> +   struct u_rect result;
>>>> +
>>>> +   assert(s && layer);
>>>> +
>>>> +   tl = layer->dst.tl;
>>>> +   br = layer->dst.br;
>>>> +
>>>> +   /* Scale */
>>>> +   result.x0 = tl.x * layer->viewport.scale[0] + 
>>>> layer->viewport.translate[0];
>>>> +   result.y0 = tl.y * layer->viewport.scale[1] + 
>>>> layer->viewport.translate[1];
>>>> +   result.x1 = br.x * layer->viewport.scale[0] + 
>>>> layer->viewport.translate[0];
>>>> +   result.y1 = br.y * layer->viewport.scale[1] + 
>>>> layer->viewport.translate[1];
>>>> +
>>>> +   /* Clip */
>>>> +   result.x0 = MAX2(result.x0, s->scissor.minx);
>>>> +   result.y0 = MAX2(result.y0, s->scissor.miny);
>>>> +   result.x1 = MIN2(result.x1, s->scissor.maxx);
>>>> +   result.y1 = MIN2(result.y1, s->scissor.maxy);
>>>> +   return result;
>>>> +}
>>>> +
>>>> +static bool
>>>> +cs_set_viewport(struct vl_compositor_state *s,
>>>> +                struct cs_viewport         *drawn)
>>>> +{
>>>> +   struct pipe_transfer *buf_transfer;
>>>> +
>>>> +   assert(s && drawn);
>>>> +
>>>> +   void *ptr = pipe_buffer_map(s->pipe, s->csc_matrix,
>>>> +                               PIPE_TRANSFER_READ | 
>>>> PIPE_TRANSFER_WRITE,
>>>> +                               &buf_transfer);
>>>> +
>>>> +   if (!ptr)
>>>> +     return false;
>>>> +
>>>> +   float *ptr_float = (float *)ptr;
>>>> +   ptr_float += sizeof(vl_csc_matrix)/sizeof(float) + 2;
>>>> +   *ptr_float++ = drawn->scale_x;
>>>> +   *ptr_float++ = drawn->scale_y;
>>>> +
>>>> +   int *ptr_int = (int *)ptr_float;
>>>> +   *ptr_int++ = drawn->area.x0;
>>>> +   *ptr_int++ = drawn->area.y0;
>>>> +   *ptr_int++ = drawn->area.x1;
>>>> +   *ptr_int++ = drawn->area.y1;
>>>> +   *ptr_int++ = drawn->translate_x;
>>>> +   *ptr_int = drawn->translate_y;
>>>> +
>>>> +   pipe_buffer_unmap(s->pipe, buf_transfer);
>>>> +
>>>> +   return true;
>>>> +}
>>>> +
>>>> +static void
>>>> +cs_draw_layers(struct vl_compositor       *c,
>>>> +               struct vl_compositor_state *s,
>>>> +               struct u_rect              *dirty)
>>>> +{
>>>> +   unsigned i;
>>>> +   static struct cs_viewport old_drawn;
>>>> +
>>>> +   assert(c);
>>>> +
>>>> +   for (i = 0; i < VL_COMPOSITOR_MAX_LAYERS; ++i) {
>>>> +      if (s->used_layers & (1 << i)) {
>>>> +         struct vl_compositor_layer *layer = &s->layers[i];
>>>> +         struct pipe_sampler_view **samplers = 
>>>> &layer->sampler_views[0];
>>>> +         unsigned num_sampler_views = !samplers[1] ? 1 : 
>>>> !samplers[2] ? 2 : 3;
>>>> +         struct cs_viewport drawn;
>>>> +
>>>> +         drawn.area = cs_calc_drawn_area(s, layer);
>>>> +         drawn.scale_x = layer->viewport.scale[0] /
>>>> + (float)layer->sampler_views[0]->texture->width0;
>>>> +         drawn.scale_y = drawn.scale_x;
>>>> +         drawn.translate_x = (int)layer->viewport.translate[0];
>>>> +         drawn.translate_y = (int)layer->viewport.translate[1];
>>>> +
>>>> +         if (memcmp(&drawn, &old_drawn, sizeof(struct 
>>>> cs_viewport))) {
>>>> +            cs_set_viewport(s, &drawn);
>>>> +            old_drawn = drawn;
>>>> +            pipe_set_constant_buffer(c->pipe, PIPE_SHADER_COMPUTE, 0,
>>>> +                        s->csc_matrix);
>>>> +         }
>>>> +
>>>> +         c->pipe->bind_sampler_states(c->pipe, 
>>>> PIPE_SHADER_COMPUTE, 0,
>>>> +                        num_sampler_views, layer->samplers);
>>>> +         c->pipe->set_sampler_views(c->pipe, PIPE_SHADER_COMPUTE, 0,
>>>> +                        num_sampler_views, samplers);
>>>> +
>>>> +         if (num_sampler_views == 3)
>>>> +            cs_launch(c, s, layer->cs);
>>>> +         else if (num_sampler_views == 1)
>>>> +            cs_launch(c, s, c->cs_sub_pic);
>>> What is the counterpart of cs_sub_pic from gfx implementation? will 
>>> this
>>> get built since I saw this is added to header file from next patch. It
>>> has to get built with each patch incrementally from the patch sets.
>> gfx shader - create_frag_shader_rgba will render this sub-pictures.
>
> Better keep the naming as is. This is not only used for sub-picture 
> rendering, but also for a whole bunch of other operations.

Be honestest.  I figured i t out the rgba shader help blend rendering 
after I submit the patch.

can you clarify what are the other operations?  Thanks!

James

>
> Christian.
>
>>
>> I am rewriting this part.
>>
>> James
>>
>>>
>>> Leo
>>>
>>>
>>>> +         else
>>>> +            assert(!"Not support yet!");
>>>> +
>>>> +         if (dirty) {
>>>> +            struct u_rect drawn = cs_calc_drawn_area(s, layer);
>>>> +            dirty->x0 = MIN2(drawn.x0, dirty->x0);
>>>> +            dirty->y0 = MIN2(drawn.y0, dirty->y0);
>>>> +            dirty->x1 = MAX2(drawn.x1, dirty->x1);
>>>> +            dirty->y1 = MAX2(drawn.y1, dirty->y1);
>>>> +         }
>>>> +      }
>>>> +   }
>>>> +}
>>>> +
>>>> +void *
>>>> +vl_compositor_cs_create_shader(struct vl_compositor *c,
>>>> +                               const char *compute_shader_text)
>>>> +{
>>>> +   assert(c && compute_shader_text);
>>>> +
>>>> +   struct tgsi_token tokens[1024];
>>>> +   if (!tgsi_text_translate(compute_shader_text, tokens, 
>>>> ARRAY_SIZE(tokens))) {
>>>> +      assert(0);
>>>> +      return NULL;
>>>> +   }
>>>> +
>>>> +   struct pipe_compute_state state = {};
>>>> +   state.ir_type = PIPE_SHADER_IR_TGSI;
>>>> +   state.prog = tokens;
>>>> +
>>>> +   /* create compute shader */
>>>> +   return c->pipe->create_compute_state(c->pipe, &state);
>>>> +}
>>>> +
>>>> +void
>>>> +vl_compositor_cs_render(struct vl_compositor_state *s,
>>>> +                        struct vl_compositor       *c,
>>>> +                        struct pipe_surface *dst_surface,
>>>> +                        struct u_rect *dirty_area,
>>>> +                        bool clear_dirty)
>>>> +{
>>>> +   assert(c && s);
>>>> +   assert(dst_surface);
>>>> +
>>>> +   c->fb_state.width = dst_surface->width;
>>>> +   c->fb_state.height = dst_surface->height;
>>>> +   c->fb_state.cbufs[0] = dst_surface;
>>>> +
>>>> +   if (!s->scissor_valid) {
>>>> +      s->scissor.minx = 0;
>>>> +      s->scissor.miny = 0;
>>>> +      s->scissor.maxx = dst_surface->width;
>>>> +      s->scissor.maxy = dst_surface->height;
>>>> +   }
>>>> +
>>>> +   if (clear_dirty && dirty_area &&
>>>> +       (dirty_area->x0 < dirty_area->x1 || dirty_area->y0 < 
>>>> dirty_area->y1)) {
>>>> +
>>>> +      c->pipe->clear_render_target(c->pipe, dst_surface, 
>>>> &s->clear_color,
>>>> +                       0, 0, dst_surface->width, 
>>>> dst_surface->height, false);
>>>> +      dirty_area->x0 = dirty_area->y0 = MAX_DIRTY;
>>>> +      dirty_area->x1 = dirty_area->y1 = MIN_DIRTY;
>>>> +   }
>>>> +
>>>> +   cs_draw_layers(c, s, dirty_area);
>>>> +}
>>>> diff --git a/src/gallium/auxiliary/vl/vl_compositor_cs.h 
>>>> b/src/gallium/auxiliary/vl/vl_compositor_cs.h
>>>> new file mode 100644
>>>> index 0000000..a3f61dc
>>>> --- /dev/null
>>>> +++ b/src/gallium/auxiliary/vl/vl_compositor_cs.h
>>>> @@ -0,0 +1,56 @@
>>>> +/************************************************************************** 
>>>>
>>>> + *
>>>> + * Copyright 2019 Advanced Micro Devices, Inc.
>>>> + * All Rights Reserved.
>>>> + *
>>>> + * Permission is hereby granted, free of charge, to any person 
>>>> obtaining a
>>>> + * copy of this software and associated documentation files (the
>>>> + * "Software"), to deal in the Software without restriction, 
>>>> including
>>>> + * without limitation the rights to use, copy, modify, merge, 
>>>> publish,
>>>> + * distribute, sub license, and/or sell copies of the Software, 
>>>> and to
>>>> + * permit persons to whom the Software is furnished to do so, 
>>>> subject to
>>>> + * the following conditions:
>>>> + *
>>>> + * The above copyright notice and this permission notice 
>>>> (including the
>>>> + * next paragraph) shall be included in all copies or substantial 
>>>> portions
>>>> + * of the Software.
>>>> + *
>>>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
>>>> EXPRESS
>>>> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>>>> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
>>>> NON-INFRINGEMENT.
>>>> + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
>>>> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
>>>> CONTRACT,
>>>> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
>>>> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>>>> + *
>>>> + * Authors: James Zhu <james.zhu<@amd.com>
>>>> + *
>>>> + 
>>>> **************************************************************************/
>>>> +
>>>> +#ifndef vl_compositor_cs_h
>>>> +#define vl_compositor_cs_h
>>>> +
>>>> +#include "vl_compositor.h"
>>>> +
>>>> +char *compute_shader_video_buffer;
>>>> +char *compute_shader_weave;
>>>> +char *compute_shader_sub_pic;
>>>> +
>>>> +/**
>>>> + * create compute shader
>>>> + */
>>>> +void *
>>>> +vl_compositor_cs_create_shader(struct vl_compositor *c,
>>>> +                               const char *compute_shader_text);
>>>> +
>>>> +/**
>>>> + * render the layers to the frontbuffer with compute shader
>>>> + */
>>>> +void
>>>> +vl_compositor_cs_render(struct vl_compositor_state *s,
>>>> +                        struct vl_compositor       *c,
>>>> +                        struct pipe_surface *dst_surface,
>>>> +                        struct u_rect *dirty_area,
>>>> +                        bool clear_dirty);
>>>> +
>>>> +#endif /* vl_compositor_cs_h */
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>


More information about the mesa-dev mailing list