101e04c3fSmrg/* 201e04c3fSmrg * Copyright © 2011 Intel Corporation 301e04c3fSmrg * 401e04c3fSmrg * Permission is hereby granted, free of charge, to any person obtaining a 501e04c3fSmrg * copy of this software and associated documentation files (the "Software"), 601e04c3fSmrg * to deal in the Software without restriction, including without limitation 701e04c3fSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 801e04c3fSmrg * and/or sell copies of the Software, and to permit persons to whom the 901e04c3fSmrg * Software is furnished to do so, subject to the following conditions: 1001e04c3fSmrg * 1101e04c3fSmrg * The above copyright notice and this permission notice (including the next 1201e04c3fSmrg * paragraph) shall be included in all copies or substantial portions of the 1301e04c3fSmrg * Software. 1401e04c3fSmrg * 1501e04c3fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1601e04c3fSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1701e04c3fSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1801e04c3fSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1901e04c3fSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2001e04c3fSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 2101e04c3fSmrg * DEALINGS IN THE SOFTWARE. 2201e04c3fSmrg */ 2301e04c3fSmrg 2401e04c3fSmrg/* This file declares stripped-down versions of functions that 2501e04c3fSmrg * normally exist outside of the glsl folder, so that they can be used 2601e04c3fSmrg * when running the GLSL compiler standalone (for unit testing or 2701e04c3fSmrg * compiling builtins). 2801e04c3fSmrg */ 2901e04c3fSmrg 3001e04c3fSmrg#include "standalone_scaffolding.h" 3101e04c3fSmrg 3201e04c3fSmrg#include <assert.h> 3301e04c3fSmrg#include <stdio.h> 3401e04c3fSmrg#include <string.h> 3501e04c3fSmrg#include "util/ralloc.h" 3601e04c3fSmrg#include "util/strtod.h" 3701e04c3fSmrg#include "main/mtypes.h" 3801e04c3fSmrg 3901e04c3fSmrgvoid 4001e04c3fSmrg_mesa_warning(struct gl_context *ctx, const char *fmt, ...) 4101e04c3fSmrg{ 4201e04c3fSmrg va_list vargs; 4301e04c3fSmrg (void) ctx; 4401e04c3fSmrg 4501e04c3fSmrg va_start(vargs, fmt); 4601e04c3fSmrg 4701e04c3fSmrg /* This output is not thread-safe, but that's good enough for the 4801e04c3fSmrg * standalone compiler. 4901e04c3fSmrg */ 5001e04c3fSmrg fprintf(stderr, "Mesa warning: "); 5101e04c3fSmrg vfprintf(stderr, fmt, vargs); 5201e04c3fSmrg fprintf(stderr, "\n"); 5301e04c3fSmrg 5401e04c3fSmrg va_end(vargs); 5501e04c3fSmrg} 5601e04c3fSmrg 577e102996Smayavoid 587e102996Smaya_mesa_problem(struct gl_context *ctx, const char *fmt, ...) 597e102996Smaya{ 607e102996Smaya va_list vargs; 617e102996Smaya (void) ctx; 627e102996Smaya 637e102996Smaya va_start(vargs, fmt); 647e102996Smaya 657e102996Smaya /* This output is not thread-safe, but that's good enough for the 667e102996Smaya * standalone compiler. 677e102996Smaya */ 687e102996Smaya fprintf(stderr, "Mesa problem: "); 697e102996Smaya vfprintf(stderr, fmt, vargs); 707e102996Smaya fprintf(stderr, "\n"); 717e102996Smaya 727e102996Smaya va_end(vargs); 737e102996Smaya} 747e102996Smaya 7501e04c3fSmrgvoid 7601e04c3fSmrg_mesa_reference_shader_program_data(struct gl_context *ctx, 7701e04c3fSmrg struct gl_shader_program_data **ptr, 7801e04c3fSmrg struct gl_shader_program_data *data) 7901e04c3fSmrg{ 8001e04c3fSmrg (void) ctx; 8101e04c3fSmrg *ptr = data; 8201e04c3fSmrg} 8301e04c3fSmrg 8401e04c3fSmrgvoid 8501e04c3fSmrg_mesa_reference_shader(struct gl_context *ctx, struct gl_shader **ptr, 8601e04c3fSmrg struct gl_shader *sh) 8701e04c3fSmrg{ 8801e04c3fSmrg (void) ctx; 8901e04c3fSmrg *ptr = sh; 9001e04c3fSmrg} 9101e04c3fSmrg 9201e04c3fSmrgvoid 9301e04c3fSmrg_mesa_reference_program_(struct gl_context *ctx, struct gl_program **ptr, 9401e04c3fSmrg struct gl_program *prog) 9501e04c3fSmrg{ 9601e04c3fSmrg (void) ctx; 9701e04c3fSmrg *ptr = prog; 9801e04c3fSmrg} 9901e04c3fSmrg 10001e04c3fSmrgvoid 10101e04c3fSmrg_mesa_shader_debug(struct gl_context *, GLenum, GLuint *, 10201e04c3fSmrg const char *) 10301e04c3fSmrg{ 10401e04c3fSmrg} 10501e04c3fSmrg 10601e04c3fSmrgstruct gl_shader * 10701e04c3fSmrg_mesa_new_shader(GLuint name, gl_shader_stage stage) 10801e04c3fSmrg{ 10901e04c3fSmrg struct gl_shader *shader; 11001e04c3fSmrg 11101e04c3fSmrg assert(stage == MESA_SHADER_FRAGMENT || stage == MESA_SHADER_VERTEX); 11201e04c3fSmrg shader = rzalloc(NULL, struct gl_shader); 11301e04c3fSmrg if (shader) { 11401e04c3fSmrg shader->Stage = stage; 11501e04c3fSmrg shader->Name = name; 11601e04c3fSmrg shader->RefCount = 1; 11701e04c3fSmrg } 11801e04c3fSmrg return shader; 11901e04c3fSmrg} 12001e04c3fSmrg 12101e04c3fSmrgGLbitfield 12201e04c3fSmrg_mesa_program_state_flags(UNUSED const gl_state_index16 state[STATE_LENGTH]) 12301e04c3fSmrg{ 12401e04c3fSmrg return 0; 12501e04c3fSmrg} 12601e04c3fSmrg 12701e04c3fSmrgchar * 12801e04c3fSmrg_mesa_program_state_string(UNUSED const gl_state_index16 state[STATE_LENGTH]) 12901e04c3fSmrg{ 13001e04c3fSmrg return NULL; 13101e04c3fSmrg} 13201e04c3fSmrg 13301e04c3fSmrgvoid 13401e04c3fSmrg_mesa_delete_shader(struct gl_context *, struct gl_shader *sh) 13501e04c3fSmrg{ 13601e04c3fSmrg free((void *)sh->Source); 13701e04c3fSmrg free(sh->Label); 13801e04c3fSmrg ralloc_free(sh); 13901e04c3fSmrg} 14001e04c3fSmrg 14101e04c3fSmrgvoid 14201e04c3fSmrg_mesa_delete_linked_shader(struct gl_context *, 14301e04c3fSmrg struct gl_linked_shader *sh) 14401e04c3fSmrg{ 1457ec681f3Smrg ralloc_free(sh->Program); 14601e04c3fSmrg ralloc_free(sh); 14701e04c3fSmrg} 14801e04c3fSmrg 14901e04c3fSmrgvoid 15001e04c3fSmrg_mesa_clear_shader_program_data(struct gl_context *ctx, 15101e04c3fSmrg struct gl_shader_program *shProg) 15201e04c3fSmrg{ 15301e04c3fSmrg for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { 15401e04c3fSmrg if (shProg->_LinkedShaders[i] != NULL) { 15501e04c3fSmrg _mesa_delete_linked_shader(ctx, shProg->_LinkedShaders[i]); 15601e04c3fSmrg shProg->_LinkedShaders[i] = NULL; 15701e04c3fSmrg } 15801e04c3fSmrg } 15901e04c3fSmrg 16001e04c3fSmrg shProg->data->NumUniformStorage = 0; 16101e04c3fSmrg shProg->data->UniformStorage = NULL; 16201e04c3fSmrg shProg->NumUniformRemapTable = 0; 16301e04c3fSmrg shProg->UniformRemapTable = NULL; 16401e04c3fSmrg shProg->UniformHash = NULL; 16501e04c3fSmrg 16601e04c3fSmrg ralloc_free(shProg->data->InfoLog); 16701e04c3fSmrg shProg->data->InfoLog = ralloc_strdup(shProg->data, ""); 16801e04c3fSmrg 16901e04c3fSmrg ralloc_free(shProg->data->UniformBlocks); 17001e04c3fSmrg shProg->data->UniformBlocks = NULL; 17101e04c3fSmrg shProg->data->NumUniformBlocks = 0; 17201e04c3fSmrg 17301e04c3fSmrg ralloc_free(shProg->data->ShaderStorageBlocks); 17401e04c3fSmrg shProg->data->ShaderStorageBlocks = NULL; 17501e04c3fSmrg shProg->data->NumShaderStorageBlocks = 0; 17601e04c3fSmrg 17701e04c3fSmrg ralloc_free(shProg->data->AtomicBuffers); 17801e04c3fSmrg shProg->data->AtomicBuffers = NULL; 17901e04c3fSmrg shProg->data->NumAtomicBuffers = 0; 18001e04c3fSmrg} 18101e04c3fSmrg 18201e04c3fSmrgvoid initialize_context_to_defaults(struct gl_context *ctx, gl_api api) 18301e04c3fSmrg{ 18401e04c3fSmrg memset(ctx, 0, sizeof(*ctx)); 18501e04c3fSmrg 18601e04c3fSmrg ctx->API = api; 18701e04c3fSmrg 18801e04c3fSmrg ctx->Extensions.dummy_true = true; 18901e04c3fSmrg ctx->Extensions.ARB_compute_shader = true; 19001e04c3fSmrg ctx->Extensions.ARB_compute_variable_group_size = true; 19101e04c3fSmrg ctx->Extensions.ARB_conservative_depth = true; 19201e04c3fSmrg ctx->Extensions.ARB_draw_instanced = true; 19301e04c3fSmrg ctx->Extensions.ARB_ES2_compatibility = true; 19401e04c3fSmrg ctx->Extensions.ARB_ES3_compatibility = true; 19501e04c3fSmrg ctx->Extensions.ARB_explicit_attrib_location = true; 19601e04c3fSmrg ctx->Extensions.ARB_fragment_coord_conventions = true; 19701e04c3fSmrg ctx->Extensions.ARB_fragment_layer_viewport = true; 19801e04c3fSmrg ctx->Extensions.ARB_gpu_shader5 = true; 19901e04c3fSmrg ctx->Extensions.ARB_gpu_shader_fp64 = true; 20001e04c3fSmrg ctx->Extensions.ARB_gpu_shader_int64 = true; 20101e04c3fSmrg ctx->Extensions.ARB_sample_shading = true; 20201e04c3fSmrg ctx->Extensions.ARB_shader_bit_encoding = true; 20301e04c3fSmrg ctx->Extensions.ARB_shader_draw_parameters = true; 20401e04c3fSmrg ctx->Extensions.ARB_shader_stencil_export = true; 20501e04c3fSmrg ctx->Extensions.ARB_shader_texture_lod = true; 20601e04c3fSmrg ctx->Extensions.ARB_shading_language_420pack = true; 20701e04c3fSmrg ctx->Extensions.ARB_shading_language_packing = true; 20801e04c3fSmrg ctx->Extensions.ARB_tessellation_shader = true; 20901e04c3fSmrg ctx->Extensions.ARB_texture_cube_map_array = true; 21001e04c3fSmrg ctx->Extensions.ARB_texture_gather = true; 21101e04c3fSmrg ctx->Extensions.ARB_texture_multisample = true; 21201e04c3fSmrg ctx->Extensions.ARB_texture_query_levels = true; 21301e04c3fSmrg ctx->Extensions.ARB_texture_query_lod = true; 21401e04c3fSmrg ctx->Extensions.ARB_uniform_buffer_object = true; 21501e04c3fSmrg ctx->Extensions.ARB_viewport_array = true; 21601e04c3fSmrg ctx->Extensions.ARB_cull_distance = true; 21701e04c3fSmrg ctx->Extensions.ARB_bindless_texture = true; 21801e04c3fSmrg 21901e04c3fSmrg ctx->Extensions.OES_EGL_image_external = true; 22001e04c3fSmrg ctx->Extensions.OES_standard_derivatives = true; 22101e04c3fSmrg 2227e102996Smaya ctx->Extensions.EXT_gpu_shader4 = true; 22301e04c3fSmrg ctx->Extensions.EXT_shader_integer_mix = true; 22401e04c3fSmrg ctx->Extensions.EXT_texture_array = true; 22501e04c3fSmrg 22601e04c3fSmrg ctx->Extensions.MESA_shader_integer_functions = true; 22701e04c3fSmrg 22801e04c3fSmrg ctx->Extensions.NV_texture_rectangle = true; 22901e04c3fSmrg 23001e04c3fSmrg ctx->Const.GLSLVersion = 120; 23101e04c3fSmrg 23201e04c3fSmrg /* 1.20 minimums. */ 23301e04c3fSmrg ctx->Const.MaxLights = 8; 23401e04c3fSmrg ctx->Const.MaxClipPlanes = 6; 23501e04c3fSmrg ctx->Const.MaxTextureUnits = 2; 23601e04c3fSmrg ctx->Const.MaxTextureCoordUnits = 2; 23701e04c3fSmrg ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16; 23801e04c3fSmrg 23901e04c3fSmrg ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 512; 24001e04c3fSmrg ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 32; 24101e04c3fSmrg ctx->Const.MaxVarying = 8; /* == gl_MaxVaryingFloats / 4 */ 24201e04c3fSmrg ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 0; 24301e04c3fSmrg ctx->Const.MaxCombinedTextureImageUnits = 2; 24401e04c3fSmrg ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 2; 24501e04c3fSmrg ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 64; 24601e04c3fSmrg ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = 32; 24701e04c3fSmrg 24801e04c3fSmrg ctx->Const.MaxDrawBuffers = 1; 24901e04c3fSmrg ctx->Const.MaxComputeWorkGroupCount[0] = 65535; 25001e04c3fSmrg ctx->Const.MaxComputeWorkGroupCount[1] = 65535; 25101e04c3fSmrg ctx->Const.MaxComputeWorkGroupCount[2] = 65535; 25201e04c3fSmrg ctx->Const.MaxComputeWorkGroupSize[0] = 1024; 25301e04c3fSmrg ctx->Const.MaxComputeWorkGroupSize[1] = 1024; 25401e04c3fSmrg ctx->Const.MaxComputeWorkGroupSize[2] = 64; 25501e04c3fSmrg ctx->Const.MaxComputeWorkGroupInvocations = 1024; 25601e04c3fSmrg ctx->Const.MaxComputeVariableGroupSize[0] = 512; 25701e04c3fSmrg ctx->Const.MaxComputeVariableGroupSize[1] = 512; 25801e04c3fSmrg ctx->Const.MaxComputeVariableGroupSize[2] = 64; 25901e04c3fSmrg ctx->Const.MaxComputeVariableGroupInvocations = 512; 26001e04c3fSmrg ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 16; 26101e04c3fSmrg ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents = 1024; 26201e04c3fSmrg ctx->Const.Program[MESA_SHADER_COMPUTE].MaxInputComponents = 0; /* not used */ 26301e04c3fSmrg ctx->Const.Program[MESA_SHADER_COMPUTE].MaxOutputComponents = 0; /* not used */ 26401e04c3fSmrg 26501e04c3fSmrg /* Set up default shader compiler options. */ 26601e04c3fSmrg struct gl_shader_compiler_options options; 26701e04c3fSmrg memset(&options, 0, sizeof(options)); 26801e04c3fSmrg options.MaxUnrollIterations = 32; 26901e04c3fSmrg options.MaxIfDepth = UINT_MAX; 27001e04c3fSmrg 27101e04c3fSmrg for (int sh = 0; sh < MESA_SHADER_STAGES; ++sh) 27201e04c3fSmrg memcpy(&ctx->Const.ShaderCompilerOptions[sh], &options, sizeof(options)); 27301e04c3fSmrg 27401e04c3fSmrg _mesa_locale_init(); 27501e04c3fSmrg} 276