Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

displaycontext.cpp

Go to the documentation of this file.
00001 #include "ps2s/displayenv.h"
00002 
00003 #include "GL/ps2gl.h"
00004 
00005 #include "ps2gl/displaycontext.h"
00006 #include "ps2gl/dlist.h"
00007 
00008 CDisplayContext::CDisplayContext( CGLContext &context )
00009    : GLContext(context),
00010      Frame0Mem(NULL), Frame1Mem(NULL),
00011      CurFrameMem(NULL), LastFrameMem(NULL),
00012      DisplayEnv(NULL),
00013      DisplayIsDblBuffered(true)
00014 {
00015    DisplayEnv = new GS::CDisplayEnv;
00016    // DisplayEnv->SetUseReadCircuit2( true );
00017 }
00018 
00019 CDisplayContext::~CDisplayContext()
00020 {
00021    // don't delete the frame mem areas -- they are created/destroyed by
00022    // the app
00023 
00024    delete DisplayEnv;
00025 }
00026      
00027 void
00028 CDisplayContext::SetDisplayBuffers( GS::CMemArea *frame0Mem, GS::CMemArea *frame1Mem )
00029 {
00030    Frame0Mem = frame0Mem;
00031    Frame1Mem = frame1Mem;
00032 
00033    DisplayIsDblBuffered = ( frame0Mem && frame1Mem );
00034 
00035    // "current" means the frame being drawn to by the loop of code executing on the core
00036    // "last" will be the frame being displayed if drawing immediately, or the frame not
00037    // displayed now if building up a packet to be sent next frame.
00038    CurFrameMem = Frame0Mem;
00039    LastFrameMem = Frame1Mem;
00040 
00041    int width = frame0Mem->GetWidth(), height = frame0Mem->GetHeight();
00042 
00043    DisplayEnv->SetFB2( frame0Mem->GetWordAddr(), width );
00044    DisplayEnv->SetDisplay2( width, height * 2 );
00045    DisplayEnv->SendSettings();
00046 }
00047 
00048 void
00049 CDisplayContext::SwapBuffers()
00050 {
00051    // flip frame buffer ptrs
00052    if ( DisplayIsDblBuffered ) {
00053       GS::CMemArea* temp = CurFrameMem;
00054       CurFrameMem = LastFrameMem;
00055       LastFrameMem = temp;
00056 
00057       // display the last completed frame (which is frame n-2 because we're not
00058       // drawing immediately but building up a packet)
00059       // remember this is immediately sent, not delayed through a packet
00060       DisplayEnv->SetFB2Addr( CurFrameMem->GetWordAddr() );
00061       DisplayEnv->SendSettings();
00062    }
00063 }
00064 
00065 /********************************************
00066  * ps2gl C interface
00067  */
00068 
00079 void
00080 pglSetDisplayBuffers( pgl_area_handle_t frame0_mem, pgl_area_handle_t frame1_mem )
00081 {
00082    pGLContext->GetDisplayContext().SetDisplayBuffers( reinterpret_cast<GS::CMemArea*>(frame0_mem),
00083                                                       reinterpret_cast<GS::CMemArea*>(frame1_mem) );
00084 }
00085  // pgl_api
00087 
00088 /********************************************
00089  * gl api
00090  */
00091 
00092 void glViewport( GLint x, GLint y,
00093                        GLsizei width, GLsizei height )
00094 {
00095    mNotImplemented( );
00096 }
00097 

ps2gl version 0.2