mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 02:38:04 +02:00
More GLSL preprocessor code:
Rename slang_version.syn to slang_pp_version.syn. The #version directive understands version 120. Cosmetic changes in version preprocessor. Checks if requested version is supported by the compiler.
This commit is contained in:
parent
798ef5ce33
commit
1d67cad9af
5 changed files with 234 additions and 47 deletions
121
src/mesa/shader/slang/library/slang_pp_version.syn
Normal file
121
src/mesa/shader/slang/library/slang_pp_version.syn
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
*
|
||||
* Copyright (C) 2005-2006 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file slang_version.syn
|
||||
* slang #version directive syntax
|
||||
* \author Michal Krol
|
||||
*/
|
||||
|
||||
.syntax version_directive;
|
||||
|
||||
version_directive
|
||||
version_directive_1 .and .loop version_directive_2;
|
||||
version_directive_1
|
||||
prior_optional_spaces .and optional_version_directive .and .true .emit $;
|
||||
version_directive_2
|
||||
prior_optional_spaces .and version_directive_body .and .true .emit $;
|
||||
|
||||
optional_version_directive
|
||||
version_directive_body .or .true .emit 10 .emit 1;
|
||||
|
||||
version_directive_body
|
||||
'#' .and optional_space .and "version" .and space .and version_number .and optional_space .and
|
||||
new_line;
|
||||
|
||||
version_number
|
||||
version_number_110 .or version_number_120;
|
||||
|
||||
version_number_110
|
||||
leading_zeroes .and "110" .emit 10 .emit 1;
|
||||
|
||||
version_number_120
|
||||
leading_zeroes .and "120" .emit 20 .emit 1;
|
||||
|
||||
leading_zeroes
|
||||
.loop zero;
|
||||
|
||||
zero
|
||||
'0';
|
||||
|
||||
space
|
||||
single_space .and .loop single_space;
|
||||
|
||||
optional_space
|
||||
.loop single_space;
|
||||
|
||||
single_space
|
||||
' ' .or '\t';
|
||||
|
||||
prior_optional_spaces
|
||||
.loop prior_space;
|
||||
|
||||
prior_space
|
||||
c_style_comment_block .or cpp_style_comment_block .or space .or new_line;
|
||||
|
||||
c_style_comment_block
|
||||
'/' .and '*' .and c_style_comment_rest;
|
||||
|
||||
c_style_comment_rest
|
||||
.loop c_style_comment_char_no_star .and c_style_comment_rest_1;
|
||||
c_style_comment_rest_1
|
||||
c_style_comment_end .or c_style_comment_rest_2;
|
||||
c_style_comment_rest_2
|
||||
'*' .and c_style_comment_rest;
|
||||
|
||||
c_style_comment_char_no_star
|
||||
'\x2B'-'\xFF' .or '\x01'-'\x29';
|
||||
|
||||
c_style_comment_end
|
||||
'*' .and '/';
|
||||
|
||||
cpp_style_comment_block
|
||||
'/' .and '/' .and cpp_style_comment_block_1;
|
||||
cpp_style_comment_block_1
|
||||
cpp_style_comment_block_2 .or cpp_style_comment_block_3;
|
||||
cpp_style_comment_block_2
|
||||
.loop cpp_style_comment_char .and new_line;
|
||||
cpp_style_comment_block_3
|
||||
.loop cpp_style_comment_char;
|
||||
|
||||
cpp_style_comment_char
|
||||
'\x0E'-'\xFF' .or '\x01'-'\x09' .or '\x0B'-'\x0C';
|
||||
|
||||
new_line
|
||||
cr_lf .or lf_cr .or '\n' .or '\r';
|
||||
|
||||
cr_lf
|
||||
'\r' .and '\n';
|
||||
|
||||
lf_cr
|
||||
'\n' .and '\r';
|
||||
|
||||
.string __string_filter;
|
||||
|
||||
__string_filter
|
||||
.loop __identifier_char;
|
||||
|
||||
__identifier_char
|
||||
'a'-'z' .or 'A'-'Z' .or '_' .or '0'-'9';
|
||||
|
||||
69
src/mesa/shader/slang/library/slang_pp_version_syn.h
Normal file
69
src/mesa/shader/slang/library/slang_pp_version_syn.h
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
|
||||
/* DO NOT EDIT - THIS FILE IS AUTOMATICALLY GENERATED FROM THE .syn FILE */
|
||||
|
||||
".syntax version_directive;\n"
|
||||
"version_directive\n"
|
||||
" version_directive_1 .and .loop version_directive_2;\n"
|
||||
"version_directive_1\n"
|
||||
" prior_optional_spaces .and optional_version_directive .and .true .emit $;\n"
|
||||
"version_directive_2\n"
|
||||
" prior_optional_spaces .and version_directive_body .and .true .emit $;\n"
|
||||
"optional_version_directive\n"
|
||||
" version_directive_body .or .true .emit 10 .emit 1;\n"
|
||||
"version_directive_body\n"
|
||||
" '#' .and optional_space .and \"version\" .and space .and version_number .and optional_space .and\n"
|
||||
" new_line;\n"
|
||||
"version_number\n"
|
||||
" version_number_110 .or version_number_120;\n"
|
||||
"version_number_110\n"
|
||||
" leading_zeroes .and \"110\" .emit 10 .emit 1;\n"
|
||||
"version_number_120\n"
|
||||
" leading_zeroes .and \"120\" .emit 20 .emit 1;\n"
|
||||
"leading_zeroes\n"
|
||||
" .loop zero;\n"
|
||||
"zero\n"
|
||||
" '0';\n"
|
||||
"space\n"
|
||||
" single_space .and .loop single_space;\n"
|
||||
"optional_space\n"
|
||||
" .loop single_space;\n"
|
||||
"single_space\n"
|
||||
" ' ' .or '\\t';\n"
|
||||
"prior_optional_spaces\n"
|
||||
" .loop prior_space;\n"
|
||||
"prior_space\n"
|
||||
" c_style_comment_block .or cpp_style_comment_block .or space .or new_line;\n"
|
||||
"c_style_comment_block\n"
|
||||
" '/' .and '*' .and c_style_comment_rest;\n"
|
||||
"c_style_comment_rest\n"
|
||||
" .loop c_style_comment_char_no_star .and c_style_comment_rest_1;\n"
|
||||
"c_style_comment_rest_1\n"
|
||||
" c_style_comment_end .or c_style_comment_rest_2;\n"
|
||||
"c_style_comment_rest_2\n"
|
||||
" '*' .and c_style_comment_rest;\n"
|
||||
"c_style_comment_char_no_star\n"
|
||||
" '\\x2B'-'\\xFF' .or '\\x01'-'\\x29';\n"
|
||||
"c_style_comment_end\n"
|
||||
" '*' .and '/';\n"
|
||||
"cpp_style_comment_block\n"
|
||||
" '/' .and '/' .and cpp_style_comment_block_1;\n"
|
||||
"cpp_style_comment_block_1\n"
|
||||
" cpp_style_comment_block_2 .or cpp_style_comment_block_3;\n"
|
||||
"cpp_style_comment_block_2\n"
|
||||
" .loop cpp_style_comment_char .and new_line;\n"
|
||||
"cpp_style_comment_block_3\n"
|
||||
" .loop cpp_style_comment_char;\n"
|
||||
"cpp_style_comment_char\n"
|
||||
" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n"
|
||||
"new_line\n"
|
||||
" cr_lf .or lf_cr .or '\\n' .or '\\r';\n"
|
||||
"cr_lf\n"
|
||||
" '\\r' .and '\\n';\n"
|
||||
"lf_cr\n"
|
||||
" '\\n' .and '\\r';\n"
|
||||
".string __string_filter;\n"
|
||||
"__string_filter\n"
|
||||
" .loop __identifier_char;\n"
|
||||
"__identifier_char\n"
|
||||
" 'a'-'z' .or 'A'-'Z' .or '_' .or '0'-'9';\n"
|
||||
""
|
||||
|
|
@ -1925,6 +1925,11 @@ compile_with_grammar (grammar id, const char *source, slang_code_unit *unit, sla
|
|||
if (!_slang_preprocess_version (source, &version, &start, infolog))
|
||||
return GL_FALSE;
|
||||
|
||||
if (version > 110) {
|
||||
slang_info_log_error (infolog, "language version specified is not supported.");
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/* check the syntax and generate its binary representation */
|
||||
if (!grammar_fast_check (id, (const byte *) source + start, &prod, &size, 65536))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -32,55 +32,46 @@
|
|||
#include "grammar_mesa.h"
|
||||
#include "slang_preprocess.h"
|
||||
|
||||
static const char *slang_version_syn =
|
||||
#include "library/slang_version_syn.h"
|
||||
static const char *slang_pp_version_syn =
|
||||
#include "library/slang_pp_version_syn.h"
|
||||
;
|
||||
|
||||
int _slang_preprocess_version (const char *text, unsigned int *version, unsigned int *eaten,
|
||||
slang_info_log *log)
|
||||
static GLvoid
|
||||
grammar_error_to_log (slang_info_log *log)
|
||||
{
|
||||
grammar id;
|
||||
byte *prod, *I;
|
||||
unsigned int size;
|
||||
char buf[1024];
|
||||
int pos;
|
||||
|
||||
id = grammar_load_from_text ((const byte *) slang_version_syn);
|
||||
if (id == 0)
|
||||
{
|
||||
char buf[1024];
|
||||
unsigned int pos;
|
||||
grammar_get_last_error ( (unsigned char*) buf, 1024, (int*) &pos);
|
||||
slang_info_log_error (log, buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!grammar_fast_check (id, (const byte *) text, &prod, &size, 8))
|
||||
{
|
||||
char buf[1024];
|
||||
unsigned int pos;
|
||||
grammar_get_last_error ( (unsigned char*) buf, 1024, (int*) &pos);
|
||||
slang_info_log_error (log, buf);
|
||||
grammar_destroy (id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
grammar_destroy (id);
|
||||
|
||||
/* there can be multiple #version directives - grab the last one */
|
||||
I = prod;
|
||||
while (I < prod + size)
|
||||
{
|
||||
*version =
|
||||
(unsigned int) I[0] +
|
||||
(unsigned int) I[1] * 100;
|
||||
*eaten =
|
||||
((unsigned int) I[2]) +
|
||||
((unsigned int) I[3] << 8) +
|
||||
((unsigned int) I[4] << 16) +
|
||||
((unsigned int) I[5] << 24);
|
||||
I += 6;
|
||||
}
|
||||
|
||||
grammar_alloc_free (prod);
|
||||
return 1;
|
||||
grammar_get_last_error ((byte *) (buf), sizeof (buf), &pos);
|
||||
slang_info_log_error (log, buf);
|
||||
}
|
||||
|
||||
GLboolean
|
||||
_slang_preprocess_version (const char *text, GLuint *version, GLuint *eaten, slang_info_log *log)
|
||||
{
|
||||
grammar id;
|
||||
byte *prod, *I;
|
||||
unsigned int size;
|
||||
|
||||
id = grammar_load_from_text ((const byte *) (slang_pp_version_syn));
|
||||
if (id == 0) {
|
||||
grammar_error_to_log (log);
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
if (!grammar_fast_check (id, (const byte *) (text), &prod, &size, 8)) {
|
||||
grammar_error_to_log (log);
|
||||
grammar_destroy (id);
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/* there can be multiple #version directives - grab the last one */
|
||||
I = &prod[size - 6];
|
||||
*version = (GLuint) (I[0]) + (GLuint) (I[1]) * 100;
|
||||
*eaten = (GLuint) (I[2]) + ((GLuint) (I[3]) << 8) + ((GLuint) (I[4]) << 16) + ((GLuint) (I[5]) << 24);
|
||||
|
||||
grammar_destroy (id);
|
||||
grammar_alloc_free (prod);
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,8 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
int _slang_preprocess_version (const char *, unsigned int *, unsigned int *, slang_info_log *);
|
||||
GLboolean
|
||||
_slang_preprocess_version (const char *, GLuint *, GLuint *, slang_info_log *);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue