108dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca/**************************************************************************
208dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca *
308dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * Copyright 2009 VMware, Inc.
408dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * All Rights Reserved.
508dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca *
608dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
708dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * copy of this software and associated documentation files (the
808dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * "Software"), to deal in the Software without restriction, including
908dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
1008dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
1108dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * permit persons to whom the Software is furnished to do so, subject to
1208dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * the following conditions:
1308dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca *
1408dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * The above copyright notice and this permission notice (including the
1508dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * next paragraph) shall be included in all copies or substantial portions
1608dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * of the Software.
1708dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca *
1808dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1908dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2008dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2108dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
2208dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2308dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2408dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2508dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca *
2608dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca **************************************************************************/
2708dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca
2808dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca/**
2908dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * @file
3008dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * C - JIT interfaces
3108dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca *
3208dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
3308dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca */
3408dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca
3508dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca#ifndef LP_JIT_H
3608dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca#define LP_JIT_H
3708dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca
3808dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca
39c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_struct.h"
4008dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca
41e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca#include "pipe/p_state.h"
42f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul#include "lp_texture.h"
43e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
4408dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca
453469715a8a171512cf9b528702e70393f01c6041José Fonsecastruct lp_fragment_shader_variant;
4608dd41fd6899bd6b3289d30dc31f8b2998406889José Fonsecastruct llvmpipe_screen;
4708dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca
4808dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca
49e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecastruct lp_jit_texture
50e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca{
51e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   uint32_t width;
52e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   uint32_t height;
53b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul   uint32_t depth;
5408070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler   uint32_t first_level;
55b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul   uint32_t last_level;
560639765b2850739af1678f10fc0c5706d5827776Brian Paul   uint32_t row_stride[LP_MAX_TEXTURE_LEVELS];
57f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul   uint32_t img_stride[LP_MAX_TEXTURE_LEVELS];
580639765b2850739af1678f10fc0c5706d5827776Brian Paul   const void *data[LP_MAX_TEXTURE_LEVELS];
5961b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul   /* sampler state, actually */
6061b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul   float min_lod;
6161b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul   float max_lod;
6261b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul   float lod_bias;
63d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul   float border_color[4];
64e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca};
65e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
66e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
67e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecaenum {
68e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   LP_JIT_TEXTURE_WIDTH = 0,
69e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   LP_JIT_TEXTURE_HEIGHT,
70b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul   LP_JIT_TEXTURE_DEPTH,
7108070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler   LP_JIT_TEXTURE_FIRST_LEVEL,
72b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul   LP_JIT_TEXTURE_LAST_LEVEL,
7353efb634a0c134feebb5a3e47fc33660694be9c3Brian Paul   LP_JIT_TEXTURE_ROW_STRIDE,
74f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul   LP_JIT_TEXTURE_IMG_STRIDE,
75f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul   LP_JIT_TEXTURE_DATA,
7661b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul   LP_JIT_TEXTURE_MIN_LOD,
7761b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul   LP_JIT_TEXTURE_MAX_LOD,
7861b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul   LP_JIT_TEXTURE_LOD_BIAS,
79d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul   LP_JIT_TEXTURE_BORDER_COLOR,
80f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul   LP_JIT_TEXTURE_NUM_FIELDS  /* number of fields above */
81e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca};
82e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
83e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
84e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
85c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca/**
86c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca * This structure is passed directly to the generated fragment shader.
87c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca *
88c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca * It contains the derived state.
89c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca *
90c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca * Changes here must be reflected in the lp_jit_context_* macros and
91c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca * lp_jit_init_types function. Changes to the ordering should be avoided.
92c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca *
93c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca * Only use types with a clear size and padding here, in particular prefer the
94c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca * stdint.h types to the basic integer types.
95c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca */
96c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonsecastruct lp_jit_context
97c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca{
98c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca   const float *constants;
99c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca
100635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca   float alpha_ref_value;
101635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca
102521c61ff017ab15b829abbe9a98b179136a36009Brian Paul   uint32_t stencil_ref_front, stencil_ref_back;
103eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul
1041fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca   /* FIXME: store (also?) in floats */
105635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca   uint8_t *blend_color;
106e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
107e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   struct lp_jit_texture textures[PIPE_MAX_SAMPLERS];
108c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca};
109c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca
110c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca
111b8b1bb946f0bc7d1646e0625c239e08ac60b4fc7Brian Paul/**
112b8b1bb946f0bc7d1646e0625c239e08ac60b4fc7Brian Paul * These enum values must match the position of the fields in the
113b8b1bb946f0bc7d1646e0625c239e08ac60b4fc7Brian Paul * lp_jit_context struct above.
114b8b1bb946f0bc7d1646e0625c239e08ac60b4fc7Brian Paul */
115b8b1bb946f0bc7d1646e0625c239e08ac60b4fc7Brian Paulenum {
116b8b1bb946f0bc7d1646e0625c239e08ac60b4fc7Brian Paul   LP_JIT_CTX_CONSTANTS = 0,
117b8b1bb946f0bc7d1646e0625c239e08ac60b4fc7Brian Paul   LP_JIT_CTX_ALPHA_REF,
118521c61ff017ab15b829abbe9a98b179136a36009Brian Paul   LP_JIT_CTX_STENCIL_REF_FRONT,
119521c61ff017ab15b829abbe9a98b179136a36009Brian Paul   LP_JIT_CTX_STENCIL_REF_BACK,
120b8b1bb946f0bc7d1646e0625c239e08ac60b4fc7Brian Paul   LP_JIT_CTX_BLEND_COLOR,
121b8b1bb946f0bc7d1646e0625c239e08ac60b4fc7Brian Paul   LP_JIT_CTX_TEXTURES,
122b8b1bb946f0bc7d1646e0625c239e08ac60b4fc7Brian Paul   LP_JIT_CTX_COUNT
123b8b1bb946f0bc7d1646e0625c239e08ac60b4fc7Brian Paul};
124b8b1bb946f0bc7d1646e0625c239e08ac60b4fc7Brian Paul
125b8b1bb946f0bc7d1646e0625c239e08ac60b4fc7Brian Paul
126efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define lp_jit_context_constants(_gallivm, _ptr) \
127efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_struct_get(_gallivm, _ptr, LP_JIT_CTX_CONSTANTS, "constants")
128c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca
129efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define lp_jit_context_alpha_ref_value(_gallivm, _ptr) \
130efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_struct_get(_gallivm, _ptr, LP_JIT_CTX_ALPHA_REF, "alpha_ref_value")
131635c37e118bbf51fc8c93a2c999281ee817a93e1José Fonseca
132efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define lp_jit_context_stencil_ref_front_value(_gallivm, _ptr) \
133efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_struct_get(_gallivm, _ptr, LP_JIT_CTX_STENCIL_REF_FRONT, "stencil_ref_front")
134521c61ff017ab15b829abbe9a98b179136a36009Brian Paul
135efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define lp_jit_context_stencil_ref_back_value(_gallivm, _ptr) \
136efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_struct_get(_gallivm, _ptr, LP_JIT_CTX_STENCIL_REF_BACK, "stencil_ref_back")
137eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul
138efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define lp_jit_context_blend_color(_gallivm, _ptr) \
139efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_struct_get(_gallivm, _ptr, LP_JIT_CTX_BLEND_COLOR, "blend_color")
140e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
141efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#define lp_jit_context_textures(_gallivm, _ptr) \
142efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_struct_get_ptr(_gallivm, _ptr, LP_JIT_CTX_TEXTURES, "textures")
14386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li
144e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
145c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca
14608dd41fd6899bd6b3289d30dc31f8b2998406889José Fonsecatypedef void
147921584181eb2f3b2849d150295dfce1dae25dd11José Fonseca(*lp_jit_frag_func)(const struct lp_jit_context *context,
148c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca                    uint32_t x,
14908dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca                    uint32_t y,
1500a1c9001037a13b69b157994e7983aa3dee158d3Keith Whitwell                    uint32_t facing,
15108dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca                    const void *a0,
15208dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca                    const void *dadx,
15308dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca                    const void *dady,
154c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell                    uint8_t **color,
155ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul                    void *depth,
156d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell                    uint32_t mask,
15786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li                    uint32_t *counter);
15808dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca
159c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca
16008dd41fd6899bd6b3289d30dc31f8b2998406889José Fonsecavoid
16108dd41fd6899bd6b3289d30dc31f8b2998406889José Fonsecalp_jit_screen_cleanup(struct llvmpipe_screen *screen);
16208dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca
16308dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca
16408dd41fd6899bd6b3289d30dc31f8b2998406889José Fonsecavoid
16508dd41fd6899bd6b3289d30dc31f8b2998406889José Fonsecalp_jit_screen_init(struct llvmpipe_screen *screen);
16608dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca
16708dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca
1683469715a8a171512cf9b528702e70393f01c6041José Fonsecavoid
1693469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_jit_init_types(struct lp_fragment_shader_variant *lp);
170efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
171efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
17208dd41fd6899bd6b3289d30dc31f8b2998406889José Fonseca#endif /* LP_JIT_H */
173