1 /* 2 * Copyright 2014, 2015 Red Hat. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * on the rights to use, copy, modify, merge, publish, distribute, sub 8 * license, and/or sell copies of the Software, and to permit persons to whom 9 * the Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21 * USE OR OTHER DEALINGS IN THE SOFTWARE. 22 */ 23 24 #ifndef VIRGL_RESOURCE_H 25 #define VIRGL_RESOURCE_H 26 27 #include "util/u_resource.h" 28 #include "util/u_range.h" 29 #include "util/list.h" 30 #include "util/u_transfer.h" 31 32 #include "virgl_hw.h" 33 #define VR_MAX_TEXTURE_2D_LEVELS 15 34 35 struct winsys_handle; 36 struct virgl_screen; 37 struct virgl_context; 38 39 struct virgl_resource { 40 struct u_resource u; 41 struct virgl_hw_res *hw_res; 42 boolean clean; 43 }; 44 45 struct virgl_buffer { 46 struct virgl_resource base; 47 48 struct list_head flush_list; 49 boolean on_list; 50 51 /* The buffer range which is initialized (with a write transfer, 52 * streamout, DMA, or as a random access target). The rest of 53 * the buffer is considered invalid and can be mapped unsynchronized. 54 * 55 * This allows unsychronized mapping of a buffer range which hasn't 56 * been used yet. It's for applications which forget to use 57 * the unsynchronized map flag and expect the driver to figure it out. 58 */ 59 struct util_range valid_buffer_range; 60 }; 61 62 struct virgl_texture { 63 struct virgl_resource base; 64 65 unsigned long level_offset[VR_MAX_TEXTURE_2D_LEVELS]; 66 unsigned stride[VR_MAX_TEXTURE_2D_LEVELS]; 67 }; 68 69 struct virgl_transfer { 70 struct pipe_transfer base; 71 uint32_t offset; 72 struct virgl_resource *resolve_tmp; 73 }; 74 75 void virgl_resource_destroy(struct pipe_screen *screen, 76 struct pipe_resource *resource); 77 78 void virgl_init_screen_resource_functions(struct pipe_screen *screen); 79 80 void virgl_init_context_resource_functions(struct pipe_context *ctx); 81 82 struct pipe_resource *virgl_texture_create(struct virgl_screen *vs, 83 const struct pipe_resource *templ); 84 85 struct pipe_resource *virgl_texture_from_handle(struct virgl_screen *vs, 86 const struct pipe_resource *templ, 87 struct winsys_handle *whandle); 88 89 static inline struct virgl_resource *virgl_resource(struct pipe_resource *r) 90 { 91 return (struct virgl_resource *)r; 92 } 93 94 static inline struct virgl_buffer *virgl_buffer(struct pipe_resource *r) 95 { 96 return (struct virgl_buffer *)r; 97 } 98 99 static inline struct virgl_texture *virgl_texture(struct pipe_resource *r) 100 { 101 return (struct virgl_texture *)r; 102 } 103 104 static inline struct virgl_transfer *virgl_transfer(struct pipe_transfer *trans) 105 { 106 return (struct virgl_transfer *)trans; 107 } 108 109 struct pipe_resource *virgl_buffer_create(struct virgl_screen *vs, 110 const struct pipe_resource *templ); 111 112 static inline unsigned pipe_to_virgl_bind(unsigned pbind) 113 { 114 unsigned outbind = 0; 115 if (pbind & PIPE_BIND_DEPTH_STENCIL) 116 outbind |= VIRGL_BIND_DEPTH_STENCIL; 117 if (pbind & PIPE_BIND_RENDER_TARGET) 118 outbind |= VIRGL_BIND_RENDER_TARGET; 119 if (pbind & PIPE_BIND_SAMPLER_VIEW) 120 outbind |= VIRGL_BIND_SAMPLER_VIEW; 121 if (pbind & PIPE_BIND_VERTEX_BUFFER) 122 outbind |= VIRGL_BIND_VERTEX_BUFFER; 123 if (pbind & PIPE_BIND_INDEX_BUFFER) 124 outbind |= VIRGL_BIND_INDEX_BUFFER; 125 if (pbind & PIPE_BIND_CONSTANT_BUFFER) 126 outbind |= VIRGL_BIND_CONSTANT_BUFFER; 127 if (pbind & PIPE_BIND_DISPLAY_TARGET) 128 outbind |= VIRGL_BIND_DISPLAY_TARGET; 129 if (pbind & PIPE_BIND_STREAM_OUTPUT) 130 outbind |= VIRGL_BIND_STREAM_OUTPUT; 131 if (pbind & PIPE_BIND_CURSOR) 132 outbind |= VIRGL_BIND_CURSOR; 133 if (pbind & PIPE_BIND_CUSTOM) 134 outbind |= VIRGL_BIND_CUSTOM; 135 if (pbind & PIPE_BIND_SCANOUT) 136 outbind |= VIRGL_BIND_SCANOUT; 137 return outbind; 138 } 139 140 bool virgl_res_needs_flush_wait(struct virgl_context *vctx, 141 struct virgl_resource *res, 142 unsigned usage); 143 bool virgl_res_needs_readback(struct virgl_context *vctx, 144 struct virgl_resource *res, 145 unsigned usage); 146 #endif 147