draw_llvm.h revision e6c237cfd6f53ff569f68255d5d6da15148cd0f5
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/**************************************************************************
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer *
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * Copyright 2010 VMware, Inc.
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * All Rights Reserved.
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner *
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner * Permission is hereby granted, free of charge, to any person obtaining a
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * copy of this software and associated documentation files (the
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * "Software"), to deal in the Software without restriction, including
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * without limitation the rights to use, copy, modify, merge, publish,
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * distribute, sub license, and/or sell copies of the Software, and to
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * permit persons to whom the Software is furnished to do so, subject to
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * the following conditions:
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer *
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * The above copyright notice and this permission notice (including the
1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth * next paragraph) shall be included in all copies or substantial portions
162fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer * of the Software.
172fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer *
18bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
192fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2149aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25ea1471e0e967548c596a71469702f8846dbaf3c0John McCall *
262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor **************************************************************************/
2714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
282fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#ifndef DRAW_LLVM_H
292fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#define DRAW_LLVM_H
301b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner
31a9376d470ccb0eac74fe09a6b2a18a890f1d17c4Chris Lattner#include "draw/draw_private.h"
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
33f5942a44880be26878592eb052b737579349411eBenjamin Kramer#include "draw/draw_vs.h"
3485f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson#include "gallivm/lp_bld_sample.h"
352fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer
366fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman#include "pipe/p_context.h"
37f5942a44880be26878592eb052b737579349411eBenjamin Kramer#include "util/u_simple_list.h"
382636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis
3929445a0542d128cd7ee587ee52229670b9b54a12Anders Carlsson#include <llvm-c/Core.h>
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <llvm-c/Analysis.h>
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <llvm-c/Target.h>
421827403a7138946305c0058f262e02b595cf882fDouglas Gregor#include <llvm-c/ExecutionEngine.h>
431827403a7138946305c0058f262e02b595cf882fDouglas Gregor
44225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregor
45225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregorstruct draw_llvm;
46ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Huntstruct llvm_vertex_shader;
47ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt
48a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregorstruct draw_jit_texture
49a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregor{
50ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt   uint32_t width;
51ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt   uint32_t height;
524923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor   uint32_t depth;
534923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor   uint32_t first_level;
544923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor   uint32_t last_level;
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS];
56aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov   uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS];
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   const void *data[PIPE_MAX_TEXTURE_LEVELS];
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer   float min_lod;
59a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko   float max_lod;
60aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   float lod_bias;
61aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   float border_color[4];
62aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko};
63aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
64aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkoenum {
65aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   DRAW_JIT_TEXTURE_WIDTH = 0,
66aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   DRAW_JIT_TEXTURE_HEIGHT,
67c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko   DRAW_JIT_TEXTURE_DEPTH,
68c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko   DRAW_JIT_TEXTURE_FIRST_LEVEL,
69c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko   DRAW_JIT_TEXTURE_LAST_LEVEL,
70c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko   DRAW_JIT_TEXTURE_ROW_STRIDE,
71c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko   DRAW_JIT_TEXTURE_IMG_STRIDE,
72c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko   DRAW_JIT_TEXTURE_DATA,
73c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko   DRAW_JIT_TEXTURE_MIN_LOD,
74c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko   DRAW_JIT_TEXTURE_MAX_LOD,
75c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko   DRAW_JIT_TEXTURE_LOD_BIAS,
76c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko   DRAW_JIT_TEXTURE_BORDER_COLOR,
77dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko   DRAW_JIT_TEXTURE_NUM_FIELDS  /* number of fields above */
78dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko};
79dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko
80dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenkoenum {
81dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko   DRAW_JIT_VERTEX_VERTEX_ID = 0,
82dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko   DRAW_JIT_VERTEX_CLIP,
83dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko   DRAW_JIT_VERTEX_DATA
84dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko};
85dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko
86dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko/**
87dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko * This structure is passed directly to the generated vertex shader.
88d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko *
89d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko * It contains the derived state.
90d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko *
91d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko * Changes here must be reflected in the draw_jit_context_* macros.
92d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko * Changes to the ordering should be avoided.
93d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko *
94d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko * Only use types with a clear size and padding here, in particular prefer the
95d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko * stdint.h types to the basic integer types.
96dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko */
97dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenkostruct draw_jit_context
98dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko{
99dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko   const float *vs_constants;
100099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian   const float *gs_constants;
101099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian   float (*planes) [DRAW_TOTAL_CLIP_PLANES][4];
102099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian   float *viewport;
103099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian
104099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian   struct draw_jit_texture textures[PIPE_MAX_VERTEX_SAMPLERS];
105099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian};
106aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
107aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
108aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko#define draw_jit_context_vs_constants(_gallivm, _ptr) \
109aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   lp_build_struct_get(_gallivm, _ptr, 0, "vs_constants")
11096b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
11196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko#define draw_jit_context_gs_constants(_gallivm, _ptr) \
11296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko   lp_build_struct_get(_gallivm, _ptr, 1, "gs_constants")
11396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
11496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko#define draw_jit_context_planes(_gallivm, _ptr) \
11596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko   lp_build_struct_get(_gallivm, _ptr, 2, "planes")
11696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
117811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko#define draw_jit_context_viewport(_gallivm, _ptr) \
118aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   lp_build_struct_get(_gallivm, _ptr, 3, "viewport")
119aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
120aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko#define DRAW_JIT_CTX_TEXTURES 4
121aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
122aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko#define draw_jit_context_textures(_gallivm, _ptr) \
123abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko   lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_CTX_TEXTURES, "textures")
124abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko
125abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko#define draw_jit_header_id(_gallivm, _ptr)              \
126abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko   lp_build_struct_get_ptr(_gallivm, _ptr, 0, "id")
127abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko
128abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko#define draw_jit_header_clip(_gallivm, _ptr) \
129abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko   lp_build_struct_get_ptr(_gallivm, _ptr, 1, "clip")
130abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko
13196b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko#define draw_jit_header_data(_gallivm, _ptr)            \
132c27bc80a98b9558513b50956c930eedc9e461ae0Dmitri Gribenko   lp_build_struct_get_ptr(_gallivm, _ptr, 2, "data")
133c27bc80a98b9558513b50956c930eedc9e461ae0Dmitri Gribenko
134abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko
135abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko#define draw_jit_vbuffer_stride(_gallivm, _ptr)         \
136abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko   lp_build_struct_get(_gallivm, _ptr, 0, "stride")
137abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko
138aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko#define draw_jit_vbuffer_offset(_gallivm, _ptr)         \
139aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   lp_build_struct_get(_gallivm, _ptr, 1, "buffer_offset")
140aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
141aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
142aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkotypedef int
143aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko(*draw_jit_vert_func)(struct draw_jit_context *context,
144a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                      struct vertex_header *io,
145a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                      const char *vbuffers[PIPE_MAX_ATTRIBS],
146a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                      unsigned start,
147a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                      unsigned count,
148a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                      unsigned stride,
1496fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko                      struct pipe_vertex_buffer *vertex_buffers,
1506fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko                      unsigned instance_id);
1516fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko
152a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko
153a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenkotypedef int
154a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko(*draw_jit_vert_func_elts)(struct draw_jit_context *context,
155a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                           struct vertex_header *io,
156a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                           const char *vbuffers[PIPE_MAX_ATTRIBS],
157a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                           const unsigned *fetch_elts,
158a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                           unsigned fetch_count,
159a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                           unsigned stride,
160a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                           struct pipe_vertex_buffer *vertex_buffers,
161a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                           unsigned instance_id);
162a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko
163a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenkostruct draw_llvm_variant_key
164a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko{
165a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko   unsigned nr_vertex_elements:8;
166a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko   unsigned nr_samplers:8;
167a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko   unsigned clamp_vertex_color:1;
168a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko   unsigned clip_xy:1;
169a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko   unsigned clip_z:1;
170aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   unsigned clip_user:1;
171aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   unsigned clip_halfz:1;
172aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   unsigned bypass_viewport:1;
173aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   unsigned need_edgeflags:1;
174aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   unsigned nr_planes:4;
175aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   unsigned pad:5;
176aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
177811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko   /* Variable number of vertex elements:
1789c00676f2393335dc60c61faf944d4f8f622fac6Dmitri Gribenko    */
179aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   struct pipe_vertex_element vertex_element[1];
180811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko
181aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   /* Followed by variable number of samplers:
182aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    */
183aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko/*   struct lp_sampler_static_state sampler; */
184aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko};
185aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
186aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko#define DRAW_LLVM_MAX_VARIANT_KEY_SIZE \
187811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko   (sizeof(struct draw_llvm_variant_key) +	\
188aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    PIPE_MAX_VERTEX_SAMPLERS * sizeof(struct lp_sampler_static_state) +	\
189aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    (PIPE_MAX_ATTRIBS-1) * sizeof(struct pipe_vertex_element))
190aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
191aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
192aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkostatic INLINE size_t
193aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkodraw_llvm_variant_key_size(unsigned nr_vertex_elements,
194aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko			   unsigned nr_samplers)
195aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko{
196aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   return (sizeof(struct draw_llvm_variant_key) +
197aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko	   nr_samplers * sizeof(struct lp_sampler_static_state) +
198811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko	   (nr_vertex_elements - 1) * sizeof(struct pipe_vertex_element));
199aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko}
200aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
201aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
202aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkostatic INLINE struct lp_sampler_static_state *
203811c820257746b1799b790b6adc7804f44154011Dmitri Gribenkodraw_llvm_variant_key_samplers(struct draw_llvm_variant_key *key)
204aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko{
205aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   return (struct lp_sampler_static_state *)
206aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      &key->vertex_element[key->nr_vertex_elements];
207aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko}
208aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
209aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
210aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
211aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkostruct draw_llvm_variant_list_item
212aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko{
213aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   struct draw_llvm_variant *base;
214aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   struct draw_llvm_variant_list_item *next, *prev;
215aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko};
216aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
217aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkostruct draw_llvm_variant
218aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko{
219aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   LLVMValueRef function;
220aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   LLVMValueRef function_elts;
2218bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko   draw_jit_vert_func jit_func;
2228bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko   draw_jit_vert_func_elts jit_func_elts;
223abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko
224aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   struct llvm_vertex_shader *shader;
225aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
226811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko   struct draw_llvm *llvm;
227aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   struct draw_llvm_variant_list_item list_item_global;
228aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko   struct draw_llvm_variant_list_item list_item_local;
229c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko
230c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko   /* key is variable-sized, must be last */
231c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko   struct draw_llvm_variant_key key;
2322125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko};
233c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko
234cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregorstruct llvm_vertex_shader {
2352125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   struct draw_vertex_shader base;
236cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregor
2372125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   unsigned variant_key_size;
2382125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   struct draw_llvm_variant_list_item variants;
2392125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   unsigned variants_created;
2402125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   unsigned variants_cached;
2412125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko};
2422125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2432125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkostruct draw_llvm {
2442125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   struct draw_context *draw;
2452125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2462125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   struct draw_jit_context jit_context;
2472125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2482125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   struct gallivm_state *gallivm;
2492125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2502125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   struct draw_llvm_variant_list_item vs_variants_list;
2512125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   int nr_variants;
2522125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2532125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   /* LLVM JIT builder types */
2542125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   LLVMTypeRef context_ptr_type;
2552125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   LLVMTypeRef buffer_ptr_type;
2562125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   LLVMTypeRef vb_ptr_type;
2572125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   LLVMTypeRef vertex_header_ptr_type;
2582125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko};
2592125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2602125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2612125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkostatic INLINE struct llvm_vertex_shader *
2622125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkollvm_vertex_shader(struct draw_vertex_shader *vs)
2632125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko{
2642125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko   return (struct llvm_vertex_shader *)vs;
2652125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko}
2662125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2672125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2682125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkostruct draw_llvm *
2692125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkodraw_llvm_create(struct draw_context *draw, struct gallivm_state *gallivm);
2702125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2712125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkovoid
2722125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkodraw_llvm_destroy(struct draw_llvm *llvm);
2732125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2742125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkostruct draw_llvm_variant *
2752125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkodraw_llvm_create_variant(struct draw_llvm *llvm,
2762125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko			 unsigned num_vertex_header_attribs,
2772125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko			 const struct draw_llvm_variant_key *key);
2782125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2792125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkovoid
2802125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkodraw_llvm_destroy_variant(struct draw_llvm_variant *variant);
2812125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2822125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkostruct draw_llvm_variant_key *
2832125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkodraw_llvm_make_variant_key(struct draw_llvm *llvm, char *store);
2842125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2852125c9010e259548a8c476fa998a561889555c95Dmitri GribenkoLLVMValueRef
2862125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkodraw_llvm_translate_from(struct gallivm_state *gallivm,
2872125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                         LLVMValueRef vbuffer,
2882125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                         enum pipe_format from_format);
2892125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2902125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkostruct lp_build_sampler_soa *
2912125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkodraw_llvm_sampler_soa_create(const struct lp_sampler_static_state *static_state,
2922125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                             LLVMValueRef context_ptr);
2932125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2942125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkovoid
2952125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkodraw_llvm_set_sampler_state(struct draw_context *draw);
296cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregor
2972125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkovoid
298c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenkodraw_llvm_set_mapped_texture(struct draw_context *draw,
299c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko                             unsigned sampler_idx,
300c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko                             uint32_t width, uint32_t height, uint32_t depth,
301c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko                             uint32_t first_level, uint32_t last_level,
3021599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko                             uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
3031599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko                             uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
3041599eac40a3b28de0824013dc2fb90551dfa01b0Dmitri Gribenko                             const void *data[PIPE_MAX_TEXTURE_LEVELS]);
305c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko
306cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregor#endif
307f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko