18ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin/**************************************************************************
28ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin *
38ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * Copyright 2010 VMware, Inc.
48ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * All Rights Reserved.
58ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin *
68ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * Permission is hereby granted, free of charge, to any person obtaining a
78ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * copy of this software and associated documentation files (the
88ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * "Software"), to deal in the Software without restriction, including
98ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * without limitation the rights to use, copy, modify, merge, publish,
108ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * distribute, sub license, and/or sell copies of the Software, and to
118ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * permit persons to whom the Software is furnished to do so, subject to
128ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * the following conditions:
138ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin *
148ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * The above copyright notice and this permission notice (including the
158ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * next paragraph) shall be included in all copies or substantial portions
168ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * of the Software.
178ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin *
188ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
198ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
208ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
218ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
228ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
238ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
248ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
258ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin *
268ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin **************************************************************************/
278ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin
2801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#ifndef DRAW_LLVM_H
2901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#define DRAW_LLVM_H
30c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
31c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin#include "draw/draw_private.h"
32c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
338ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin#include "draw/draw_vs.h"
3401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "gallivm/lp_bld_sample.h"
358ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin
36c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin#include "pipe/p_context.h"
378ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin#include "util/u_simple_list.h"
38c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
3901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
408ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinstruct draw_llvm;
418ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinstruct llvm_vertex_shader;
428ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin
43c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusinstruct draw_jit_texture
44c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin{
45c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   uint32_t width;
46c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   uint32_t height;
4701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   uint32_t depth;
4808070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler   uint32_t first_level;
4901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   uint32_t last_level;
50048a90c1cb926fdeae47392582cb91b0a689905fBrian Paul   uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS];
51048a90c1cb926fdeae47392582cb91b0a689905fBrian Paul   uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS];
52048a90c1cb926fdeae47392582cb91b0a689905fBrian Paul   const void *data[PIPE_MAX_TEXTURE_LEVELS];
53998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca   float min_lod;
54998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca   float max_lod;
55998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca   float lod_bias;
56998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca   float border_color[4];
57c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin};
58c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
59c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusinenum {
60c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   DRAW_JIT_TEXTURE_WIDTH = 0,
61c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   DRAW_JIT_TEXTURE_HEIGHT,
6201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   DRAW_JIT_TEXTURE_DEPTH,
6308070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler   DRAW_JIT_TEXTURE_FIRST_LEVEL,
6401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   DRAW_JIT_TEXTURE_LAST_LEVEL,
6501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   DRAW_JIT_TEXTURE_ROW_STRIDE,
6601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   DRAW_JIT_TEXTURE_IMG_STRIDE,
6701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   DRAW_JIT_TEXTURE_DATA,
68998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca   DRAW_JIT_TEXTURE_MIN_LOD,
69998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca   DRAW_JIT_TEXTURE_MAX_LOD,
70998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca   DRAW_JIT_TEXTURE_LOD_BIAS,
71998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca   DRAW_JIT_TEXTURE_BORDER_COLOR,
7201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   DRAW_JIT_TEXTURE_NUM_FIELDS  /* number of fields above */
73c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin};
74c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
75c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusinenum {
76c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   DRAW_JIT_VERTEX_VERTEX_ID = 0,
77c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   DRAW_JIT_VERTEX_CLIP,
7840c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie   DRAW_JIT_VERTEX_PRE_CLIP_POS,
79c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   DRAW_JIT_VERTEX_DATA
80c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin};
81c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
82c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin/**
83c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin * This structure is passed directly to the generated vertex shader.
84c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin *
85c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin * It contains the derived state.
86c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin *
87c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin * Changes here must be reflected in the draw_jit_context_* macros.
88c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin * Changes to the ordering should be avoided.
89c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin *
90c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin * Only use types with a clear size and padding here, in particular prefer the
91c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin * stdint.h types to the basic integer types.
92c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin */
93c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusinstruct draw_jit_context
94c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin{
95c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   const float *vs_constants;
96c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   const float *gs_constants;
97e6c237cfd6f53ff569f68255d5d6da15148cd0f5Brian Paul   float (*planes) [DRAW_TOTAL_CLIP_PLANES][4];
9805921fd4e5305da68bb269748cb0ef059e1db417Keith Whitwell   float *viewport;
99c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
100cab2fed135bc1edf7b65ddca3236020638427061Brian Paul   struct draw_jit_texture textures[PIPE_MAX_SAMPLERS];
101c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin};
102c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
103c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
104efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define draw_jit_context_vs_constants(_gallivm, _ptr) \
105efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_struct_get(_gallivm, _ptr, 0, "vs_constants")
106c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
107efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define draw_jit_context_gs_constants(_gallivm, _ptr) \
108efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_struct_get(_gallivm, _ptr, 1, "gs_constants")
109c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
110efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define draw_jit_context_planes(_gallivm, _ptr) \
111efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_struct_get(_gallivm, _ptr, 2, "planes")
11208f890d4c3b8376d1840f90474f7c56329432d95delphi
113efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define draw_jit_context_viewport(_gallivm, _ptr) \
114efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_struct_get(_gallivm, _ptr, 3, "viewport")
11505921fd4e5305da68bb269748cb0ef059e1db417Keith Whitwell
11605921fd4e5305da68bb269748cb0ef059e1db417Keith Whitwell#define DRAW_JIT_CTX_TEXTURES 4
117c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
118efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define draw_jit_context_textures(_gallivm, _ptr) \
119efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_CTX_TEXTURES, "textures")
120c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
121efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define draw_jit_header_id(_gallivm, _ptr)              \
12240c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie   lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_VERTEX_VERTEX_ID, "id")
123ab5c09738760bc1b665b9809eaf921f4ac27057eZack Rusin
124efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define draw_jit_header_clip(_gallivm, _ptr) \
12540c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie   lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_VERTEX_CLIP, "clip")
12640c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie
12740c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie#define draw_jit_header_pre_clip_pos(_gallivm, _ptr) \
12840c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie   lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_VERTEX_PRE_CLIP_POS, "pre_clip_pos")
129ab5c09738760bc1b665b9809eaf921f4ac27057eZack Rusin
130efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define draw_jit_header_data(_gallivm, _ptr)            \
13140c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie   lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_VERTEX_DATA, "data")
132ab5c09738760bc1b665b9809eaf921f4ac27057eZack Rusin
133c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
134efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define draw_jit_vbuffer_stride(_gallivm, _ptr)         \
135efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_struct_get(_gallivm, _ptr, 0, "stride")
136c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
137efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define draw_jit_vbuffer_offset(_gallivm, _ptr)         \
138cdca3c58aa2d9549f5188910e2a77b438516714fMarek Olšák   lp_build_struct_get(_gallivm, _ptr, 1, "buffer_offset")
139c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
140c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
14194f65d095a1365b69a041302b473e40c6ccae3c3Hui Qi Taytypedef int
142c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin(*draw_jit_vert_func)(struct draw_jit_context *context,
143c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin                      struct vertex_header *io,
1441963112f9d0a2ed8e237641eef8eb384365d1375Zack Rusin                      const char *vbuffers[PIPE_MAX_ATTRIBS],
145c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin                      unsigned start,
146c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin                      unsigned count,
147821abff8c03031603111abc17dabe7cfa28a31e1Zack Rusin                      unsigned stride,
148fab4ac9e942465cb184a74b3abc57c2e5353c5bfZack Rusin                      struct pipe_vertex_buffer *vertex_buffers,
149fab4ac9e942465cb184a74b3abc57c2e5353c5bfZack Rusin                      unsigned instance_id);
150c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
15152f145a186b8e47439fb4a96d04a099d439477b7Zack Rusin
15294f65d095a1365b69a041302b473e40c6ccae3c3Hui Qi Taytypedef int
15352f145a186b8e47439fb4a96d04a099d439477b7Zack Rusin(*draw_jit_vert_func_elts)(struct draw_jit_context *context,
15452f145a186b8e47439fb4a96d04a099d439477b7Zack Rusin                           struct vertex_header *io,
15552f145a186b8e47439fb4a96d04a099d439477b7Zack Rusin                           const char *vbuffers[PIPE_MAX_ATTRIBS],
15652f145a186b8e47439fb4a96d04a099d439477b7Zack Rusin                           const unsigned *fetch_elts,
15752f145a186b8e47439fb4a96d04a099d439477b7Zack Rusin                           unsigned fetch_count,
15852f145a186b8e47439fb4a96d04a099d439477b7Zack Rusin                           unsigned stride,
159fab4ac9e942465cb184a74b3abc57c2e5353c5bfZack Rusin                           struct pipe_vertex_buffer *vertex_buffers,
160fab4ac9e942465cb184a74b3abc57c2e5353c5bfZack Rusin                           unsigned instance_id);
16152f145a186b8e47439fb4a96d04a099d439477b7Zack Rusin
1628ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinstruct draw_llvm_variant_key
1638ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin{
164b5236f3da482665567a9d53264e6203092120c31Keith Whitwell   unsigned nr_vertex_elements:8;
165b5236f3da482665567a9d53264e6203092120c31Keith Whitwell   unsigned nr_samplers:8;
1665f996e2b1d09dad64c088ccabb1a4a53ebfb8102Luca Barbieri   unsigned clamp_vertex_color:1;
16725bb05fef075a87ec6e5f2a989049faff2afedd2delphi   unsigned clip_xy:1;
16825bb05fef075a87ec6e5f2a989049faff2afedd2delphi   unsigned clip_z:1;
16925bb05fef075a87ec6e5f2a989049faff2afedd2delphi   unsigned clip_user:1;
170b5236f3da482665567a9d53264e6203092120c31Keith Whitwell   unsigned clip_halfz:1;
17125bb05fef075a87ec6e5f2a989049faff2afedd2delphi   unsigned bypass_viewport:1;
17225bb05fef075a87ec6e5f2a989049faff2afedd2delphi   unsigned need_edgeflags:1;
173dc4c821f0817a3db716f965692fb701079f66340Marek Olšák   unsigned ucp_enable:PIPE_MAX_CLIP_PLANES;
174dc4c821f0817a3db716f965692fb701079f66340Marek Olšák   unsigned pad:9-PIPE_MAX_CLIP_PLANES;
175a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell
176a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell   /* Variable number of vertex elements:
177a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell    */
178a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell   struct pipe_vertex_element vertex_element[1];
179a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell
180a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell   /* Followed by variable number of samplers:
181a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell    */
182a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell/*   struct lp_sampler_static_state sampler; */
1838ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin};
1848ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin
185a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell#define DRAW_LLVM_MAX_VARIANT_KEY_SIZE \
186a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell   (sizeof(struct draw_llvm_variant_key) +	\
187cab2fed135bc1edf7b65ddca3236020638427061Brian Paul    PIPE_MAX_SAMPLERS * sizeof(struct lp_sampler_static_state) +	\
188a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell    (PIPE_MAX_ATTRIBS-1) * sizeof(struct pipe_vertex_element))
189a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell
190a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell
191a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwellstatic INLINE size_t
192a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwelldraw_llvm_variant_key_size(unsigned nr_vertex_elements,
193a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell			   unsigned nr_samplers)
194a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell{
195a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell   return (sizeof(struct draw_llvm_variant_key) +
196a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell	   nr_samplers * sizeof(struct lp_sampler_static_state) +
197a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell	   (nr_vertex_elements - 1) * sizeof(struct pipe_vertex_element));
198a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell}
199a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell
200a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell
201a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwellstatic INLINE struct lp_sampler_static_state *
202a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwelldraw_llvm_variant_key_samplers(struct draw_llvm_variant_key *key)
203a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell{
204a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell   return (struct lp_sampler_static_state *)
205a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell      &key->vertex_element[key->nr_vertex_elements];
206a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell}
207a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell
208a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell
209a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell
2108ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinstruct draw_llvm_variant_list_item
2118ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin{
2128ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   struct draw_llvm_variant *base;
2138ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   struct draw_llvm_variant_list_item *next, *prev;
2148ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin};
2158ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin
2168ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinstruct draw_llvm_variant
2178ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin{
2183469715a8a171512cf9b528702e70393f01c6041José Fonseca   struct gallivm_state *gallivm;
2193469715a8a171512cf9b528702e70393f01c6041José Fonseca
2203469715a8a171512cf9b528702e70393f01c6041José Fonseca   /* LLVM JIT builder types */
2213469715a8a171512cf9b528702e70393f01c6041José Fonseca   LLVMTypeRef context_ptr_type;
2223469715a8a171512cf9b528702e70393f01c6041José Fonseca   LLVMTypeRef buffer_ptr_type;
2233469715a8a171512cf9b528702e70393f01c6041José Fonseca   LLVMTypeRef vb_ptr_type;
2243469715a8a171512cf9b528702e70393f01c6041José Fonseca   LLVMTypeRef vertex_header_ptr_type;
2253469715a8a171512cf9b528702e70393f01c6041José Fonseca
2268ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   LLVMValueRef function;
2278ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   LLVMValueRef function_elts;
2288ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   draw_jit_vert_func jit_func;
2298ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   draw_jit_vert_func_elts jit_func_elts;
2308ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin
2318ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   struct llvm_vertex_shader *shader;
2328ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin
2338ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   struct draw_llvm *llvm;
2348ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   struct draw_llvm_variant_list_item list_item_global;
2358ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   struct draw_llvm_variant_list_item list_item_local;
236a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell
237a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell   /* key is variable-sized, must be last */
238a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell   struct draw_llvm_variant_key key;
2398ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin};
2408ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin
2418ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinstruct llvm_vertex_shader {
2428ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   struct draw_vertex_shader base;
2438ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin
244a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell   unsigned variant_key_size;
2458ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   struct draw_llvm_variant_list_item variants;
2468ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   unsigned variants_created;
2478ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   unsigned variants_cached;
2488ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin};
2498ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin
250c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusinstruct draw_llvm {
251c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   struct draw_context *draw;
252c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
253c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   struct draw_jit_context jit_context;
254c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
2558ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   struct draw_llvm_variant_list_item vs_variants_list;
2568ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   int nr_variants;
257c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin};
258c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
259efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
260bb6ca7b3f74b63d45532108730b5c93a57926662José Fonsecastatic INLINE struct llvm_vertex_shader *
2618ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinllvm_vertex_shader(struct draw_vertex_shader *vs)
262323fdd8ae5baf16df6c57754e58adc8e22d28e10Zack Rusin{
2638ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin   return (struct llvm_vertex_shader *)vs;
2648ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin}
265323fdd8ae5baf16df6c57754e58adc8e22d28e10Zack Rusin
266323fdd8ae5baf16df6c57754e58adc8e22d28e10Zack Rusin
267c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusinstruct draw_llvm *
2683469715a8a171512cf9b528702e70393f01c6041José Fonsecadraw_llvm_create(struct draw_context *draw);
269c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
270c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusinvoid
271c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusindraw_llvm_destroy(struct draw_llvm *llvm);
272c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
273323fdd8ae5baf16df6c57754e58adc8e22d28e10Zack Rusinstruct draw_llvm_variant *
274a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwelldraw_llvm_create_variant(struct draw_llvm *llvm,
275a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell			 unsigned num_vertex_header_attribs,
276a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell			 const struct draw_llvm_variant_key *key);
2778ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin
2788ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinvoid
2798ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusindraw_llvm_destroy_variant(struct draw_llvm_variant *variant);
280c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
281a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwellstruct draw_llvm_variant_key *
282a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwelldraw_llvm_make_variant_key(struct draw_llvm *llvm, char *store);
283c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
28401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinstruct lp_build_sampler_soa *
28501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_llvm_sampler_soa_create(const struct lp_sampler_static_state *static_state,
28601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                             LLVMValueRef context_ptr);
28701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
28801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinvoid
2890cb545a7f2e823c85309013c4c41e9461f297d06Brian Pauldraw_llvm_set_sampler_state(struct draw_context *draw);
2900cb545a7f2e823c85309013c4c41e9461f297d06Brian Paul
2910cb545a7f2e823c85309013c4c41e9461f297d06Brian Paulvoid
29201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_llvm_set_mapped_texture(struct draw_context *draw,
29301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                             unsigned sampler_idx,
29401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                             uint32_t width, uint32_t height, uint32_t depth,
29508070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler                             uint32_t first_level, uint32_t last_level,
296048a90c1cb926fdeae47392582cb91b0a689905fBrian Paul                             uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
297048a90c1cb926fdeae47392582cb91b0a689905fBrian Paul                             uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
298048a90c1cb926fdeae47392582cb91b0a689905fBrian Paul                             const void *data[PIPE_MAX_TEXTURE_LEVELS]);
29901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
300c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin#endif
301