// -----------------------------------------------------------------------------
// 
// -----------------------------------------------------------------------------
//
void RFrameXferBlockProtocolStack::Initialize()
    {
    // perform base class initialization
    KeInitialize();
    
    iVoiceTxQueue.DoInit();
    iVideoTxQueue.DoInit();
    iBestEffortTxQueue.DoInit();
    iBackgroundTxQueue.DoInit();
    iFreeQueue.DoInit();

    for ( TUint i = 0; i < KTxPoolSizeInPackets; i++ )
        {
        // Set the default values
        
        iDataBuffers[i].FrameType( TDataBuffer::KEthernetFrame );
        iDataBuffers[i].KeClearFlags( TDataBuffer::KTxFrameMustNotBeEncrypted );
        iDataBuffers[i].SetLength( 0 );
        iDataBuffers[i].SetUserPriority( 0 );
        
        iFreeQueue.PutPacket( &iDataBuffers[i] );
        }
    
    iVoiceRxQueueFront = NULL;
    iVoiceRxQueueRear = NULL;

    iVideoRxQueueFront = NULL;
    iVideoRxQueueRear = NULL;
    
    iBestEffortRxQueueFront = NULL;
    iBestEffortRxQueueRear = NULL;
    
    iBackgroundRxQueueFront = NULL;
    iBackgroundRxQueueRear = NULL;
    }
// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void RFrameXferBlock::Initialize( TUint32 aTxBufLength )
    {
    // perform base class initialization first
    KeInitialize();
    
    iTxDataBuffer = NULL;
    iTxBufLength = aTxBufLength;
    
    iRxQueueFront = NULL;
    iRxQueueRear = NULL;
    }
CKeDemoApplication::CKeDemoApplication()
{
	std::string dxvs = 
		"float4 vs_main( float4 Pos : POSITION ) : SV_POSITION\n"
		"{\n"
		"    return Pos;\n"
		"}";
	std::string dxps = 
		"float4 ps_main( float4 Pos : SV_POSITION ) : SV_Target\n"
		"{\n"
		"    return float4( 1.0f, 1.0f, 0.0f, 1.0f );\n"
		"}";

	std::string glvs = 
		"#version 150\n"
		"in  vec3 in_pos;\n"
		"out vec4 out_colour;\n"

		"void main( void )\n"
		"{\n"
		"    gl_Position = vec4( in_pos.xyz, 1.0 );\n"
		"    out_colour = vec4( 1, 1, 1, 1 );\n"
		"}";
	std::string glfs = 
		"#version 150\n"
		"out vec4 colour;\n"
		"in vec4 out_colour;\n"

		"void main(void)\n"
		"{\n"
			"colour = out_colour;\n"
		"}";

    /*
     * Initialize Kunai Engine
     */
    KeInitialize();
    
    /*
     * Initialize a basic core OpenGL 3.x device
     */
    KeRenderDeviceDesc rddesc;
    
    ZeroMemory( &rddesc, sizeof( KeRenderDeviceDesc ) );
    rddesc.width = 640;
    rddesc.height = 480;
    rddesc.colour_bpp = 32;
    rddesc.depth_bpp = 24;
    rddesc.stencil_bpp = 8;
    rddesc.fullscreen = No;
    rddesc.buffer_count = 1;
    rddesc.device_type = KE_RENDERDEVICE_D3D11;
	rddesc.refresh_rate = 60;
    
    bool ret = KeCreateWindowAndDevice( &rddesc, &m_pRenderDevice );
    if( !ret )
    {
        DISPDBG( KE_ERROR, "Error initializing render device!" );
    }

	/*
	 * Initialize GPU program and geometry buffer
	 */
	KeVertexAttribute va[] = 
	{
		{ KE_VA_POSITION, 3, KE_FLOAT, No, sizeof(float)*3, 0 },
		{ -1, 0, 0, 0, 0 }
	};

	nv::vec3f vd[] = 
	{
		nv::vec3f( 1.0f, -1.0f, 0.0f ),
		nv::vec3f( -1.0f, -1.0f, 0.0f ),
		nv::vec3f( 0.0f, 1.0f, 0.0f ),
	};

	if( rddesc.device_type == KE_RENDERDEVICE_D3D11 )
		m_pRenderDevice->CreateProgram( dxvs.c_str(), dxps.c_str(), NULL, NULL, va, &m_pProgram );
	else
		m_pRenderDevice->CreateProgram( glvs.c_str(), glfs.c_str(), NULL, NULL, va, &m_pProgram );
	m_pRenderDevice->CreateGeometryBuffer( &vd, sizeof(nv::vec3f)*3, NULL, 0, 0, KE_USAGE_STATIC_WRITE, va, &m_pGB );

	if( m_pRenderDevice->CreateCommandList( &m_pCmdList ) )
	{
		if( m_pRenderDevice->BeginCommandList( m_pCmdList ) )
		{
			m_pRenderDevice->SetProgram( m_pProgram );
			m_pRenderDevice->SetGeometryBuffer( m_pGB );
			m_pRenderDevice->SetTexture( 0, NULL );

			float green[4] = { 0.0f, 0.5f, 0.0f, 1.0 };
			m_pRenderDevice->SetClearColourFV( green );
			m_pRenderDevice->SetClearDepth( 1.0f );
			m_pRenderDevice->SetClearStencil(0);
			m_pRenderDevice->Clear( KE_COLOUR_BUFFER | KE_DEPTH_BUFFER /*| KE_STENCIL_BUFFER*/ );
			m_pRenderDevice->DrawVertices( KE_TRIANGLES, sizeof(nv::vec3f), 0, 3 );

			m_pRenderDevice->EndCommandList( &m_pCmdList, Yes );
		}
	}
}