Parser - Support for (uniforms)/(uniforms-i)

This commit is contained in:
Emmanuel BENOîT 2017-11-09 23:20:48 +01:00
parent 351614123e
commit d02ab91767
4 changed files with 158 additions and 44 deletions

View file

@ -40,7 +40,7 @@
}
(program prg-scene-p1 "scene.f.glsl")
# NOT IMPLEMENTED (set-uniforms prg-scene-p1 1 $vp-width $vp-height)
(uniforms prg-scene-p1 1 $vp-width $vp-height)
(pipeline pl-scene-p1 prg-fullscreen prg-scene-p1)
{ NOT IMPLEMENTED
@ -51,30 +51,28 @@
(fn scene-main ()
(profiling "Scene render"
{ NOT IMPLEMENTED
(set-uniforms prg-scene-p1 0 $time)
(set-uniforms prg-scene-p1 2
(get-input "camera-pos-x")
(get-input "camera-pos-y")
(get-input "camera-pos-z")
(uniforms prg-scene-p1 0 $time)
(uniforms prg-scene-p1 2
(get-input camera-pos-x)
(get-input camera-pos-y)
(get-input camera-pos-z)
)
(set-uniforms prg-scene-p1 3
(get-input "camera-lookat-x")
(get-input "camera-lookat-y")
(get-input "camera-lookat-z")
(uniforms prg-scene-p1 3
(get-input camera-lookat-x)
(get-input camera-lookat-y)
(get-input camera-lookat-z)
)
(set-uniforms prg-scene-p1 4
(get-input "camera-up-x")
(get-input "camera-up-y")
(get-input "camera-up-z")
(uniforms prg-scene-p1 4
(get-input camera-up-x)
(get-input camera-up-y)
(get-input camera-up-z)
)
(set-uniforms prg-scene-p1 5
(get-input "camera-nearplane")
(uniforms prg-scene-p1 5
(get-input camera-nearplane)
)
# FIXME MOAR UNIFORMS!
(use-pipeline pl-scene-p1)
(use-framebuffer rt-scene)
}
(viewport 0 0 $vp-width $vp-height)
(fullscreen)
)
@ -116,12 +114,10 @@
# Programs
(program prg-dof-pass1 "dof-pass1.f.glsl")
(program prg-dof-pass2 "dof-pass2.f.glsl")
{ NOT IMPLEMENTED
(set-uniforms-integer prg-dof-pass1 0 1)
(set-uniforms-integer prg-dof-pass1 1 1)
(set-uniforms-integer prg-dof-pass2 0 1)
(set-uniforms-integer prg-dof-pass2 1 1)
}
(uniforms-i prg-dof-pass1 0 1)
(uniforms-i prg-dof-pass1 1 1)
(uniforms-i prg-dof-pass2 0 1)
(uniforms-i prg-dof-pass2 1 1)
# Pipelines
(pipeline pl-dof-pass1 prg-fullscreen prg-dof-pass1)
@ -147,16 +143,14 @@
)
(fn dof-set-uniforms (prog)
{ NOT IMPLEMENTED
(set-uniforms prog 2
(uniforms prog 2
(get-input dof-sharp-distance)
(get-input dof-sharp-range)
(get-input dof-falloff)
(get-input dof-max-blur)
)
(set-uniforms prog 3 (get-input dof-samples))
(set-uniforms prog 4 $vp-width $vp-height $time)
}
(uniforms prog 3 (get-input dof-samples))
(uniforms prog 4 $vp-width $vp-height $time)
)
(fn dof-main (in-image in-depth)

View file

@ -171,6 +171,16 @@ A_Node* opast::ASTVisitorBrowser(
break;
}
// Uniforms instruction
case A_Node::OP_UNIFORMS:
{
auto& n( (T_UniformsInstrNode&) node );
if ( child < n.values( ) ) {
return &n.value( child );
}
break;
}
// Viewport instruction
case A_Node::OP_VIEWPORT:
{

View file

@ -1,7 +1,4 @@
#pragma once
#ifndef REAL_BUILD
# include "externals.hh"
#endif
#include "texture.hh"
#include <ebcl/SRDData.hh>
@ -32,6 +29,7 @@ class A_Node
OP_PROGRAM , // Shader program declaration
OP_SET , // Set instruction
OP_TEXTURE , // Define texture
OP_UNIFORMS , // Set uniforms
OP_VIEWPORT , // Set viewport
// "Use-<obj type>" instructions
OP_USE_FRAMEBUFFER ,
@ -580,6 +578,53 @@ class T_TextureInstrNode : public A_InstructionNode
{ return *height_; }
};
// Uniform setting instruction
class T_UniformsInstrNode : public A_InstructionNode
{
private:
bool integers_;
T_String progId_;
T_SRDLocation progIdLocation_;
uint32_t uloc_;
T_SRDLocation ulocLocation_;
T_StaticArray< P_ExpressionNode , 4 > values_;
public:
T_UniformsInstrNode( T_InstrListNode& parent ,
const bool integers ,
T_SRDToken const& prog ,
T_SRDToken const& loc ) noexcept
: A_InstructionNode( OP_UNIFORMS , parent ) , integers_( integers ) ,
progId_( prog.stringValue( ) ) , progIdLocation_( prog.location( ) ) ,
uloc_( loc.longValue( ) ) , ulocLocation_( loc.location( ) )
{ }
bool integers( ) const noexcept
{ return integers_; }
T_String const& progId( ) const noexcept
{ return progId_; }
T_SRDLocation const& progIdLocation( ) const noexcept
{ return progIdLocation_; }
uint32_t uloc( ) const noexcept
{ return uloc_; }
T_SRDLocation const& ulocLocation( ) const noexcept
{ return ulocLocation_; }
void addValue( P_ExpressionNode value ) noexcept
{
if ( value ) {
values_.add( std::move( value ) );
}
}
uint32_t values( ) const noexcept
{ return values_.size( ); }
A_ExpressionNode& value( const uint32_t index ) const noexcept
{ return *values_[ index ]; }
};
// Use-* instructions (framebuffers, programs, pipelines)
// Also serves as the base for use-texture
class T_UseInstrNode : public A_InstructionNode

View file

@ -22,6 +22,8 @@ struct T_ParserImpl_
PROGRAM ,
SET ,
TEXTURE ,
UNIFORMS_FLT ,
UNIFORMS_INT ,
USE_FRAMEBUFFER ,
USE_PIPELINE ,
USE_PROGRAM ,
@ -44,6 +46,8 @@ struct T_ParserImpl_
add( "program" , E_InstrType::PROGRAM );
add( "set" , E_InstrType::SET );
add( "texture" , E_InstrType::TEXTURE );
add( "uniforms" , E_InstrType::UNIFORMS_FLT );
add( "uniforms-i" , E_InstrType::UNIFORMS_INT );
add( "use-framebuffer" , E_InstrType::USE_FRAMEBUFFER );
add( "use-pipeline" , E_InstrType::USE_PIPELINE );
add( "use-program" , E_InstrType::USE_PROGRAM );
@ -163,6 +167,14 @@ struct T_ParserImpl_
M_DPARSER_( Program );
M_DPARSER_( Set );
M_DPARSER_( Texture );
M_DPARSER_( Uniforms );
M_DPARSER_( UniformsI );
void parseUniformsCommon(
T_InstrListNode& instructions ,
T_SRDList const& input ,
bool integers ) noexcept;
M_DPARSER_( UseFramebuffer );
M_DPARSER_( UsePipeline );
M_DPARSER_( UseProgram );
@ -171,6 +183,7 @@ struct T_ParserImpl_
T_SRDList const& input ,
T_UseInstrNode::E_Type type ) noexcept;
M_DPARSER_( UseTexture );
M_DPARSER_( Viewport );
#undef M_DPARSER_
@ -432,6 +445,8 @@ void T_ParserImpl_::parseInstructions(
M_CASE_( PROGRAM , Program );
M_CASE_( SET , Set );
M_CASE_( TEXTURE , Texture );
M_CASE_( UNIFORMS_FLT , Uniforms );
M_CASE_( UNIFORMS_INT , UniformsI );
M_CASE_( USE_FRAMEBUFFER , UseFramebuffer );
M_CASE_( USE_PIPELINE , UsePipeline );
M_CASE_( USE_PROGRAM , UseProgram );
@ -711,6 +726,56 @@ M_INSTR_( Texture )
}
}
/*----------------------------------------------------------------------------*/
M_INSTR_( Uniforms )
{
parseUniformsCommon( instructions , input , false );
}
M_INSTR_( UniformsI )
{
parseUniformsCommon( instructions , input , true );
}
void T_ParserImpl_::parseUniformsCommon(
T_InstrListNode& instructions ,
T_SRDList const& input ,
const bool integers ) noexcept
{
if ( input.size( ) == 1 || input[ 1 ].type( ) != E_SRDTokenType::WORD ) {
errors.addNew( "program identifier expected" ,
input[ input.size( ) == 1 ? 0 : 1 ].location( ) );
return;
}
if ( input.size( ) == 2 || !input[ 2 ].isInteger( ) ) {
errors.addNew( "uniform location expected" ,
input[ input.size( ) == 2 ? 0 : 2 ].location( ) );
return;
}
if ( input[ 2 ].longValue( ) < 0 || input[ 2 ].longValue( ) > UINT32_MAX ) {
errors.addNew( "invalid uniform location" , input[ 2 ].location( ) );
return;
}
auto& instr{ instructions.add< T_UniformsInstrNode >(
integers , input[ 1 ] , input[ 2 ] ) };
instr.location( ) = input[ 0 ].location( );
if ( input.size( ) == 3 ) {
errors.addNew( "at least one value required" , input[ 0 ].location( ) );
return;
}
for ( auto i = 3u ; i < input.size( ) ; i ++ ) {
if ( i == 7 ) {
errors.addNew( "too many arguments" , input[ i ].location( ) );
return;
}
instr.addValue( parseExpression( instr , input[ i ] ) );
}
}
/*----------------------------------------------------------------------------*/
M_INSTR_( UseFramebuffer )