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