1/************************************************************************** 2 * 3 * Copyright 2019 Red Hat. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included 14 * in all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 * 24 **************************************************************************/ 25 26#ifndef LP_STATE_CS_H 27#define LP_STATE_CS_H 28 29#include "os/os_thread.h" 30#include "util/u_thread.h" 31#include "pipe/p_state.h" 32 33#include "gallivm/lp_bld.h" 34#include "gallivm/lp_bld_sample.h" /* for struct lp_sampler_static_state */ 35#include "lp_jit.h" 36#include "lp_state_fs.h" 37 38struct lp_compute_shader_variant; 39 40struct lp_compute_shader_variant_key 41{ 42 unsigned nr_samplers:8; 43 unsigned nr_sampler_views:8; 44 unsigned nr_images:8; 45}; 46 47#define LP_CS_MAX_VARIANT_KEY_SIZE \ 48 (sizeof(struct lp_compute_shader_variant_key) + \ 49 PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct lp_sampler_static_state) + \ 50 PIPE_MAX_SHADER_IMAGES * sizeof(struct lp_image_static_state)) 51 52static inline size_t 53lp_cs_variant_key_size(unsigned nr_samplers, unsigned nr_images) 54{ 55 return (sizeof(struct lp_compute_shader_variant_key) + 56 nr_samplers * sizeof(struct lp_sampler_static_state) + 57 nr_images * sizeof(struct lp_image_static_state)); 58} 59 60static inline struct lp_sampler_static_state * 61lp_cs_variant_key_samplers(const struct lp_compute_shader_variant_key *key) 62{ 63 return (struct lp_sampler_static_state *)&(key[1]); 64} 65 66static inline struct lp_image_static_state * 67lp_cs_variant_key_images(const struct lp_compute_shader_variant_key *key) 68{ 69 return (struct lp_image_static_state *) 70 &(lp_cs_variant_key_samplers(key)[MAX2(key->nr_samplers, key->nr_sampler_views)]); 71} 72 73struct lp_cs_variant_list_item 74{ 75 struct list_head list; 76 struct lp_compute_shader_variant *base; 77}; 78 79struct lp_compute_shader_variant 80{ 81 struct gallivm_state *gallivm; 82 83 LLVMTypeRef jit_cs_context_ptr_type; 84 LLVMTypeRef jit_cs_thread_data_ptr_type; 85 86 LLVMValueRef function; 87 lp_jit_cs_func jit_function; 88 89 /* Total number of LLVM instructions generated */ 90 unsigned nr_instrs; 91 92 struct lp_cs_variant_list_item list_item_global, list_item_local; 93 94 struct lp_compute_shader *shader; 95 96 /* For debugging/profiling purposes */ 97 unsigned no; 98 99 /* key is variable-sized, must be last */ 100 struct lp_compute_shader_variant_key key; 101}; 102 103struct lp_compute_shader { 104 struct pipe_shader_state base; 105 106 struct lp_cs_variant_list_item variants; 107 108 struct lp_tgsi_info info; 109 110 uint32_t req_local_mem; 111 112 /* For debugging/profiling purposes */ 113 unsigned variant_key_size; 114 unsigned no; 115 unsigned variants_created; 116 unsigned variants_cached; 117 bool zero_initialize_shared_memory; 118 119 int max_global_buffers; 120 struct pipe_resource **global_buffers; 121}; 122 123struct lp_cs_exec { 124 struct lp_jit_cs_context jit_context; 125 struct lp_compute_shader_variant *variant; 126}; 127 128struct lp_cs_context { 129 struct pipe_context *pipe; 130 131 struct { 132 struct lp_cs_exec current; 133 struct pipe_resource *current_tex[PIPE_MAX_SHADER_SAMPLER_VIEWS]; 134 unsigned current_tex_num; 135 } cs; 136 137 /** compute shader constants */ 138 struct { 139 struct pipe_constant_buffer current; 140 unsigned stored_size; 141 const void *stored_data; 142 } constants[LP_MAX_TGSI_CONST_BUFFERS]; 143 144 /** compute shader buffers */ 145 struct { 146 struct pipe_shader_buffer current; 147 } ssbos[LP_MAX_TGSI_SHADER_BUFFERS]; 148 149 struct { 150 struct pipe_image_view current; 151 } images[LP_MAX_TGSI_SHADER_IMAGES]; 152 153 void *input; 154}; 155 156struct lp_cs_context *lp_csctx_create(struct pipe_context *pipe); 157void lp_csctx_destroy(struct lp_cs_context *csctx); 158 159#endif 160