⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arbprogparse.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * Mesa 3-D graphics library * Version:  7.1 * * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */#define DEBUG_PARSING 0/** * \file arbprogparse.c * ARB_*_program parser core * \author Karl Rasche */#include "main/glheader.h"#include "main/imports.h"#include "shader/grammar/grammar_mesa.h"#include "arbprogparse.h"#include "program.h"#include "prog_parameter.h"#include "prog_statevars.h"#include "context.h"#include "macros.h"#include "mtypes.h"#include "prog_instruction.h"/* For ARB programs, use the NV instruction limits */#define MAX_INSTRUCTIONS MAX2(MAX_NV_FRAGMENT_PROGRAM_INSTRUCTIONS, \                              MAX_NV_VERTEX_PROGRAM_INSTRUCTIONS)/** * This is basically a union of the vertex_program and fragment_program * structs that we can use to parse the program into * * XXX we can probably get rid of this entirely someday. */struct arb_program{   struct gl_program Base;   GLuint Position;       /* Just used for error reporting while parsing */   GLuint MajorVersion;   GLuint MinorVersion;   /* ARB_vertex_progmra options */   GLboolean HintPositionInvariant;   /* ARB_fragment_progmra options */   GLenum PrecisionOption; /* GL_DONT_CARE, GL_NICEST or GL_FASTEST */   GLenum FogOption;       /* GL_NONE, GL_LINEAR, GL_EXP or GL_EXP2 */   /* ARB_fragment_program specifics */   GLbitfield TexturesUsed[MAX_TEXTURE_IMAGE_UNITS];    GLbitfield ShadowSamplers;   GLuint NumAluInstructions;    GLuint NumTexInstructions;   GLuint NumTexIndirections;   GLboolean UsesKill;};/* TODO: *    Fragment Program Stuff: *    ----------------------------------------------------- * *    - things from Michal's email *       + overflow on atoi *       + not-overflowing floats (don't use parse_integer..) *       + can remove range checking in arbparse.c * *    - check all limits of number of various variables *      + parameters * *    - test! test! test! * *    Vertex Program Stuff: *    ----------------------------------------------------- *    - Optimize param array usage and count limits correctly, see spec, *         section 2.14.3.7 *       + Record if an array is reference absolutly or relatively (or both) *       + For absolute arrays, store a bitmap of accesses *       + For single parameters, store an access flag *       + After parsing, make a parameter cleanup and merging pass, where *           relative arrays are layed out first, followed by abs arrays, and *           finally single state. *       + Remap offsets for param src and dst registers *       + Now we can properly count parameter usage * *    - Multiple state binding errors in param arrays (see spec, just before *         section 2.14.3.3) *    - grep for XXX * *    Mesa Stuff *    ----------------------------------------------------- *    - User clipping planes vs. PositionInvariant *    - Is it sufficient to just multiply by the mvp to transform in the *        PositionInvariant case? Or do we need something more involved? * *    - vp_src swizzle is GLubyte, fp_src swizzle is GLuint *    - fetch state listed in program_parameters list *       + WTF should this go??? *       + currently in nvvertexec.c and s_nvfragprog.c * *    - allow for multiple address registers (and fetch address regs properly) * *    Cosmetic Stuff *    ----------------------------------------------------- * 	- remove any leftover unused grammer.c stuff (dict_ ?) * 	- fix grammer.c error handling so its not static * 	- #ifdef around stuff pertaining to extentions * *    Outstanding Questions: *    ----------------------------------------------------- *    - ARB_matrix_palette / ARB_vertex_blend -- not supported *      what gets hacked off because of this: *       + VERTEX_ATTRIB_MATRIXINDEX *       + VERTEX_ATTRIB_WEIGHT *       + MATRIX_MODELVIEW *       + MATRIX_PALETTE * *    - When can we fetch env/local params from their own register files, and *      when to we have to fetch them into the main state register file? *      (think arrays) * *    Grammar Changes: *    ----------------------------------------------------- *//* Changes since moving the file to shader directory2004-III-4 ------------------------------------------------------------- added #include "grammar_mesa.h"- removed grammar specific code part (it resides now in grammar.c)- added GL_ARB_fragment_program_shadow tokens- modified #include "arbparse_syn.h"- major changes inside _mesa_parse_arb_program()- check the program string for '\0' characters- copy the program string to a one-byte-longer location to have  it null-terminated- position invariance test (not writing to result.position) moved  to syntax part*/typedef GLubyte *production;/** * This is the text describing the rules to parse the grammar */LONGSTRING static char arb_grammar_text[] =#include "arbprogram_syn.h";/** * These should match up with the values defined in arbprogram.syn *//*    Changes:    - changed and merged V_* and F_* opcode values to OP_*.    - added GL_ARB_fragment_program_shadow specific tokens (michal)*/#define  REVISION                                   0x0a/* program type */#define  FRAGMENT_PROGRAM                           0x01#define  VERTEX_PROGRAM                             0x02/* program section */#define  OPTION                                     0x01#define  INSTRUCTION                                0x02#define  DECLARATION                                0x03#define  END                                        0x04/* GL_ARB_fragment_program option */#define  ARB_PRECISION_HINT_FASTEST                 0x00#define  ARB_PRECISION_HINT_NICEST                  0x01#define  ARB_FOG_EXP                                0x02#define  ARB_FOG_EXP2                               0x03#define  ARB_FOG_LINEAR                             0x04/* GL_ARB_vertex_program option */#define  ARB_POSITION_INVARIANT                     0x05/* GL_ARB_fragment_program_shadow option */#define  ARB_FRAGMENT_PROGRAM_SHADOW                0x06/* GL_ARB_draw_buffers option */#define  ARB_DRAW_BUFFERS                           0x07/* GL_MESA_texture_array option */#define  MESA_TEXTURE_ARRAY                        0x08/* GL_ARB_fragment_program instruction class */#define  OP_ALU_INST                                0x00#define  OP_TEX_INST                                0x01/* GL_ARB_vertex_program instruction class *//*       OP_ALU_INST *//* GL_ARB_fragment_program instruction type */#define  OP_ALU_VECTOR                               0x00#define  OP_ALU_SCALAR                               0x01#define  OP_ALU_BINSC                                0x02#define  OP_ALU_BIN                                  0x03#define  OP_ALU_TRI                                  0x04#define  OP_ALU_SWZ                                  0x05#define  OP_TEX_SAMPLE                               0x06#define  OP_TEX_KIL                                  0x07/* GL_ARB_vertex_program instruction type */#define  OP_ALU_ARL                                  0x08/*       OP_ALU_VECTOR *//*       OP_ALU_SCALAR *//*       OP_ALU_BINSC *//*       OP_ALU_BIN *//*       OP_ALU_TRI *//*       OP_ALU_SWZ *//* GL_ARB_fragment_program instruction code */#define  OP_ABS                                     0x00#define  OP_ABS_SAT                                 0x1B#define  OP_FLR                                     0x09#define  OP_FLR_SAT                                 0x26#define  OP_FRC                                     0x0A#define  OP_FRC_SAT                                 0x27#define  OP_LIT                                     0x0C#define  OP_LIT_SAT                                 0x2A#define  OP_MOV                                     0x11#define  OP_MOV_SAT                                 0x30#define  OP_COS                                     0x1F#define  OP_COS_SAT                                 0x20#define  OP_EX2                                     0x07#define  OP_EX2_SAT                                 0x25#define  OP_LG2                                     0x0B#define  OP_LG2_SAT                                 0x29#define  OP_RCP                                     0x14#define  OP_RCP_SAT                                 0x33#define  OP_RSQ                                     0x15#define  OP_RSQ_SAT                                 0x34#define  OP_SIN                                     0x38#define  OP_SIN_SAT                                 0x39#define  OP_SCS                                     0x35#define  OP_SCS_SAT                                 0x36#define  OP_POW                                     0x13#define  OP_POW_SAT                                 0x32#define  OP_ADD                                     0x01#define  OP_ADD_SAT                                 0x1C#define  OP_DP3                                     0x03#define  OP_DP3_SAT                                 0x21#define  OP_DP4                                     0x04#define  OP_DP4_SAT                                 0x22#define  OP_DPH                                     0x05#define  OP_DPH_SAT                                 0x23#define  OP_DST                                     0x06#define  OP_DST_SAT                                 0x24#define  OP_MAX                                     0x0F#define  OP_MAX_SAT                                 0x2E#define  OP_MIN                                     0x10#define  OP_MIN_SAT                                 0x2F#define  OP_MUL                                     0x12#define  OP_MUL_SAT                                 0x31#define  OP_SGE                                     0x16#define  OP_SGE_SAT                                 0x37#define  OP_SLT                                     0x17#define  OP_SLT_SAT                                 0x3A#define  OP_SUB                                     0x18#define  OP_SUB_SAT                                 0x3B#define  OP_XPD                                     0x1A#define  OP_XPD_SAT                                 0x43#define  OP_CMP                                     0x1D#define  OP_CMP_SAT                                 0x1E#define  OP_LRP                                     0x2B#define  OP_LRP_SAT                                 0x2C#define  OP_MAD                                     0x0E#define  OP_MAD_SAT                                 0x2D#define  OP_SWZ                                     0x19#define  OP_SWZ_SAT                                 0x3C#define  OP_TEX                                     0x3D#define  OP_TEX_SAT                                 0x3E#define  OP_TXB                                     0x3F#define  OP_TXB_SAT                                 0x40#define  OP_TXP                                     0x41#define  OP_TXP_SAT                                 0x42#define  OP_KIL                                     0x28/* GL_ARB_vertex_program instruction code */#define  OP_ARL                                     0x02/*       OP_ABS *//*       OP_FLR *//*       OP_FRC *//*       OP_LIT *//*       OP_MOV *//*       OP_EX2 */#define  OP_EXP                                     0x08/*       OP_LG2 */#define  OP_LOG                                     0x0D/*       OP_RCP *//*       OP_RSQ *//*       OP_POW *//*       OP_ADD *//*       OP_DP3 *//*       OP_DP4 *//*       OP_DPH *//*       OP_DST *//*       OP_MAX *//*       OP_MIN *//*       OP_MUL *//*       OP_SGE *//*       OP_SLT *//*       OP_SUB *//*       OP_XPD *//*       OP_MAD *//*       OP_SWZ *//* fragment attribute binding */#define  FRAGMENT_ATTRIB_COLOR                      0x01#define  FRAGMENT_ATTRIB_TEXCOORD                   0x02#define  FRAGMENT_ATTRIB_FOGCOORD                   0x03#define  FRAGMENT_ATTRIB_POSITION                   0x04/* vertex attribute binding */#define  VERTEX_ATTRIB_POSITION                     0x01#define  VERTEX_ATTRIB_WEIGHT                       0x02#define  VERTEX_ATTRIB_NORMAL                       0x03#define  VERTEX_ATTRIB_COLOR                        0x04#define  VERTEX_ATTRIB_FOGCOORD                     0x05#define  VERTEX_ATTRIB_TEXCOORD                     0x06#define  VERTEX_ATTRIB_MATRIXINDEX                  0x07#define  VERTEX_ATTRIB_GENERIC                      0x08/* fragment result binding */#define  FRAGMENT_RESULT_COLOR                      0x01#define  FRAGMENT_RESULT_DEPTH                      0x02/* vertex result binding */#define  VERTEX_RESULT_POSITION                     0x01#define  VERTEX_RESULT_COLOR                        0x02#define  VERTEX_RESULT_FOGCOORD                     0x03#define  VERTEX_RESULT_POINTSIZE                    0x04#define  VERTEX_RESULT_TEXCOORD                     0x05/* texture target */#define  TEXTARGET_1D                               0x01#define  TEXTARGET_2D                               0x02#define  TEXTARGET_3D                               0x03#define  TEXTARGET_RECT                             0x04#define  TEXTARGET_CUBE                             0x05/* GL_ARB_fragment_program_shadow */#define  TEXTARGET_SHADOW1D                         0x06#define  TEXTARGET_SHADOW2D                         0x07#define  TEXTARGET_SHADOWRECT                       0x08/* GL_MESA_texture_array */#define  TEXTARGET_1D_ARRAY                         0x09#define  TEXTARGET_2D_ARRAY                         0x0a#define  TEXTARGET_SHADOW1D_ARRAY                   0x0b#define  TEXTARGET_SHADOW2D_ARRAY                   0x0c/* face type */#define  FACE_FRONT                                 0x00#define  FACE_BACK                                  0x01/* color type */#define  COLOR_PRIMARY                              0x00#define  COLOR_SECONDARY                            0x01/* component */#define  COMPONENT_X                                0x00#define  COMPONENT_Y                                0x01#define  COMPONENT_Z                                0x02#define  COMPONENT_W                                0x03#define  COMPONENT_0                                0x04#define  COMPONENT_1                                0x05/* array index type */#define  ARRAY_INDEX_ABSOLUTE                       0x00#define  ARRAY_INDEX_RELATIVE                       0x01/* matrix name */#define  MATRIX_MODELVIEW                           0x01#define  MATRIX_PROJECTION                          0x02#define  MATRIX_MVP                                 0x03

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -