xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/vmwgfx/vmwgfx_so.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 OR MIT */
2*4882a593Smuzhiyun /**************************************************************************
3*4882a593Smuzhiyun  * Copyright 2014-2015 VMware, Inc., Palo Alto, CA., USA
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining a
6*4882a593Smuzhiyun  * copy of this software and associated documentation files (the
7*4882a593Smuzhiyun  * "Software"), to deal in the Software without restriction, including
8*4882a593Smuzhiyun  * without limitation the rights to use, copy, modify, merge, publish,
9*4882a593Smuzhiyun  * distribute, sub license, and/or sell copies of the Software, and to
10*4882a593Smuzhiyun  * permit persons to whom the Software is furnished to do so, subject to
11*4882a593Smuzhiyun  * the following conditions:
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * The above copyright notice and this permission notice (including the
14*4882a593Smuzhiyun  * next paragraph) shall be included in all copies or substantial portions
15*4882a593Smuzhiyun  * of the Software.
16*4882a593Smuzhiyun  *
17*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18*4882a593Smuzhiyun  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
20*4882a593Smuzhiyun  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
21*4882a593Smuzhiyun  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
22*4882a593Smuzhiyun  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
23*4882a593Smuzhiyun  * USE OR OTHER DEALINGS IN THE SOFTWARE.
24*4882a593Smuzhiyun  *
25*4882a593Smuzhiyun  **************************************************************************/
26*4882a593Smuzhiyun #ifndef VMW_SO_H
27*4882a593Smuzhiyun #define VMW_SO_H
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun enum vmw_view_type {
30*4882a593Smuzhiyun 	vmw_view_sr,
31*4882a593Smuzhiyun 	vmw_view_rt,
32*4882a593Smuzhiyun 	vmw_view_ds,
33*4882a593Smuzhiyun 	vmw_view_ua,
34*4882a593Smuzhiyun 	vmw_view_max,
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun enum vmw_so_type {
38*4882a593Smuzhiyun 	vmw_so_el,
39*4882a593Smuzhiyun 	vmw_so_bs,
40*4882a593Smuzhiyun 	vmw_so_ds,
41*4882a593Smuzhiyun 	vmw_so_rs,
42*4882a593Smuzhiyun 	vmw_so_ss,
43*4882a593Smuzhiyun 	vmw_so_so,
44*4882a593Smuzhiyun 	vmw_so_max,
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun /**
48*4882a593Smuzhiyun  * union vmw_view_destroy - view destruction command body
49*4882a593Smuzhiyun  *
50*4882a593Smuzhiyun  * @rtv: RenderTarget view destruction command body
51*4882a593Smuzhiyun  * @srv: ShaderResource view destruction command body
52*4882a593Smuzhiyun  * @dsv: DepthStencil view destruction command body
53*4882a593Smuzhiyun  * @view_id: A single u32 view id.
54*4882a593Smuzhiyun  *
55*4882a593Smuzhiyun  * The assumption here is that all union members are really represented by a
56*4882a593Smuzhiyun  * single u32 in the command stream. If that's not the case,
57*4882a593Smuzhiyun  * the size of this union will not equal the size of an u32, and the
58*4882a593Smuzhiyun  * assumption is invalid, and we detect that at compile time in the
59*4882a593Smuzhiyun  * vmw_so_build_asserts() function.
60*4882a593Smuzhiyun  */
61*4882a593Smuzhiyun union vmw_view_destroy {
62*4882a593Smuzhiyun 	struct SVGA3dCmdDXDestroyRenderTargetView rtv;
63*4882a593Smuzhiyun 	struct SVGA3dCmdDXDestroyShaderResourceView srv;
64*4882a593Smuzhiyun 	struct SVGA3dCmdDXDestroyDepthStencilView dsv;
65*4882a593Smuzhiyun 	struct SVGA3dCmdDXDestroyUAView uav;
66*4882a593Smuzhiyun 	u32 view_id;
67*4882a593Smuzhiyun };
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun /* Map enum vmw_view_type to view destroy command ids*/
70*4882a593Smuzhiyun extern const u32 vmw_view_destroy_cmds[];
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun /* Map enum vmw_view_type to SVGACOTableType */
73*4882a593Smuzhiyun extern const SVGACOTableType vmw_view_cotables[];
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /* Map enum vmw_so_type to SVGACOTableType */
76*4882a593Smuzhiyun extern const SVGACOTableType vmw_so_cotables[];
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun /*
79*4882a593Smuzhiyun  * vmw_view_cmd_to_type - Return the view type for a create or destroy command
80*4882a593Smuzhiyun  *
81*4882a593Smuzhiyun  * @id: The SVGA3D command id.
82*4882a593Smuzhiyun  *
83*4882a593Smuzhiyun  * For a given view create or destroy command id, return the corresponding
84*4882a593Smuzhiyun  * enum vmw_view_type. If the command is unknown, return vmw_view_max.
85*4882a593Smuzhiyun  * The validity of the simplified calculation is verified in the
86*4882a593Smuzhiyun  * vmw_so_build_asserts() function.
87*4882a593Smuzhiyun  */
vmw_view_cmd_to_type(u32 id)88*4882a593Smuzhiyun static inline enum vmw_view_type vmw_view_cmd_to_type(u32 id)
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun 	u32 tmp = (id - SVGA_3D_CMD_DX_DEFINE_SHADERRESOURCE_VIEW) / 2;
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 	if (id == SVGA_3D_CMD_DX_DEFINE_UA_VIEW ||
93*4882a593Smuzhiyun 	    id == SVGA_3D_CMD_DX_DESTROY_UA_VIEW)
94*4882a593Smuzhiyun 		return vmw_view_ua;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	if (tmp > (u32)vmw_view_max)
97*4882a593Smuzhiyun 		return vmw_view_max;
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 	return (enum vmw_view_type) tmp;
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun /*
103*4882a593Smuzhiyun  * vmw_so_cmd_to_type - Return the state object type for a
104*4882a593Smuzhiyun  * create or destroy command
105*4882a593Smuzhiyun  *
106*4882a593Smuzhiyun  * @id: The SVGA3D command id.
107*4882a593Smuzhiyun  *
108*4882a593Smuzhiyun  * For a given state object create or destroy command id,
109*4882a593Smuzhiyun  * return the corresponding enum vmw_so_type. If the command is uknown,
110*4882a593Smuzhiyun  * return vmw_so_max. We should perhaps optimize this function using
111*4882a593Smuzhiyun  * a similar strategy as vmw_view_cmd_to_type().
112*4882a593Smuzhiyun  */
vmw_so_cmd_to_type(u32 id)113*4882a593Smuzhiyun static inline enum vmw_so_type vmw_so_cmd_to_type(u32 id)
114*4882a593Smuzhiyun {
115*4882a593Smuzhiyun 	switch (id) {
116*4882a593Smuzhiyun 	case SVGA_3D_CMD_DX_DEFINE_ELEMENTLAYOUT:
117*4882a593Smuzhiyun 	case SVGA_3D_CMD_DX_DESTROY_ELEMENTLAYOUT:
118*4882a593Smuzhiyun 		return vmw_so_el;
119*4882a593Smuzhiyun 	case SVGA_3D_CMD_DX_DEFINE_BLEND_STATE:
120*4882a593Smuzhiyun 	case SVGA_3D_CMD_DX_DESTROY_BLEND_STATE:
121*4882a593Smuzhiyun 		return vmw_so_bs;
122*4882a593Smuzhiyun 	case SVGA_3D_CMD_DX_DEFINE_DEPTHSTENCIL_STATE:
123*4882a593Smuzhiyun 	case SVGA_3D_CMD_DX_DESTROY_DEPTHSTENCIL_STATE:
124*4882a593Smuzhiyun 		return vmw_so_ds;
125*4882a593Smuzhiyun 	case SVGA_3D_CMD_DX_DEFINE_RASTERIZER_STATE:
126*4882a593Smuzhiyun 	case SVGA_3D_CMD_DX_DESTROY_RASTERIZER_STATE:
127*4882a593Smuzhiyun 		return vmw_so_rs;
128*4882a593Smuzhiyun 	case SVGA_3D_CMD_DX_DEFINE_SAMPLER_STATE:
129*4882a593Smuzhiyun 	case SVGA_3D_CMD_DX_DESTROY_SAMPLER_STATE:
130*4882a593Smuzhiyun 		return vmw_so_ss;
131*4882a593Smuzhiyun 	case SVGA_3D_CMD_DX_DEFINE_STREAMOUTPUT:
132*4882a593Smuzhiyun 	case SVGA_3D_CMD_DX_DEFINE_STREAMOUTPUT_WITH_MOB:
133*4882a593Smuzhiyun 	case SVGA_3D_CMD_DX_DESTROY_STREAMOUTPUT:
134*4882a593Smuzhiyun 		return vmw_so_so;
135*4882a593Smuzhiyun 	default:
136*4882a593Smuzhiyun 		break;
137*4882a593Smuzhiyun 	}
138*4882a593Smuzhiyun 	return vmw_so_max;
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun /*
142*4882a593Smuzhiyun  * View management - vmwgfx_so.c
143*4882a593Smuzhiyun  */
144*4882a593Smuzhiyun extern int vmw_view_add(struct vmw_cmdbuf_res_manager *man,
145*4882a593Smuzhiyun 			struct vmw_resource *ctx,
146*4882a593Smuzhiyun 			struct vmw_resource *srf,
147*4882a593Smuzhiyun 			enum vmw_view_type view_type,
148*4882a593Smuzhiyun 			u32 user_key,
149*4882a593Smuzhiyun 			const void *cmd,
150*4882a593Smuzhiyun 			size_t cmd_size,
151*4882a593Smuzhiyun 			struct list_head *list);
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun extern int vmw_view_remove(struct vmw_cmdbuf_res_manager *man,
154*4882a593Smuzhiyun 			   u32 user_key, enum vmw_view_type view_type,
155*4882a593Smuzhiyun 			   struct list_head *list,
156*4882a593Smuzhiyun 			   struct vmw_resource **res_p);
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun extern void vmw_view_surface_list_destroy(struct vmw_private *dev_priv,
159*4882a593Smuzhiyun 					  struct list_head *view_list);
160*4882a593Smuzhiyun extern void vmw_view_cotable_list_destroy(struct vmw_private *dev_priv,
161*4882a593Smuzhiyun 					  struct list_head *list,
162*4882a593Smuzhiyun 					  bool readback);
163*4882a593Smuzhiyun extern struct vmw_resource *vmw_view_srf(struct vmw_resource *res);
164*4882a593Smuzhiyun extern struct vmw_resource *vmw_view_lookup(struct vmw_cmdbuf_res_manager *man,
165*4882a593Smuzhiyun 					    enum vmw_view_type view_type,
166*4882a593Smuzhiyun 					    u32 user_key);
167*4882a593Smuzhiyun extern u32 vmw_view_dirtying(struct vmw_resource *res);
168*4882a593Smuzhiyun #endif
169