Control - All opcodes that do not use assets are done
This commit is contained in:
parent
512c981402
commit
71f6fed1ee
3 changed files with 73 additions and 1 deletions
|
@ -159,11 +159,14 @@ struct T_OpContext
|
||||||
|
|
||||||
T_Array< T_OpValue > values; // VM data
|
T_Array< T_OpValue > values; // VM data
|
||||||
T_Array< T_OpValue > stack; // Main VM stack
|
T_Array< T_OpValue > stack; // Main VM stack
|
||||||
|
T_Array< float > initialInputs; // Initial input values
|
||||||
|
|
||||||
T_OpValue wreg; // Work register
|
T_OpValue wreg; // Work register
|
||||||
double x87stack[ 8 ]; // x87 FPU emulation stack
|
double x87stack[ 8 ]; // x87 FPU emulation stack
|
||||||
uint32_t x87sp; // x87 FPU emulation stack pointer
|
uint32_t x87sp; // x87 FPU emulation stack pointer
|
||||||
|
|
||||||
|
T_Array< T_String > profiling; // Profiling sections that have been started
|
||||||
|
|
||||||
enum E_RunTarget {
|
enum E_RunTarget {
|
||||||
R_INIT ,
|
R_INIT ,
|
||||||
R_RENDER
|
R_RENDER
|
||||||
|
|
|
@ -572,7 +572,7 @@ bool T_CompilerImpl_::compileNode(
|
||||||
addInstruction( OP_CONST , un.uloc( ) , un.ulocLocation( ) );
|
addInstruction( OP_CONST , un.uloc( ) , un.ulocLocation( ) );
|
||||||
addInstruction( OP_PUSH , un.ulocLocation( ) );
|
addInstruction( OP_PUSH , un.ulocLocation( ) );
|
||||||
processIdentifier( funcIndex , un.progId( ) , un.progIdLocation( ) );
|
processIdentifier( funcIndex , un.progId( ) , un.progIdLocation( ) );
|
||||||
addInstruction( OP_UNIFORMS , { un.values( ) , un.integers( ) ? 1u : 0u } ,
|
addInstruction( OP_UNIFORMS , { un.values( ) - 1 , un.integers( ) ? 1u : 0u } ,
|
||||||
un.location( ) );
|
un.location( ) );
|
||||||
sdMain -= un.values( );
|
sdMain -= un.values( );
|
||||||
}
|
}
|
||||||
|
|
69
ops.cc
69
ops.cc
|
@ -2,6 +2,7 @@
|
||||||
#include "control.hh"
|
#include "control.hh"
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
#include "sync.hh"
|
#include "sync.hh"
|
||||||
|
#include "profiling.hh"
|
||||||
|
|
||||||
using namespace ops;
|
using namespace ops;
|
||||||
using namespace ebcl;
|
using namespace ebcl;
|
||||||
|
@ -224,6 +225,7 @@ T_OpContext::T_OpContext(
|
||||||
+ program.nPrograms + program.nPipelines
|
+ program.nPrograms + program.nPipelines
|
||||||
+ program.nSamplers + program.nTextures };
|
+ program.nSamplers + program.nTextures };
|
||||||
values.resize( ts );
|
values.resize( ts );
|
||||||
|
initialInputs.resize( program.inputs.size( ) );
|
||||||
|
|
||||||
for ( auto i = 0u ; i < nc ; i ++ ) {
|
for ( auto i = 0u ; i < nc ; i ++ ) {
|
||||||
values[ i + 3 ] = program.constants[ nc ];
|
values[ i + 3 ] = program.constants[ nc ];
|
||||||
|
@ -495,6 +497,73 @@ void T_OpContext::run(
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// TODO resource init
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// TODO resource usage
|
||||||
|
|
||||||
|
case OP_UNIFORMS:
|
||||||
|
{
|
||||||
|
ensureStack( instr , 3 + instr.args[ 0 ] );
|
||||||
|
|
||||||
|
const auto ss( stack.size( ) );
|
||||||
|
T_OpValue values[ 4 ];
|
||||||
|
for ( auto i = 0u ; i <= instr.args[ 0 ] ; i ++ ) {
|
||||||
|
values[ i ] = stack[ ss - 2 - i ];
|
||||||
|
}
|
||||||
|
// FIXME can't actually finish this, I'm stupid.
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case OP_VIEWPORT:
|
||||||
|
{
|
||||||
|
ensureStack( instr , 4 );
|
||||||
|
const auto ss( stack.size( ) );
|
||||||
|
glViewport( stack[ ss - 1 ].f , stack[ ss - 2 ].f ,
|
||||||
|
stack[ ss - 3 ].f , stack[ ss - 4 ].f );
|
||||||
|
stack.resize( ss - 4 );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
case OP_FULLSCREEN:
|
||||||
|
glDrawArrays( GL_TRIANGLE_STRIP , 0 , 4 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OP_CLEAR:
|
||||||
|
{
|
||||||
|
ensureStack( instr , 4 );
|
||||||
|
const auto ss( stack.size( ) );
|
||||||
|
glClearColor( stack[ ss - 1 ].f , stack[ ss - 2 ].f ,
|
||||||
|
stack[ ss - 3 ].f , stack[ ss - 4 ].f );
|
||||||
|
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||||
|
stack.resize( ss - 4 );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
case OP_UI_PENTER:
|
||||||
|
{
|
||||||
|
T_String const& section( program.uiStrings[ instr.args[ 0 ] ] );
|
||||||
|
Globals::Profiler( ).start( section );
|
||||||
|
profiling.add( section );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case OP_UI_PEXIT:
|
||||||
|
Globals::Profiler( ).end( profiling.last( ) );
|
||||||
|
profiling.removeLast( );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OP_UI_INPUT_DFT:
|
||||||
|
initialInputs[ instr.args[ 0 ] ] = values[ instr.args[ 1 ] ].f;
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue