demotool/ops.hh
Emmanuel BENOîT 4774426962 UI - More refactoring
The idea is to split off all UI/display code from e.g. the parser. This
could take a while.
2017-11-23 14:15:17 +01:00

151 lines
2.7 KiB
C++

#pragma once
#include "sync.hh"
#include "opast.hh"
struct T_Rendertarget;
namespace ops {
enum E_OpType
{
OP_END ,
//
OP_CALL ,
OP_RET ,
//
OP_SKIP ,
OP_COND_SKIP ,
//
OP_RES_STACK ,
OP_PUSH ,
OP_POP ,
OP_DUP ,
//
OP_LOAD ,
OP_STORE ,
OP_SLOAD ,
OP_CONST ,
OP_OFFSET ,
//
OP_GET_INPUT ,
//
OP_FP_LOAD ,
OP_FP_STORE ,
OP_FP_SLOAD ,
OP_FP_SSTORE ,
OP_FP_SSTORE_INT ,
//
OP_FP_CMP ,
OP_FP_ADD ,
OP_FP_SUB ,
OP_FP_MUL ,
OP_FP_DIV ,
OP_FP_POW ,
//
OP_FP_NEG ,
OP_FP_INV ,
OP_FP_NOT ,
OP_FP_SIN ,
OP_FP_COS ,
OP_FP_TAN ,
OP_FP_SQRT ,
OP_FP_EXP ,
OP_FP_LN ,
//
OP_GEN_ASSETS ,
OP_INIT_PIPELINE ,
OP_INIT_PROGRAM ,
OP_INIT_SAMPLER ,
OP_INIT_TEXTURE ,
OP_FB_ATTACH ,
//
OP_USE_FRAMEBUFFER ,
OP_FB_TOGGLE ,
OP_USE_PIPELINE ,
OP_USE_PROGRAM ,
OP_USE_TEXTURE ,
OP_UNIFORMS ,
OP_VIEWPORT ,
//
OP_FULLSCREEN ,
OP_CLEAR ,
//
OP_UI_PENTER ,
OP_UI_PEXIT ,
OP_UI_INPUT_DFT ,
OP_UI_INPUT_OVR ,
OP_UI_ODBG ,
};
M_LSHIFT_OP( T_StringBuilder , E_OpType );
uint32_t ArgumentsFor( E_OpType op ) noexcept;
int32_t DeltaMainStack( E_OpType op ) noexcept;
int32_t DeltaFPUStack( E_OpType op ) noexcept;
struct T_Op
{
static constexpr int MAX_ARGS = 2;
E_OpType op;
ebcl::T_SRDLocation location;
uint32_t args[ MAX_ARGS ];
T_Op( const E_OpType op ,
ebcl::T_SRDLocation const& location ,
const uint32_t arg0 = 0 ) noexcept
: op( op ) , location( location ) ,
args{ arg0 }
{ }
T_Op( const E_OpType op ,
ebcl::T_SRDLocation const& location ,
std::initializer_list< uint32_t > a ) noexcept
: op( op ) , location( location )
{
assert( a.size( ) <= MAX_ARGS );
auto it = a.begin( );
for ( auto i = 0u ; i < a.size( ) ; i ++ , ++it ) {
args[ i ] = *it;
}
}
};
M_LSHIFT_OP( T_StringBuilder , T_Op const& );
union T_OpValue
{
int32_t i;
uint32_t u;
float f;
constexpr T_OpValue( ) : i{ 0 } {}
constexpr T_OpValue( uint32_t u ) : u{ u } {}
constexpr T_OpValue( float f ) : f{ f } {}
};
struct T_OpProgram
{
T_MultiArray< T_Op > ops; // All operations
uint32_t init , // Index of initialisation function
frame; // Index of frame rendering function
T_Array< T_OpValue > constants; // Constants values
uint32_t nVariables{ 0 }; // Amount of variables
T_Array< T_String > inputs; // Input definitions
uint32_t nPrograms{ 0 } , // Amount of programs
nFramebuffers{ 0 } , // Amount of framebuffers
nPipelines{ 0 } , // Amount of pipelines
nSamplers{ 0 } , // Amount of samplers
nTextures{ 0 }; // Amount of textures
T_Array< T_String > progNames; // GLSL program files
T_Array< T_String > uiStrings; // UI strings for profiling, etc.
T_Array< P_SyncOverrideSection > overrides;
// Override definitions for the UI
};
using P_OpProgram = T_OwnPtr< T_OpProgram >;
} // namespace ops