151 lines
2.8 KiB
C++
151 lines
2.8 KiB
C++
#pragma once
|
|
#include "c-opast.hh"
|
|
#include "c-sync.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
|