Skip to content

Commit b6fad73

Browse files
deepak-rawatRoland Scheidegger
authored andcommitted
drm/vmwgfx: Add support for indirect and dispatch commands
Validate indirect and dispatch commands in command buffer. Signed-off-by: Deepak Rawat <[email protected]> Reviewed-by: Thomas Hellström (VMware) <[email protected]> Reviewed-by: Roland Scheidegger <[email protected]> Signed-off-by: Roland Scheidegger <[email protected]>
1 parent 5e8ec0d commit b6fad73

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2816,6 +2816,16 @@ static int vmw_cmd_intra_surface_copy(struct vmw_private *dev_priv,
28162816
&cmd->body.surface.sid, NULL);
28172817
}
28182818

2819+
static int vmw_cmd_sm5(struct vmw_private *dev_priv,
2820+
struct vmw_sw_context *sw_context,
2821+
SVGA3dCmdHeader *header)
2822+
{
2823+
if (!has_sm5_context(dev_priv))
2824+
return -EINVAL;
2825+
2826+
return 0;
2827+
}
2828+
28192829
static int vmw_cmd_sm5_view_define(struct vmw_private *dev_priv,
28202830
struct vmw_sw_context *sw_context,
28212831
SVGA3dCmdHeader *header)
@@ -2938,6 +2948,57 @@ static int vmw_cmd_set_cs_uav(struct vmw_private *dev_priv,
29382948
return ret;
29392949
}
29402950

2951+
static int vmw_cmd_indexed_instanced_indirect(struct vmw_private *dev_priv,
2952+
struct vmw_sw_context *sw_context,
2953+
SVGA3dCmdHeader *header)
2954+
{
2955+
struct vmw_draw_indexed_instanced_indirect_cmd {
2956+
SVGA3dCmdHeader header;
2957+
SVGA3dCmdDXDrawIndexedInstancedIndirect body;
2958+
} *cmd = container_of(header, typeof(*cmd), header);
2959+
2960+
if (!has_sm5_context(dev_priv))
2961+
return -EINVAL;
2962+
2963+
return vmw_cmd_res_check(dev_priv, sw_context, vmw_res_surface,
2964+
VMW_RES_DIRTY_NONE, user_surface_converter,
2965+
&cmd->body.argsBufferSid, NULL);
2966+
}
2967+
2968+
static int vmw_cmd_instanced_indirect(struct vmw_private *dev_priv,
2969+
struct vmw_sw_context *sw_context,
2970+
SVGA3dCmdHeader *header)
2971+
{
2972+
struct vmw_draw_instanced_indirect_cmd {
2973+
SVGA3dCmdHeader header;
2974+
SVGA3dCmdDXDrawInstancedIndirect body;
2975+
} *cmd = container_of(header, typeof(*cmd), header);
2976+
2977+
if (!has_sm5_context(dev_priv))
2978+
return -EINVAL;
2979+
2980+
return vmw_cmd_res_check(dev_priv, sw_context, vmw_res_surface,
2981+
VMW_RES_DIRTY_NONE, user_surface_converter,
2982+
&cmd->body.argsBufferSid, NULL);
2983+
}
2984+
2985+
static int vmw_cmd_dispatch_indirect(struct vmw_private *dev_priv,
2986+
struct vmw_sw_context *sw_context,
2987+
SVGA3dCmdHeader *header)
2988+
{
2989+
struct vmw_dispatch_indirect_cmd {
2990+
SVGA3dCmdHeader header;
2991+
SVGA3dCmdDXDispatchIndirect body;
2992+
} *cmd = container_of(header, typeof(*cmd), header);
2993+
2994+
if (!has_sm5_context(dev_priv))
2995+
return -EINVAL;
2996+
2997+
return vmw_cmd_res_check(dev_priv, sw_context, vmw_res_surface,
2998+
VMW_RES_DIRTY_NONE, user_surface_converter,
2999+
&cmd->body.argsBufferSid, NULL);
3000+
}
3001+
29413002
static int vmw_cmd_check_not_3d(struct vmw_private *dev_priv,
29423003
struct vmw_sw_context *sw_context,
29433004
void *buf, uint32_t *size)
@@ -3303,8 +3364,17 @@ static const struct vmw_cmd_entry vmw_cmd_entries[SVGA_3D_CMD_MAX] = {
33033364
false, true),
33043365
VMW_CMD_DEF(SVGA_3D_CMD_DX_SET_UA_VIEWS, &vmw_cmd_set_uav, true, false,
33053366
true),
3367+
VMW_CMD_DEF(SVGA_3D_CMD_DX_DRAW_INDEXED_INSTANCED_INDIRECT,
3368+
&vmw_cmd_indexed_instanced_indirect, true, false, true),
3369+
VMW_CMD_DEF(SVGA_3D_CMD_DX_DRAW_INSTANCED_INDIRECT,
3370+
&vmw_cmd_instanced_indirect, true, false, true),
3371+
VMW_CMD_DEF(SVGA_3D_CMD_DX_DISPATCH, &vmw_cmd_sm5, true, false, true),
3372+
VMW_CMD_DEF(SVGA_3D_CMD_DX_DISPATCH_INDIRECT,
3373+
&vmw_cmd_dispatch_indirect, true, false, true),
33063374
VMW_CMD_DEF(SVGA_3D_CMD_DX_SET_CS_UA_VIEWS, &vmw_cmd_set_cs_uav, true,
33073375
false, true),
3376+
VMW_CMD_DEF(SVGA_3D_CMD_DX_DEFINE_DEPTHSTENCIL_VIEW_V2,
3377+
&vmw_cmd_sm5_view_define, true, false, true),
33083378
};
33093379

33103380
bool vmw_cmd_describe(const void *buf, u32 *size, char const **cmd)

0 commit comments

Comments
 (0)