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