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