Path: blob/21.2-virgl/src/gallium/drivers/llvmpipe/lp_jit.c
4570 views
/**************************************************************************1*2* Copyright 2009 VMware, Inc.3* All Rights Reserved.4*5* Permission is hereby granted, free of charge, to any person obtaining a6* copy of this software and associated documentation files (the7* "Software"), to deal in the Software without restriction, including8* without limitation the rights to use, copy, modify, merge, publish,9* distribute, sub license, and/or sell copies of the Software, and to10* permit persons to whom the Software is furnished to do so, subject to11* the following conditions:12*13* The above copyright notice and this permission notice (including the14* next paragraph) shall be included in all copies or substantial portions15* of the Software.16*17* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS18* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.20* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR21* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,22* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE23* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.24*25**************************************************************************/2627/**28* @file29* C - JIT interfaces30*31* @author Jose Fonseca <[email protected]>32*/3334#include <llvm/Config/llvm-config.h>3536#include "util/u_memory.h"37#include "gallivm/lp_bld_init.h"38#include "gallivm/lp_bld_debug.h"39#include "gallivm/lp_bld_format.h"40#include "lp_context.h"41#include "lp_jit.h"4243static LLVMTypeRef44create_jit_texture_type(struct gallivm_state *gallivm)45{46LLVMContextRef lc = gallivm->context;47LLVMTypeRef texture_type;48LLVMTypeRef elem_types[LP_JIT_TEXTURE_NUM_FIELDS];4950/* struct lp_jit_texture */51elem_types[LP_JIT_TEXTURE_WIDTH] =52elem_types[LP_JIT_TEXTURE_HEIGHT] =53elem_types[LP_JIT_TEXTURE_DEPTH] =54elem_types[LP_JIT_TEXTURE_NUM_SAMPLES] =55elem_types[LP_JIT_TEXTURE_SAMPLE_STRIDE] =56elem_types[LP_JIT_TEXTURE_FIRST_LEVEL] =57elem_types[LP_JIT_TEXTURE_LAST_LEVEL] = LLVMInt32TypeInContext(lc);58elem_types[LP_JIT_TEXTURE_BASE] = LLVMPointerType(LLVMInt8TypeInContext(lc), 0);59elem_types[LP_JIT_TEXTURE_ROW_STRIDE] =60elem_types[LP_JIT_TEXTURE_IMG_STRIDE] =61elem_types[LP_JIT_TEXTURE_MIP_OFFSETS] =62LLVMArrayType(LLVMInt32TypeInContext(lc), LP_MAX_TEXTURE_LEVELS);6364texture_type = LLVMStructTypeInContext(lc, elem_types,65ARRAY_SIZE(elem_types), 0);6667LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, width,68gallivm->target, texture_type,69LP_JIT_TEXTURE_WIDTH);70LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, height,71gallivm->target, texture_type,72LP_JIT_TEXTURE_HEIGHT);73LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, depth,74gallivm->target, texture_type,75LP_JIT_TEXTURE_DEPTH);76LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, base,77gallivm->target, texture_type,78LP_JIT_TEXTURE_BASE);79LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, row_stride,80gallivm->target, texture_type,81LP_JIT_TEXTURE_ROW_STRIDE);82LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, img_stride,83gallivm->target, texture_type,84LP_JIT_TEXTURE_IMG_STRIDE);85LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, first_level,86gallivm->target, texture_type,87LP_JIT_TEXTURE_FIRST_LEVEL);88LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, last_level,89gallivm->target, texture_type,90LP_JIT_TEXTURE_LAST_LEVEL);91LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, mip_offsets,92gallivm->target, texture_type,93LP_JIT_TEXTURE_MIP_OFFSETS);94LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, num_samples,95gallivm->target, texture_type,96LP_JIT_TEXTURE_NUM_SAMPLES);97LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, sample_stride,98gallivm->target, texture_type,99LP_JIT_TEXTURE_SAMPLE_STRIDE);100LP_CHECK_STRUCT_SIZE(struct lp_jit_texture,101gallivm->target, texture_type);102return texture_type;103}104105static LLVMTypeRef106create_jit_sampler_type(struct gallivm_state *gallivm)107{108LLVMContextRef lc = gallivm->context;109LLVMTypeRef sampler_type;110LLVMTypeRef elem_types[LP_JIT_SAMPLER_NUM_FIELDS];111elem_types[LP_JIT_SAMPLER_MIN_LOD] =112elem_types[LP_JIT_SAMPLER_MAX_LOD] =113elem_types[LP_JIT_SAMPLER_LOD_BIAS] = LLVMFloatTypeInContext(lc);114elem_types[LP_JIT_SAMPLER_BORDER_COLOR] =115LLVMArrayType(LLVMFloatTypeInContext(lc), 4);116117sampler_type = LLVMStructTypeInContext(lc, elem_types,118ARRAY_SIZE(elem_types), 0);119120LP_CHECK_MEMBER_OFFSET(struct lp_jit_sampler, min_lod,121gallivm->target, sampler_type,122LP_JIT_SAMPLER_MIN_LOD);123LP_CHECK_MEMBER_OFFSET(struct lp_jit_sampler, max_lod,124gallivm->target, sampler_type,125LP_JIT_SAMPLER_MAX_LOD);126LP_CHECK_MEMBER_OFFSET(struct lp_jit_sampler, lod_bias,127gallivm->target, sampler_type,128LP_JIT_SAMPLER_LOD_BIAS);129LP_CHECK_MEMBER_OFFSET(struct lp_jit_sampler, border_color,130gallivm->target, sampler_type,131LP_JIT_SAMPLER_BORDER_COLOR);132LP_CHECK_STRUCT_SIZE(struct lp_jit_sampler,133gallivm->target, sampler_type);134return sampler_type;135}136137static LLVMTypeRef138create_jit_image_type(struct gallivm_state *gallivm)139{140LLVMContextRef lc = gallivm->context;141LLVMTypeRef image_type;142LLVMTypeRef elem_types[LP_JIT_IMAGE_NUM_FIELDS];143elem_types[LP_JIT_IMAGE_WIDTH] =144elem_types[LP_JIT_IMAGE_HEIGHT] =145elem_types[LP_JIT_IMAGE_DEPTH] = LLVMInt32TypeInContext(lc);146elem_types[LP_JIT_IMAGE_BASE] = LLVMPointerType(LLVMInt8TypeInContext(lc), 0);147elem_types[LP_JIT_IMAGE_ROW_STRIDE] =148elem_types[LP_JIT_IMAGE_IMG_STRIDE] =149elem_types[LP_JIT_IMAGE_NUM_SAMPLES] =150elem_types[LP_JIT_IMAGE_SAMPLE_STRIDE] = LLVMInt32TypeInContext(lc);151152image_type = LLVMStructTypeInContext(lc, elem_types,153ARRAY_SIZE(elem_types), 0);154LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, width,155gallivm->target, image_type,156LP_JIT_IMAGE_WIDTH);157LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, height,158gallivm->target, image_type,159LP_JIT_IMAGE_HEIGHT);160LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, depth,161gallivm->target, image_type,162LP_JIT_IMAGE_DEPTH);163LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, base,164gallivm->target, image_type,165LP_JIT_IMAGE_BASE);166LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, row_stride,167gallivm->target, image_type,168LP_JIT_IMAGE_ROW_STRIDE);169LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, img_stride,170gallivm->target, image_type,171LP_JIT_IMAGE_IMG_STRIDE);172LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, num_samples,173gallivm->target, image_type,174LP_JIT_IMAGE_NUM_SAMPLES);175LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, sample_stride,176gallivm->target, image_type,177LP_JIT_IMAGE_SAMPLE_STRIDE);178return image_type;179}180181static void182lp_jit_create_types(struct lp_fragment_shader_variant *lp)183{184struct gallivm_state *gallivm = lp->gallivm;185LLVMContextRef lc = gallivm->context;186LLVMTypeRef viewport_type, texture_type, sampler_type, image_type;187188/* struct lp_jit_viewport */189{190LLVMTypeRef elem_types[LP_JIT_VIEWPORT_NUM_FIELDS];191192elem_types[LP_JIT_VIEWPORT_MIN_DEPTH] =193elem_types[LP_JIT_VIEWPORT_MAX_DEPTH] = LLVMFloatTypeInContext(lc);194195viewport_type = LLVMStructTypeInContext(lc, elem_types,196ARRAY_SIZE(elem_types), 0);197198LP_CHECK_MEMBER_OFFSET(struct lp_jit_viewport, min_depth,199gallivm->target, viewport_type,200LP_JIT_VIEWPORT_MIN_DEPTH);201LP_CHECK_MEMBER_OFFSET(struct lp_jit_viewport, max_depth,202gallivm->target, viewport_type,203LP_JIT_VIEWPORT_MAX_DEPTH);204LP_CHECK_STRUCT_SIZE(struct lp_jit_viewport,205gallivm->target, viewport_type);206}207208texture_type = create_jit_texture_type(gallivm);209sampler_type = create_jit_sampler_type(gallivm);210image_type = create_jit_image_type(gallivm);211212/* struct lp_jit_context */213{214LLVMTypeRef elem_types[LP_JIT_CTX_COUNT];215LLVMTypeRef context_type;216217elem_types[LP_JIT_CTX_CONSTANTS] =218LLVMArrayType(LLVMPointerType(LLVMFloatTypeInContext(lc), 0), LP_MAX_TGSI_CONST_BUFFERS);219elem_types[LP_JIT_CTX_NUM_CONSTANTS] =220LLVMArrayType(LLVMInt32TypeInContext(lc), LP_MAX_TGSI_CONST_BUFFERS);221elem_types[LP_JIT_CTX_TEXTURES] = LLVMArrayType(texture_type,222PIPE_MAX_SHADER_SAMPLER_VIEWS);223elem_types[LP_JIT_CTX_SAMPLERS] = LLVMArrayType(sampler_type,224PIPE_MAX_SAMPLERS);225elem_types[LP_JIT_CTX_IMAGES] = LLVMArrayType(image_type,226PIPE_MAX_SHADER_IMAGES);227elem_types[LP_JIT_CTX_ALPHA_REF] = LLVMFloatTypeInContext(lc);228elem_types[LP_JIT_CTX_SAMPLE_MASK] =229elem_types[LP_JIT_CTX_STENCIL_REF_FRONT] =230elem_types[LP_JIT_CTX_STENCIL_REF_BACK] = LLVMInt32TypeInContext(lc);231elem_types[LP_JIT_CTX_U8_BLEND_COLOR] = LLVMPointerType(LLVMInt8TypeInContext(lc), 0);232elem_types[LP_JIT_CTX_F_BLEND_COLOR] = LLVMPointerType(LLVMFloatTypeInContext(lc), 0);233elem_types[LP_JIT_CTX_VIEWPORTS] = LLVMPointerType(viewport_type, 0);234elem_types[LP_JIT_CTX_SSBOS] =235LLVMArrayType(LLVMPointerType(LLVMInt32TypeInContext(lc), 0), LP_MAX_TGSI_SHADER_BUFFERS);236elem_types[LP_JIT_CTX_NUM_SSBOS] =237LLVMArrayType(LLVMInt32TypeInContext(lc), LP_MAX_TGSI_SHADER_BUFFERS);238context_type = LLVMStructTypeInContext(lc, elem_types,239ARRAY_SIZE(elem_types), 0);240241LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, constants,242gallivm->target, context_type,243LP_JIT_CTX_CONSTANTS);244LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, num_constants,245gallivm->target, context_type,246LP_JIT_CTX_NUM_CONSTANTS);247LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, textures,248gallivm->target, context_type,249LP_JIT_CTX_TEXTURES);250LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, samplers,251gallivm->target, context_type,252LP_JIT_CTX_SAMPLERS);253LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, images,254gallivm->target, context_type,255LP_JIT_CTX_IMAGES);256LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, alpha_ref_value,257gallivm->target, context_type,258LP_JIT_CTX_ALPHA_REF);259LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, stencil_ref_front,260gallivm->target, context_type,261LP_JIT_CTX_STENCIL_REF_FRONT);262LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, stencil_ref_back,263gallivm->target, context_type,264LP_JIT_CTX_STENCIL_REF_BACK);265LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, u8_blend_color,266gallivm->target, context_type,267LP_JIT_CTX_U8_BLEND_COLOR);268LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, f_blend_color,269gallivm->target, context_type,270LP_JIT_CTX_F_BLEND_COLOR);271LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, viewports,272gallivm->target, context_type,273LP_JIT_CTX_VIEWPORTS);274LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, ssbos,275gallivm->target, context_type,276LP_JIT_CTX_SSBOS);277LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, num_ssbos,278gallivm->target, context_type,279LP_JIT_CTX_NUM_SSBOS);280LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, sample_mask,281gallivm->target, context_type,282LP_JIT_CTX_SAMPLE_MASK);283LP_CHECK_STRUCT_SIZE(struct lp_jit_context,284gallivm->target, context_type);285286lp->jit_context_ptr_type = LLVMPointerType(context_type, 0);287}288289/* struct lp_jit_thread_data */290{291LLVMTypeRef elem_types[LP_JIT_THREAD_DATA_COUNT];292LLVMTypeRef thread_data_type;293294elem_types[LP_JIT_THREAD_DATA_CACHE] =295LLVMPointerType(lp_build_format_cache_type(gallivm), 0);296elem_types[LP_JIT_THREAD_DATA_COUNTER] = LLVMInt64TypeInContext(lc);297elem_types[LP_JIT_THREAD_DATA_INVOCATIONS] = LLVMInt64TypeInContext(lc);298elem_types[LP_JIT_THREAD_DATA_RASTER_STATE_VIEWPORT_INDEX] =299elem_types[LP_JIT_THREAD_DATA_RASTER_STATE_VIEW_INDEX] =300LLVMInt32TypeInContext(lc);301302thread_data_type = LLVMStructTypeInContext(lc, elem_types,303ARRAY_SIZE(elem_types), 0);304305lp->jit_thread_data_ptr_type = LLVMPointerType(thread_data_type, 0);306}307308if (gallivm_debug & GALLIVM_DEBUG_IR) {309char *str = LLVMPrintModuleToString(gallivm->module);310fprintf(stderr, "%s", str);311LLVMDisposeMessage(str);312}313}314315316void317lp_jit_screen_cleanup(struct llvmpipe_screen *screen)318{319/* nothing */320}321322323boolean324lp_jit_screen_init(struct llvmpipe_screen *screen)325{326return lp_build_init();327}328329330void331lp_jit_init_types(struct lp_fragment_shader_variant *lp)332{333if (!lp->jit_context_ptr_type)334lp_jit_create_types(lp);335}336337static void338lp_jit_create_cs_types(struct lp_compute_shader_variant *lp)339{340struct gallivm_state *gallivm = lp->gallivm;341LLVMContextRef lc = gallivm->context;342LLVMTypeRef texture_type, sampler_type, image_type;343344texture_type = create_jit_texture_type(gallivm);345sampler_type = create_jit_sampler_type(gallivm);346image_type = create_jit_image_type(gallivm);347348/* struct lp_jit_cs_thread_data */349{350LLVMTypeRef elem_types[LP_JIT_CS_THREAD_DATA_COUNT];351LLVMTypeRef thread_data_type;352353elem_types[LP_JIT_CS_THREAD_DATA_CACHE] =354LLVMPointerType(lp_build_format_cache_type(gallivm), 0);355356elem_types[LP_JIT_CS_THREAD_DATA_SHARED] = LLVMPointerType(LLVMInt32TypeInContext(lc), 0);357thread_data_type = LLVMStructTypeInContext(lc, elem_types,358ARRAY_SIZE(elem_types), 0);359360lp->jit_cs_thread_data_ptr_type = LLVMPointerType(thread_data_type, 0);361}362363/* struct lp_jit_cs_context */364{365LLVMTypeRef elem_types[LP_JIT_CS_CTX_COUNT];366LLVMTypeRef cs_context_type;367368elem_types[LP_JIT_CS_CTX_CONSTANTS] =369LLVMArrayType(LLVMPointerType(LLVMFloatTypeInContext(lc), 0), LP_MAX_TGSI_CONST_BUFFERS);370elem_types[LP_JIT_CS_CTX_NUM_CONSTANTS] =371LLVMArrayType(LLVMInt32TypeInContext(lc), LP_MAX_TGSI_CONST_BUFFERS);372elem_types[LP_JIT_CS_CTX_TEXTURES] = LLVMArrayType(texture_type,373PIPE_MAX_SHADER_SAMPLER_VIEWS);374elem_types[LP_JIT_CS_CTX_SAMPLERS] = LLVMArrayType(sampler_type,375PIPE_MAX_SAMPLERS);376elem_types[LP_JIT_CS_CTX_IMAGES] = LLVMArrayType(image_type,377PIPE_MAX_SHADER_IMAGES);378elem_types[LP_JIT_CS_CTX_SSBOS] =379LLVMArrayType(LLVMPointerType(LLVMInt32TypeInContext(lc), 0), LP_MAX_TGSI_SHADER_BUFFERS);380elem_types[LP_JIT_CS_CTX_NUM_SSBOS] =381LLVMArrayType(LLVMInt32TypeInContext(lc), LP_MAX_TGSI_SHADER_BUFFERS);382383elem_types[LP_JIT_CS_CTX_SHARED_SIZE] = LLVMInt32TypeInContext(lc);384385elem_types[LP_JIT_CS_CTX_KERNEL_ARGS] = LLVMPointerType(LLVMInt8TypeInContext(lc), 0);386387cs_context_type = LLVMStructTypeInContext(lc, elem_types,388ARRAY_SIZE(elem_types), 0);389390LP_CHECK_MEMBER_OFFSET(struct lp_jit_cs_context, constants,391gallivm->target, cs_context_type,392LP_JIT_CS_CTX_CONSTANTS);393LP_CHECK_MEMBER_OFFSET(struct lp_jit_cs_context, num_constants,394gallivm->target, cs_context_type,395LP_JIT_CS_CTX_NUM_CONSTANTS);396LP_CHECK_MEMBER_OFFSET(struct lp_jit_cs_context, textures,397gallivm->target, cs_context_type,398LP_JIT_CS_CTX_TEXTURES);399LP_CHECK_MEMBER_OFFSET(struct lp_jit_cs_context, samplers,400gallivm->target, cs_context_type,401LP_JIT_CS_CTX_SAMPLERS);402LP_CHECK_MEMBER_OFFSET(struct lp_jit_cs_context, images,403gallivm->target, cs_context_type,404LP_JIT_CS_CTX_IMAGES);405LP_CHECK_MEMBER_OFFSET(struct lp_jit_cs_context, ssbos,406gallivm->target, cs_context_type,407LP_JIT_CS_CTX_SSBOS);408LP_CHECK_MEMBER_OFFSET(struct lp_jit_cs_context, num_ssbos,409gallivm->target, cs_context_type,410LP_JIT_CS_CTX_NUM_SSBOS);411LP_CHECK_MEMBER_OFFSET(struct lp_jit_cs_context, shared_size,412gallivm->target, cs_context_type,413LP_JIT_CS_CTX_SHARED_SIZE);414LP_CHECK_MEMBER_OFFSET(struct lp_jit_cs_context, kernel_args,415gallivm->target, cs_context_type,416LP_JIT_CS_CTX_KERNEL_ARGS);417LP_CHECK_STRUCT_SIZE(struct lp_jit_cs_context,418gallivm->target, cs_context_type);419420lp->jit_cs_context_ptr_type = LLVMPointerType(cs_context_type, 0);421}422423if (gallivm_debug & GALLIVM_DEBUG_IR) {424char *str = LLVMPrintModuleToString(gallivm->module);425fprintf(stderr, "%s", str);426LLVMDisposeMessage(str);427}428}429430void431lp_jit_init_cs_types(struct lp_compute_shader_variant *lp)432{433if (!lp->jit_cs_context_ptr_type)434lp_jit_create_cs_types(lp);435}436437438