А всё-таки непонятно, как же выглядит адресное пространство PSP. Я попытался снять скриншот в моём пасьянсе копированием области, заданной GU как видеобуфер (т.е. начинающейся с 0 (!) - обычно-то для графических приложений не для GU задавался адрес 64 мБ)
<...>
static unsigned int staticOffset=0;
static unsigned int getMemorySize(unsigned int width,unsigned int height,unsigned int psm)
{
switch (psm)
{
case GU_PSM_T4: return((width*height)>>1);
case GU_PSM_T8: return(width*height);
case GU_PSM_5650:
case GU_PSM_5551:
case GU_PSM_4444:
case GU_PSM_T16: return(2*width*height);
case GU_PSM_8888:
case GU_PSM_T32: return(4*width*height);
default: return(0);
}
}
void* getStaticVramBuffer(unsigned int width,unsigned int height,unsigned int psm)
{
unsigned int memSize=getMemorySize(width,height,psm);
void* result=(void*)staticOffset;
staticOffset+=memSize;
return(result);
}
void* getStaticVramTexture(unsigned int width,unsigned int height,unsigned int psm)
{
void* result=getStaticVramBuffer(width,height,psm);
return((void*)(((unsigned int)result) + ((unsigned int)sceGeEdramGetAddr())));
}
<...>
void* fbp0=getStaticVramBuffer(512,272,GU_PSM_8888);
void* fbp1=getStaticVramBuffer(512,272,GU_PSM_8888);
void* zbp=getStaticVramBuffer(512,272,GU_PSM_4444);
//инициализируем графику GU
sceGuInit();
//запускаем на выполнение новый контекст дисплея - он должен выполниться сразу, т.к. GU_DIRECT
sceGuStart(GU_DIRECT,list);
//устанавливаем параметры буфера рисования- формат пикселя, указатель на область видеопамяти, длину строки (выровненную, а не физическую)
sceGuDrawBuffer(GU_PSM_8888,fbp0,512);
//устанавливаем параметры буфера экрана - размер экрана, указатель на видеопамять, длину строки
sceGuDispBuffer(480,272,fbp1,512);
//устанавливаем параметры буфера глубины- указатель на начало буфера глубины в видеопамяти и длину строки
sceGuDepthBuffer(zbp,512);
и ничего не вышло. Точнее, я выделил память через malloc и туда сделал memcpy с адреса fbp0 (и с fbp1 тоже пробовал). Приставка вырубается и перезагружается. Но ведь когда я работал с видео через прямое обращение к видеопамяти, то самое в 64 мБ, то всё работало отлично. Не понимаю я, где же реально расположена видеопамять и как так получается, что я могу указать видеопамять на каких-то адресах, где по какой-то случайности не попадает кусок моей программы? Я пытался GU дать адрес равный 64 мБ - на экране хаос точек. Эх, знать бы архитектуру и принципы управления памятью этого чуда...