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