1 /**************************************************************************
3 * Copyright 2019 Red Hat.
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:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
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
24 **************************************************************************/
29 #include "os/os_thread.h"
30 #include "util/u_thread.h"
31 #include "pipe/p_state.h"
33 #include "gallivm/lp_bld.h"
34 #include "gallivm/lp_bld_sample.h" /* for struct lp_sampler_static_state */
36 #include "lp_state_fs.h"
38 struct lp_compute_shader_variant
;
40 struct lp_compute_shader_variant_key
42 unsigned nr_samplers
:8;
43 unsigned nr_sampler_views
:8;
45 /* followed by variable number of images */
46 struct lp_sampler_static_state samplers
[1];
49 #define LP_CS_MAX_VARIANT_KEY_SIZE \
50 (sizeof(struct lp_compute_shader_variant_key) + \
51 PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct lp_sampler_static_state) +\
52 PIPE_MAX_SHADER_IMAGES * sizeof(struct lp_image_static_state))
55 lp_cs_variant_key_size(unsigned nr_samplers
, unsigned nr_images
)
57 unsigned samplers
= nr_samplers
> 1 ? (nr_samplers
- 1) : 0;
58 return (sizeof(struct lp_compute_shader_variant_key
) +
59 samplers
* sizeof(struct lp_sampler_static_state
) +
60 nr_images
* sizeof(struct lp_image_static_state
));
63 static inline struct lp_image_static_state
*
64 lp_cs_variant_key_images(const struct lp_compute_shader_variant_key
*key
)
66 return (struct lp_image_static_state
*)
67 &key
->samplers
[key
->nr_samplers
];
70 struct lp_cs_variant_list_item
72 struct lp_compute_shader_variant
*base
;
73 struct lp_cs_variant_list_item
*next
, *prev
;
76 struct lp_compute_shader_variant
78 struct gallivm_state
*gallivm
;
80 LLVMTypeRef jit_cs_context_ptr_type
;
81 LLVMTypeRef jit_cs_thread_data_ptr_type
;
83 LLVMValueRef function
;
84 lp_jit_cs_func jit_function
;
86 /* Total number of LLVM instructions generated */
89 struct lp_cs_variant_list_item list_item_global
, list_item_local
;
91 struct lp_compute_shader
*shader
;
93 /* For debugging/profiling purposes */
96 /* key is variable-sized, must be last */
97 struct lp_compute_shader_variant_key key
;
100 struct lp_compute_shader
{
101 struct pipe_shader_state base
;
103 struct lp_cs_variant_list_item variants
;
105 struct lp_tgsi_info info
;
107 uint32_t req_local_mem
;
109 /* For debugging/profiling purposes */
110 unsigned variant_key_size
;
112 unsigned variants_created
;
113 unsigned variants_cached
;
115 int max_global_buffers
;
116 struct pipe_resource
**global_buffers
;
120 struct lp_jit_cs_context jit_context
;
121 struct lp_compute_shader_variant
*variant
;
124 struct lp_cs_context
{
125 struct pipe_context
*pipe
;
128 struct lp_cs_exec current
;
129 struct pipe_resource
*current_tex
[PIPE_MAX_SHADER_SAMPLER_VIEWS
];
130 unsigned current_tex_num
;
133 /** compute shader constants */
135 struct pipe_constant_buffer current
;
136 unsigned stored_size
;
137 const void *stored_data
;
138 } constants
[LP_MAX_TGSI_CONST_BUFFERS
];
140 /** compute shader buffers */
142 struct pipe_shader_buffer current
;
143 } ssbos
[LP_MAX_TGSI_SHADER_BUFFERS
];
146 struct pipe_image_view current
;
147 } images
[LP_MAX_TGSI_SHADER_IMAGES
];
152 struct lp_cs_context
*lp_csctx_create(struct pipe_context
*pipe
);
153 void lp_csctx_destroy(struct lp_cs_context
*csctx
);