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)[key->nr_samplers]); 71} 72 73struct lp_cs_variant_list_item 74{ 75 struct lp_compute_shader_variant *base; 76 struct lp_cs_variant_list_item *next, *prev; 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 118 int max_global_buffers; 119 struct pipe_resource **global_buffers; 120}; 121 122struct lp_cs_exec { 123 struct lp_jit_cs_context jit_context; 124 struct lp_compute_shader_variant *variant; 125}; 126 127struct lp_cs_context { 128 struct pipe_context *pipe; 129 130 struct { 131 struct lp_cs_exec current; 132 struct pipe_resource *current_tex[PIPE_MAX_SHADER_SAMPLER_VIEWS]; 133 unsigned current_tex_num; 134 } cs; 135 136 /** compute shader constants */ 137 struct { 138 struct pipe_constant_buffer current; 139 unsigned stored_size; 140 const void *stored_data; 141 } constants[LP_MAX_TGSI_CONST_BUFFERS]; 142 143 /** compute shader buffers */ 144 struct { 145 struct pipe_shader_buffer current; 146 } ssbos[LP_MAX_TGSI_SHADER_BUFFERS]; 147 148 struct { 149 struct pipe_image_view current; 150 } images[LP_MAX_TGSI_SHADER_IMAGES]; 151 152 void *input; 153}; 154 155struct lp_cs_context *lp_csctx_create(struct pipe_context *pipe); 156void lp_csctx_destroy(struct lp_cs_context *csctx); 157 158#endif 159