1848b8605Smrg/**************************************************************************
2848b8605Smrg *
3848b8605Smrg * Copyright 2009 VMware, Inc.
4848b8605Smrg * All Rights Reserved.
5848b8605Smrg *
6848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
7848b8605Smrg * copy of this software and associated documentation files (the
8848b8605Smrg * "Software"), to deal in the Software without restriction, including
9848b8605Smrg * without limitation the rights to use, copy, modify, merge, publish,
10848b8605Smrg * distribute, sub license, and/or sell copies of the Software, and to
11848b8605Smrg * permit persons to whom the Software is furnished to do so, subject to
12848b8605Smrg * the following conditions:
13848b8605Smrg *
14848b8605Smrg * The above copyright notice and this permission notice (including the
15848b8605Smrg * next paragraph) shall be included in all copies or substantial portions
16848b8605Smrg * of the Software.
17848b8605Smrg *
18848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20848b8605Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21848b8605Smrg * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22848b8605Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23848b8605Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24848b8605Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25848b8605Smrg *
26848b8605Smrg **************************************************************************/
27848b8605Smrg
28848b8605Smrg/**
29848b8605Smrg * @file
30848b8605Smrg * C - JIT interfaces
31848b8605Smrg *
32848b8605Smrg * @author Jose Fonseca <jfonseca@vmware.com>
33848b8605Smrg */
34848b8605Smrg
35848b8605Smrg
36848b8605Smrg#include "util/u_memory.h"
37848b8605Smrg#include "gallivm/lp_bld_init.h"
38848b8605Smrg#include "gallivm/lp_bld_debug.h"
39b8e80941Smrg#include "gallivm/lp_bld_format.h"
40848b8605Smrg#include "lp_context.h"
41848b8605Smrg#include "lp_jit.h"
42848b8605Smrg
43848b8605Smrg
44848b8605Smrgstatic void
45848b8605Smrglp_jit_create_types(struct lp_fragment_shader_variant *lp)
46848b8605Smrg{
47848b8605Smrg   struct gallivm_state *gallivm = lp->gallivm;
48848b8605Smrg   LLVMContextRef lc = gallivm->context;
49848b8605Smrg   LLVMTypeRef viewport_type, texture_type, sampler_type;
50848b8605Smrg
51848b8605Smrg   /* struct lp_jit_viewport */
52848b8605Smrg   {
53848b8605Smrg      LLVMTypeRef elem_types[LP_JIT_VIEWPORT_NUM_FIELDS];
54848b8605Smrg
55848b8605Smrg      elem_types[LP_JIT_VIEWPORT_MIN_DEPTH] =
56848b8605Smrg      elem_types[LP_JIT_VIEWPORT_MAX_DEPTH] = LLVMFloatTypeInContext(lc);
57848b8605Smrg
58848b8605Smrg      viewport_type = LLVMStructTypeInContext(lc, elem_types,
59b8e80941Smrg                                              ARRAY_SIZE(elem_types), 0);
60848b8605Smrg
61848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_viewport, min_depth,
62848b8605Smrg                             gallivm->target, viewport_type,
63848b8605Smrg                             LP_JIT_VIEWPORT_MIN_DEPTH);
64848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_viewport, max_depth,
65848b8605Smrg                             gallivm->target, viewport_type,
66848b8605Smrg                             LP_JIT_VIEWPORT_MAX_DEPTH);
67848b8605Smrg      LP_CHECK_STRUCT_SIZE(struct lp_jit_viewport,
68848b8605Smrg                           gallivm->target, viewport_type);
69848b8605Smrg   }
70848b8605Smrg
71848b8605Smrg   /* struct lp_jit_texture */
72848b8605Smrg   {
73848b8605Smrg      LLVMTypeRef elem_types[LP_JIT_TEXTURE_NUM_FIELDS];
74848b8605Smrg
75848b8605Smrg      elem_types[LP_JIT_TEXTURE_WIDTH]  =
76848b8605Smrg      elem_types[LP_JIT_TEXTURE_HEIGHT] =
77848b8605Smrg      elem_types[LP_JIT_TEXTURE_DEPTH] =
78848b8605Smrg      elem_types[LP_JIT_TEXTURE_FIRST_LEVEL] =
79848b8605Smrg      elem_types[LP_JIT_TEXTURE_LAST_LEVEL] = LLVMInt32TypeInContext(lc);
80848b8605Smrg      elem_types[LP_JIT_TEXTURE_BASE] = LLVMPointerType(LLVMInt8TypeInContext(lc), 0);
81848b8605Smrg      elem_types[LP_JIT_TEXTURE_ROW_STRIDE] =
82848b8605Smrg      elem_types[LP_JIT_TEXTURE_IMG_STRIDE] =
83848b8605Smrg      elem_types[LP_JIT_TEXTURE_MIP_OFFSETS] =
84848b8605Smrg         LLVMArrayType(LLVMInt32TypeInContext(lc), LP_MAX_TEXTURE_LEVELS);
85848b8605Smrg
86848b8605Smrg      texture_type = LLVMStructTypeInContext(lc, elem_types,
87b8e80941Smrg                                             ARRAY_SIZE(elem_types), 0);
88848b8605Smrg
89848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, width,
90848b8605Smrg                             gallivm->target, texture_type,
91848b8605Smrg                             LP_JIT_TEXTURE_WIDTH);
92848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, height,
93848b8605Smrg                             gallivm->target, texture_type,
94848b8605Smrg                             LP_JIT_TEXTURE_HEIGHT);
95848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, depth,
96848b8605Smrg                             gallivm->target, texture_type,
97848b8605Smrg                             LP_JIT_TEXTURE_DEPTH);
98848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, first_level,
99848b8605Smrg                             gallivm->target, texture_type,
100848b8605Smrg                             LP_JIT_TEXTURE_FIRST_LEVEL);
101848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, last_level,
102848b8605Smrg                             gallivm->target, texture_type,
103848b8605Smrg                             LP_JIT_TEXTURE_LAST_LEVEL);
104848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, base,
105848b8605Smrg                             gallivm->target, texture_type,
106848b8605Smrg                             LP_JIT_TEXTURE_BASE);
107848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, row_stride,
108848b8605Smrg                             gallivm->target, texture_type,
109848b8605Smrg                             LP_JIT_TEXTURE_ROW_STRIDE);
110848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, img_stride,
111848b8605Smrg                             gallivm->target, texture_type,
112848b8605Smrg                             LP_JIT_TEXTURE_IMG_STRIDE);
113848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, mip_offsets,
114848b8605Smrg                             gallivm->target, texture_type,
115848b8605Smrg                             LP_JIT_TEXTURE_MIP_OFFSETS);
116848b8605Smrg      LP_CHECK_STRUCT_SIZE(struct lp_jit_texture,
117848b8605Smrg                           gallivm->target, texture_type);
118848b8605Smrg   }
119848b8605Smrg
120848b8605Smrg   /* struct lp_jit_sampler */
121848b8605Smrg   {
122848b8605Smrg      LLVMTypeRef elem_types[LP_JIT_SAMPLER_NUM_FIELDS];
123848b8605Smrg      elem_types[LP_JIT_SAMPLER_MIN_LOD] =
124848b8605Smrg      elem_types[LP_JIT_SAMPLER_MAX_LOD] =
125848b8605Smrg      elem_types[LP_JIT_SAMPLER_LOD_BIAS] = LLVMFloatTypeInContext(lc);
126848b8605Smrg      elem_types[LP_JIT_SAMPLER_BORDER_COLOR] =
127848b8605Smrg         LLVMArrayType(LLVMFloatTypeInContext(lc), 4);
128848b8605Smrg
129848b8605Smrg      sampler_type = LLVMStructTypeInContext(lc, elem_types,
130b8e80941Smrg                                             ARRAY_SIZE(elem_types), 0);
131848b8605Smrg
132848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_sampler, min_lod,
133848b8605Smrg                             gallivm->target, sampler_type,
134848b8605Smrg                             LP_JIT_SAMPLER_MIN_LOD);
135848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_sampler, max_lod,
136848b8605Smrg                             gallivm->target, sampler_type,
137848b8605Smrg                             LP_JIT_SAMPLER_MAX_LOD);
138848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_sampler, lod_bias,
139848b8605Smrg                             gallivm->target, sampler_type,
140848b8605Smrg                             LP_JIT_SAMPLER_LOD_BIAS);
141848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_sampler, border_color,
142848b8605Smrg                             gallivm->target, sampler_type,
143848b8605Smrg                             LP_JIT_SAMPLER_BORDER_COLOR);
144848b8605Smrg      LP_CHECK_STRUCT_SIZE(struct lp_jit_sampler,
145848b8605Smrg                           gallivm->target, sampler_type);
146848b8605Smrg   }
147848b8605Smrg
148848b8605Smrg   /* struct lp_jit_context */
149848b8605Smrg   {
150848b8605Smrg      LLVMTypeRef elem_types[LP_JIT_CTX_COUNT];
151848b8605Smrg      LLVMTypeRef context_type;
152848b8605Smrg
153848b8605Smrg      elem_types[LP_JIT_CTX_CONSTANTS] =
154848b8605Smrg         LLVMArrayType(LLVMPointerType(LLVMFloatTypeInContext(lc), 0), LP_MAX_TGSI_CONST_BUFFERS);
155848b8605Smrg      elem_types[LP_JIT_CTX_NUM_CONSTANTS] =
156848b8605Smrg            LLVMArrayType(LLVMInt32TypeInContext(lc), LP_MAX_TGSI_CONST_BUFFERS);
157848b8605Smrg      elem_types[LP_JIT_CTX_ALPHA_REF] = LLVMFloatTypeInContext(lc);
158848b8605Smrg      elem_types[LP_JIT_CTX_STENCIL_REF_FRONT] =
159848b8605Smrg      elem_types[LP_JIT_CTX_STENCIL_REF_BACK] = LLVMInt32TypeInContext(lc);
160848b8605Smrg      elem_types[LP_JIT_CTX_U8_BLEND_COLOR] = LLVMPointerType(LLVMInt8TypeInContext(lc), 0);
161848b8605Smrg      elem_types[LP_JIT_CTX_F_BLEND_COLOR] = LLVMPointerType(LLVMFloatTypeInContext(lc), 0);
162848b8605Smrg      elem_types[LP_JIT_CTX_VIEWPORTS] = LLVMPointerType(viewport_type, 0);
163848b8605Smrg      elem_types[LP_JIT_CTX_TEXTURES] = LLVMArrayType(texture_type,
164848b8605Smrg                                                      PIPE_MAX_SHADER_SAMPLER_VIEWS);
165848b8605Smrg      elem_types[LP_JIT_CTX_SAMPLERS] = LLVMArrayType(sampler_type,
166848b8605Smrg                                                      PIPE_MAX_SAMPLERS);
167848b8605Smrg
168848b8605Smrg      context_type = LLVMStructTypeInContext(lc, elem_types,
169b8e80941Smrg                                             ARRAY_SIZE(elem_types), 0);
170848b8605Smrg
171848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, constants,
172848b8605Smrg                             gallivm->target, context_type,
173848b8605Smrg                             LP_JIT_CTX_CONSTANTS);
174848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, num_constants,
175848b8605Smrg                             gallivm->target, context_type,
176848b8605Smrg                             LP_JIT_CTX_NUM_CONSTANTS);
177848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, alpha_ref_value,
178848b8605Smrg                             gallivm->target, context_type,
179848b8605Smrg                             LP_JIT_CTX_ALPHA_REF);
180848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, stencil_ref_front,
181848b8605Smrg                             gallivm->target, context_type,
182848b8605Smrg                             LP_JIT_CTX_STENCIL_REF_FRONT);
183848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, stencil_ref_back,
184848b8605Smrg                             gallivm->target, context_type,
185848b8605Smrg                             LP_JIT_CTX_STENCIL_REF_BACK);
186848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, u8_blend_color,
187848b8605Smrg                             gallivm->target, context_type,
188848b8605Smrg                             LP_JIT_CTX_U8_BLEND_COLOR);
189848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, f_blend_color,
190848b8605Smrg                             gallivm->target, context_type,
191848b8605Smrg                             LP_JIT_CTX_F_BLEND_COLOR);
192848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, viewports,
193848b8605Smrg                             gallivm->target, context_type,
194848b8605Smrg                             LP_JIT_CTX_VIEWPORTS);
195848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, textures,
196848b8605Smrg                             gallivm->target, context_type,
197848b8605Smrg                             LP_JIT_CTX_TEXTURES);
198848b8605Smrg      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, samplers,
199848b8605Smrg                             gallivm->target, context_type,
200848b8605Smrg                             LP_JIT_CTX_SAMPLERS);
201848b8605Smrg      LP_CHECK_STRUCT_SIZE(struct lp_jit_context,
202848b8605Smrg                           gallivm->target, context_type);
203848b8605Smrg
204848b8605Smrg      lp->jit_context_ptr_type = LLVMPointerType(context_type, 0);
205848b8605Smrg   }
206848b8605Smrg
207848b8605Smrg   /* struct lp_jit_thread_data */
208848b8605Smrg   {
209848b8605Smrg      LLVMTypeRef elem_types[LP_JIT_THREAD_DATA_COUNT];
210848b8605Smrg      LLVMTypeRef thread_data_type;
211848b8605Smrg
212b8e80941Smrg      elem_types[LP_JIT_THREAD_DATA_CACHE] =
213b8e80941Smrg            LLVMPointerType(lp_build_format_cache_type(gallivm), 0);
214848b8605Smrg      elem_types[LP_JIT_THREAD_DATA_COUNTER] = LLVMInt64TypeInContext(lc);
215b8e80941Smrg      elem_types[LP_JIT_THREAD_DATA_INVOCATIONS] = LLVMInt64TypeInContext(lc);
216848b8605Smrg      elem_types[LP_JIT_THREAD_DATA_RASTER_STATE_VIEWPORT_INDEX] =
217848b8605Smrg            LLVMInt32TypeInContext(lc);
218848b8605Smrg
219848b8605Smrg      thread_data_type = LLVMStructTypeInContext(lc, elem_types,
220b8e80941Smrg                                                 ARRAY_SIZE(elem_types), 0);
221848b8605Smrg
222848b8605Smrg      lp->jit_thread_data_ptr_type = LLVMPointerType(thread_data_type, 0);
223848b8605Smrg   }
224848b8605Smrg
225848b8605Smrg   if (gallivm_debug & GALLIVM_DEBUG_IR) {
226b8e80941Smrg#if HAVE_LLVM >= 0x304
227b8e80941Smrg      char *str = LLVMPrintModuleToString(gallivm->module);
228b8e80941Smrg      fprintf(stderr, "%s", str);
229b8e80941Smrg      LLVMDisposeMessage(str);
230b8e80941Smrg#else
231848b8605Smrg      LLVMDumpModule(gallivm->module);
232b8e80941Smrg#endif
233848b8605Smrg   }
234848b8605Smrg}
235848b8605Smrg
236848b8605Smrg
237848b8605Smrgvoid
238848b8605Smrglp_jit_screen_cleanup(struct llvmpipe_screen *screen)
239848b8605Smrg{
240848b8605Smrg   /* nothing */
241848b8605Smrg}
242848b8605Smrg
243848b8605Smrg
244b8e80941Smrgboolean
245848b8605Smrglp_jit_screen_init(struct llvmpipe_screen *screen)
246848b8605Smrg{
247b8e80941Smrg   return lp_build_init();
248848b8605Smrg}
249848b8605Smrg
250848b8605Smrg
251848b8605Smrgvoid
252848b8605Smrglp_jit_init_types(struct lp_fragment_shader_variant *lp)
253848b8605Smrg{
254848b8605Smrg   if (!lp->jit_context_ptr_type)
255848b8605Smrg      lp_jit_create_types(lp);
256848b8605Smrg}
257