mirror of
https://github.com/aap/librw.git
synced 2025-02-18 02:06:33 +00:00
starting work on ps2 driver
This commit is contained in:
parent
e5c2a66bd5
commit
aec8c202c6
36
premake5.lua
36
premake5.lua
@ -12,8 +12,8 @@ workspace "librw"
|
|||||||
"win-amd64-null", "win-amd64-gl3", "win-amd64-d3d9" }
|
"win-amd64-null", "win-amd64-gl3", "win-amd64-d3d9" }
|
||||||
filter { "system:linux" }
|
filter { "system:linux" }
|
||||||
platforms { "linux-x86-null", "linux-x86-gl3",
|
platforms { "linux-x86-null", "linux-x86-gl3",
|
||||||
"linux-amd64-null", "linux-amd64-gl3" }
|
"linux-amd64-null", "linux-amd64-gl3",
|
||||||
-- TODO: ps2
|
"ps2" }
|
||||||
filter {}
|
filter {}
|
||||||
|
|
||||||
filter "configurations:Debug"
|
filter "configurations:Debug"
|
||||||
@ -31,8 +31,12 @@ workspace "librw"
|
|||||||
defines { "RW_GL3" }
|
defines { "RW_GL3" }
|
||||||
filter { "platforms:*d3d9" }
|
filter { "platforms:*d3d9" }
|
||||||
defines { "RW_D3D9" }
|
defines { "RW_D3D9" }
|
||||||
filter { "platforms:*ps2" }
|
filter { "platforms:ps2" }
|
||||||
defines { "RW_PS2" }
|
defines { "RW_PS2" }
|
||||||
|
toolset "gcc"
|
||||||
|
gccprefix 'ee-'
|
||||||
|
buildoptions { "-nostdlib", "-fno-common" }
|
||||||
|
includedirs { "$(PS2SDK)/ee/include", "$(PS2SDK)/common/include" }
|
||||||
|
|
||||||
filter { "platforms:*amd64*" }
|
filter { "platforms:*amd64*" }
|
||||||
architecture "x86_64"
|
architecture "x86_64"
|
||||||
@ -110,9 +114,35 @@ function skeltool(dir)
|
|||||||
findlibs()
|
findlibs()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function vucode()
|
||||||
|
filter "files:**.dsm"
|
||||||
|
buildcommands {
|
||||||
|
'cpp "%{file.relpath}" | dvp-as -o "%{cfg.objdir}/%{file.basename}.o"'
|
||||||
|
}
|
||||||
|
buildoutputs { '%{cfg.objdir}/%{file.basename}.o' }
|
||||||
|
filter {}
|
||||||
|
end
|
||||||
|
|
||||||
project "clumpview"
|
project "clumpview"
|
||||||
kind "WindowedApp"
|
kind "WindowedApp"
|
||||||
characterset ("MBCS")
|
characterset ("MBCS")
|
||||||
skeltool("clumpview")
|
skeltool("clumpview")
|
||||||
flags { "WinMain" }
|
flags { "WinMain" }
|
||||||
removeplatforms { "*null" }
|
removeplatforms { "*null" }
|
||||||
|
|
||||||
|
project "ps2test"
|
||||||
|
kind "ConsoleApp"
|
||||||
|
targetdir (Bindir)
|
||||||
|
vucode()
|
||||||
|
removeplatforms { "*gl3", "*d3d9", "*null" }
|
||||||
|
targetextension '.elf'
|
||||||
|
includedirs { "." }
|
||||||
|
files { "tools/ps2test/*.cpp",
|
||||||
|
"tools/ps2test/vu/*.dsm",
|
||||||
|
"tools/ps2test/*.h" }
|
||||||
|
linkoptions '$(PS2SDK)/ee/startup/crt0.o'
|
||||||
|
linkoptions { '-mno-crt0', "-T$(PS2SDK)/ee/startup/linkfile" }
|
||||||
|
libdirs { "$(PS2SDK)/ee/lib" }
|
||||||
|
links { "librw" }
|
||||||
|
-- "c -lc" is a hack because we need -lc twice for some reason
|
||||||
|
links { "c -lc", "kernel", "mf" }
|
||||||
|
17
src/base.cpp
Normal file → Executable file
17
src/base.cpp
Normal file → Executable file
@ -261,6 +261,7 @@ Matrix::translate(V3d *translation, CombineOp op)
|
|||||||
Matrix tmp;
|
Matrix tmp;
|
||||||
Matrix trans = identMat;
|
Matrix trans = identMat;
|
||||||
trans.pos = *translation;
|
trans.pos = *translation;
|
||||||
|
trans.flags &= ~IDENTITY;
|
||||||
switch(op){
|
switch(op){
|
||||||
case COMBINEREPLACE:
|
case COMBINEREPLACE:
|
||||||
*this = trans;
|
*this = trans;
|
||||||
@ -483,22 +484,6 @@ Matrix::identityError(void)
|
|||||||
return dot(r,r) + dot(u,u) + dot(a,a) + dot(pos,pos);
|
return dot(r,r) + dot(u,u) + dot(a,a) + dot(pos,pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
bool32
|
|
||||||
Matrix::isIdentity(void)
|
|
||||||
{
|
|
||||||
return matrixIsIdentity((float32*)this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Matrix::transpose(Matrix *m1, Matrix *m2)
|
|
||||||
{
|
|
||||||
matrixTranspose((float32*)m1, (float32*)m2);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define PSEP_C '/'
|
#define PSEP_C '/'
|
||||||
#define PSEP_S "/"
|
#define PSEP_S "/"
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
56
src/camera.cpp
Normal file → Executable file
56
src/camera.cpp
Normal file → Executable file
@ -184,7 +184,21 @@ cameraSync(ObjectWithFrame *obj)
|
|||||||
* and to clip space are handled by separate matrices there.
|
* and to clip space are handled by separate matrices there.
|
||||||
* On these platforms the two matrices are built in the platform's
|
* On these platforms the two matrices are built in the platform's
|
||||||
* beginUpdate function.
|
* beginUpdate function.
|
||||||
* On the PS2 the 1/2 translation/shear is removed again on the VU1.
|
* On the PS2 the z- and w-rows are the same and the
|
||||||
|
* 1/2 translation/shear is removed again on the VU1 by
|
||||||
|
* subtracting the w-row/2 from the x- and y-rows.
|
||||||
|
*
|
||||||
|
* perspective:
|
||||||
|
* 1/2w 0 ox/2w -ox/2w
|
||||||
|
* 0 -1/2h -oy/2h oy/2h
|
||||||
|
* 0 0 1 0
|
||||||
|
* 0 0 1 0
|
||||||
|
*
|
||||||
|
* parallel:
|
||||||
|
* 1/2w 0 ox/2w -ox/2w
|
||||||
|
* 0 -1/2h -oy/2h oy/2h
|
||||||
|
* 0 0 1 0
|
||||||
|
* 0 0 0 1
|
||||||
*
|
*
|
||||||
* RW builds this matrix directly without using explicit
|
* RW builds this matrix directly without using explicit
|
||||||
* inversion and matrix multiplication.
|
* inversion and matrix multiplication.
|
||||||
@ -193,8 +207,8 @@ cameraSync(ObjectWithFrame *obj)
|
|||||||
Camera *cam = (Camera*)obj;
|
Camera *cam = (Camera*)obj;
|
||||||
Matrix inv, proj;
|
Matrix inv, proj;
|
||||||
Matrix::invertOrthonormal(&inv, cam->getFrame()->getLTM());
|
Matrix::invertOrthonormal(&inv, cam->getFrame()->getLTM());
|
||||||
float32 xscl = 2.0f/cam->viewWindow.x;
|
float32 xscl = 1.0f/(2.0f*cam->viewWindow.x);
|
||||||
float32 yscl = 2.0f/cam->viewWindow.y;
|
float32 yscl = 1.0f/(2.0f*cam->viewWindow.y);
|
||||||
|
|
||||||
proj.flags = 0;
|
proj.flags = 0;
|
||||||
proj.right.x = xscl;
|
proj.right.x = xscl;
|
||||||
@ -351,6 +365,8 @@ Camera::setNearPlane(float32 near)
|
|||||||
{
|
{
|
||||||
this->nearPlane = near;
|
this->nearPlane = near;
|
||||||
calczShiftScale(this);
|
calczShiftScale(this);
|
||||||
|
if(this->getFrame())
|
||||||
|
this->getFrame()->updateObjects();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -358,6 +374,32 @@ Camera::setFarPlane(float32 far)
|
|||||||
{
|
{
|
||||||
this->farPlane = far;
|
this->farPlane = far;
|
||||||
calczShiftScale(this);
|
calczShiftScale(this);
|
||||||
|
if(this->getFrame())
|
||||||
|
this->getFrame()->updateObjects();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Camera::setViewWindow(const V2d *window)
|
||||||
|
{
|
||||||
|
this->viewWindow = *window;
|
||||||
|
if(this->getFrame())
|
||||||
|
this->getFrame()->updateObjects();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Camera::setViewOffset(const V2d *offset)
|
||||||
|
{
|
||||||
|
this->viewOffset = *offset;
|
||||||
|
if(this->getFrame())
|
||||||
|
this->getFrame()->updateObjects();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Camera::setProjection(int32 proj)
|
||||||
|
{
|
||||||
|
this->projection = proj;
|
||||||
|
if(this->getFrame())
|
||||||
|
this->getFrame()->updateObjects();
|
||||||
}
|
}
|
||||||
|
|
||||||
int32
|
int32
|
||||||
@ -433,10 +475,12 @@ Camera::streamGetSize(void)
|
|||||||
void
|
void
|
||||||
Camera::setFOV(float32 fov, float32 ratio)
|
Camera::setFOV(float32 fov, float32 ratio)
|
||||||
{
|
{
|
||||||
|
V2d v;
|
||||||
float32 a = tan(fov*3.14159f/360.0f);
|
float32 a = tan(fov*3.14159f/360.0f);
|
||||||
this->viewWindow.x = a;
|
v.set(a, a/ratio);
|
||||||
this->viewWindow.y = a/ratio;
|
this->setViewWindow(&v);
|
||||||
this->viewOffset.set(0.0f, 0.0f);
|
v.set(0.0f, 0.0f);
|
||||||
|
this->setViewOffset(&v);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
0
src/d3d/d3ddriver.cpp → src/d3d/d3ddevice.cpp
Normal file → Executable file
0
src/d3d/d3ddriver.cpp → src/d3d/d3ddevice.cpp
Normal file → Executable file
8
src/engine.cpp
Normal file → Executable file
8
src/engine.cpp
Normal file → Executable file
@ -74,7 +74,9 @@ Engine::open(void)
|
|||||||
|
|
||||||
// Initialize device
|
// Initialize device
|
||||||
// Device and possibly OS specific!
|
// Device and possibly OS specific!
|
||||||
#ifdef RW_GL3
|
#ifdef RW_PS2
|
||||||
|
engine->device = ps2::renderdevice;
|
||||||
|
#elif RW_GL3
|
||||||
engine->device = gl3::renderdevice;
|
engine->device = gl3::renderdevice;
|
||||||
#elif RW_D3D9
|
#elif RW_D3D9
|
||||||
engine->device = d3d::renderdevice;
|
engine->device = d3d::renderdevice;
|
||||||
@ -196,7 +198,7 @@ rasterToImage(Raster*)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
devicesystem(DeviceReq req, void *arg0)
|
deviceSystem(DeviceReq req, void *arg0)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -210,7 +212,7 @@ Device renderdevice = {
|
|||||||
null::setRenderState,
|
null::setRenderState,
|
||||||
null::getRenderState,
|
null::getRenderState,
|
||||||
null::im2DRenderIndexedPrimitive,
|
null::im2DRenderIndexedPrimitive,
|
||||||
null::devicesystem
|
null::deviceSystem
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
0
src/gl/gl3driver.cpp → src/gl/gl3device.cpp
Normal file → Executable file
0
src/gl/gl3driver.cpp → src/gl/gl3device.cpp
Normal file → Executable file
2
src/matfx.cpp
Normal file → Executable file
2
src/matfx.cpp
Normal file → Executable file
@ -145,7 +145,7 @@ MatFX::get(Material *m)
|
|||||||
return *PLUGINOFFSET(MatFX*, m, matFXGlobals.materialOffset);
|
return *PLUGINOFFSET(MatFX*, m, matFXGlobals.materialOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32
|
int32
|
||||||
MatFX::getEffectIndex(uint32 type)
|
MatFX::getEffectIndex(uint32 type)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < 2; i++)
|
for(int i = 0; i < 2; i++)
|
||||||
|
1
src/pipeline.cpp
Normal file → Executable file
1
src/pipeline.cpp
Normal file → Executable file
@ -7,7 +7,6 @@
|
|||||||
#include "rwplg.h"
|
#include "rwplg.h"
|
||||||
#include "rwpipeline.h"
|
#include "rwpipeline.h"
|
||||||
#include "rwobjects.h"
|
#include "rwobjects.h"
|
||||||
#include "ps2/rwps2.h"
|
|
||||||
|
|
||||||
#define COLOR_ARGB(a,r,g,b) \
|
#define COLOR_ARGB(a,r,g,b) \
|
||||||
((uint32)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))
|
((uint32)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))
|
||||||
|
1
src/ps2/pds.cpp
Normal file → Executable file
1
src/ps2/pds.cpp
Normal file → Executable file
@ -7,6 +7,7 @@
|
|||||||
#include "../rwplg.h"
|
#include "../rwplg.h"
|
||||||
#include "../rwpipeline.h"
|
#include "../rwpipeline.h"
|
||||||
#include "../rwobjects.h"
|
#include "../rwobjects.h"
|
||||||
|
#include "../rwengine.h"
|
||||||
#include "../rwanim.h"
|
#include "../rwanim.h"
|
||||||
#include "../rwplugins.h"
|
#include "../rwplugins.h"
|
||||||
#include "rwps2.h"
|
#include "rwps2.h"
|
||||||
|
47
src/ps2/ps2.cpp
Normal file → Executable file
47
src/ps2/ps2.cpp
Normal file → Executable file
@ -92,7 +92,6 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
|||||||
uint32 buf[2];
|
uint32 buf[2];
|
||||||
stream->read(buf, 8);
|
stream->read(buf, 8);
|
||||||
instance->dataSize = buf[0];
|
instance->dataSize = buf[0];
|
||||||
instance->arePointersFixed = buf[1];
|
|
||||||
// TODO: force alignment
|
// TODO: force alignment
|
||||||
instance->data = new uint8[instance->dataSize];
|
instance->data = new uint8[instance->dataSize];
|
||||||
#ifdef RW_PS2
|
#ifdef RW_PS2
|
||||||
@ -100,6 +99,10 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
|||||||
assert(a % 0x10 == 0);
|
assert(a % 0x10 == 0);
|
||||||
#endif
|
#endif
|
||||||
stream->read(instance->data, instance->dataSize);
|
stream->read(instance->data, instance->dataSize);
|
||||||
|
#ifdef RW_PS2
|
||||||
|
if(!buf[1])
|
||||||
|
fixDmaOffsets(instance);
|
||||||
|
#endif
|
||||||
instance->material = geometry->meshHeader->mesh[i].material;
|
instance->material = geometry->meshHeader->mesh[i].material;
|
||||||
// sizedebug(instance);
|
// sizedebug(instance);
|
||||||
}
|
}
|
||||||
@ -118,13 +121,15 @@ writeNativeData(Stream *stream, int32 len, void *object, int32, int32)
|
|||||||
InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData;
|
InstanceDataHeader *header = (InstanceDataHeader*)geometry->instData;
|
||||||
for(uint32 i = 0; i < header->numMeshes; i++){
|
for(uint32 i = 0; i < header->numMeshes; i++){
|
||||||
InstanceData *instance = &header->instanceMeshes[i];
|
InstanceData *instance = &header->instanceMeshes[i];
|
||||||
if(instance->arePointersFixed == 2)
|
|
||||||
unfixDmaOffsets(instance);
|
|
||||||
uint32 buf[2];
|
uint32 buf[2];
|
||||||
buf[0] = instance->dataSize;
|
buf[0] = instance->dataSize;
|
||||||
buf[1] = instance->arePointersFixed;
|
buf[1] = unfixDmaOffsets(instance);
|
||||||
stream->write(buf, 8);
|
stream->write(buf, 8);
|
||||||
stream->write(instance->data, instance->dataSize);
|
stream->write(instance->data, instance->dataSize);
|
||||||
|
#ifdef RW_PS2
|
||||||
|
if(!buf[1])
|
||||||
|
fixDmaOffsets(instance);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
@ -157,13 +162,11 @@ registerNativeDataPlugin(void)
|
|||||||
getSizeNativeData);
|
getSizeNativeData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Patch DMA ref ADDR fields to point to the actual data.
|
||||||
#ifdef RW_PS2
|
#ifdef RW_PS2
|
||||||
void
|
void
|
||||||
fixDmaOffsets(InstanceData *inst)
|
fixDmaOffsets(InstanceData *inst)
|
||||||
{
|
{
|
||||||
if(inst->arePointersFixed)
|
|
||||||
return;
|
|
||||||
|
|
||||||
uint32 base = (uint32)inst->data;
|
uint32 base = (uint32)inst->data;
|
||||||
uint32 *tag = (uint32*)inst->data;
|
uint32 *tag = (uint32*)inst->data;
|
||||||
for(;;){
|
for(;;){
|
||||||
@ -184,7 +187,6 @@ fixDmaOffsets(InstanceData *inst)
|
|||||||
// DMAret
|
// DMAret
|
||||||
case 0x60000000:
|
case 0x60000000:
|
||||||
// we're done
|
// we're done
|
||||||
inst->arePointersFixed = 2;
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -195,15 +197,17 @@ fixDmaOffsets(InstanceData *inst)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
// Patch DMA ref ADDR fields to qword offsets and return whether
|
||||||
|
// no ref tags were found.
|
||||||
|
// Only under RW_PS2 are the addresses actually patched but we need
|
||||||
|
// the return value for streaming out.
|
||||||
|
bool32
|
||||||
unfixDmaOffsets(InstanceData *inst)
|
unfixDmaOffsets(InstanceData *inst)
|
||||||
{
|
{
|
||||||
(void)inst;
|
bool32 norefs = 1;
|
||||||
#ifdef RW_PS2
|
#ifdef RW_PS2
|
||||||
if(inst->arePointersFixed != 2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
uint32 base = (uint32)inst->data;
|
uint32 base = (uint32)inst->data;
|
||||||
|
#endif
|
||||||
uint32 *tag = (uint32*)inst->data;
|
uint32 *tag = (uint32*)inst->data;
|
||||||
for(;;){
|
for(;;){
|
||||||
switch(tag[0]&0x70000000){
|
switch(tag[0]&0x70000000){
|
||||||
@ -215,23 +219,23 @@ unfixDmaOffsets(InstanceData *inst)
|
|||||||
|
|
||||||
// DMAref
|
// DMAref
|
||||||
case 0x30000000:
|
case 0x30000000:
|
||||||
|
norefs = 0;
|
||||||
// unfix address and jump to next
|
// unfix address and jump to next
|
||||||
|
#ifdef RW_PS2
|
||||||
tag[1] = (tag[1] - base)>>4;
|
tag[1] = (tag[1] - base)>>4;
|
||||||
|
#endif
|
||||||
tag += 4;
|
tag += 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// DMAret
|
// DMAret
|
||||||
case 0x60000000:
|
case 0x60000000:
|
||||||
// we're done
|
return norefs;
|
||||||
inst->arePointersFixed = 0;
|
|
||||||
return;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "error: unknown DMAtag %X\n", tag[0]);
|
fprintf(stderr, "error: unknown DMAtag %X\n", tag[0]);
|
||||||
return;
|
return norefs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pipeline
|
// Pipeline
|
||||||
@ -586,7 +590,6 @@ MatPipeline::instance(Geometry *g, InstanceData *inst, Mesh *m)
|
|||||||
InstMeshInfo im = getInstMeshInfo(this, g, m);
|
InstMeshInfo im = getInstMeshInfo(this, g, m);
|
||||||
|
|
||||||
inst->dataSize = (im.size+im.size2)<<4;
|
inst->dataSize = (im.size+im.size2)<<4;
|
||||||
inst->arePointersFixed = im.numBrokenAttribs == 0;
|
|
||||||
// TODO: force alignment
|
// TODO: force alignment
|
||||||
inst->data = new uint8[inst->dataSize];
|
inst->data = new uint8[inst->dataSize];
|
||||||
|
|
||||||
@ -685,6 +688,8 @@ MatPipeline::instance(Geometry *g, InstanceData *inst, Mesh *m)
|
|||||||
|
|
||||||
if(this->instanceCB)
|
if(this->instanceCB)
|
||||||
this->instanceCB(this, g, m, datap);
|
this->instanceCB(this, g, m, datap);
|
||||||
|
if(im.numBrokenAttribs)
|
||||||
|
fixDmaOffsets(inst);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8*
|
uint8*
|
||||||
@ -766,6 +771,7 @@ objInstance(rw::ObjPipeline *rwpipe, Atomic *atomic)
|
|||||||
geo->flags |= Geometry::NATIVE;
|
geo->flags |= Geometry::NATIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
static void
|
static void
|
||||||
printVertCounts(InstanceData *inst, int flag)
|
printVertCounts(InstanceData *inst, int flag)
|
||||||
{
|
{
|
||||||
@ -794,6 +800,7 @@ printVertCounts(InstanceData *inst, int flag)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
objUninstance(rw::ObjPipeline *rwpipe, Atomic *atomic)
|
objUninstance(rw::ObjPipeline *rwpipe, Atomic *atomic)
|
||||||
@ -1241,6 +1248,7 @@ registerADCPlugin(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// misc stuff
|
// misc stuff
|
||||||
|
/*
|
||||||
|
|
||||||
void
|
void
|
||||||
printDMA(InstanceData *inst)
|
printDMA(InstanceData *inst)
|
||||||
@ -1300,6 +1308,7 @@ sizedebug(InstanceData *inst)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
41
src/ps2/ps2device.cpp
Executable file
41
src/ps2/ps2device.cpp
Executable file
@ -0,0 +1,41 @@
|
|||||||
|
#ifdef RW_PS2
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "../rwbase.h"
|
||||||
|
#include "../rwerror.h"
|
||||||
|
#include "../rwplg.h"
|
||||||
|
#include "../rwpipeline.h"
|
||||||
|
#include "../rwobjects.h"
|
||||||
|
#include "../rwengine.h"
|
||||||
|
#include "../rwanim.h"
|
||||||
|
#include "../rwplugins.h"
|
||||||
|
#include "rwps2.h"
|
||||||
|
#include "rwps2plg.h"
|
||||||
|
|
||||||
|
#include "rwps2impl.h"
|
||||||
|
|
||||||
|
#define PLUGIN_ID 2
|
||||||
|
|
||||||
|
namespace rw {
|
||||||
|
namespace ps2 {
|
||||||
|
|
||||||
|
Device renderdevice = {
|
||||||
|
16777215.0f, 0.0f,
|
||||||
|
null::beginUpdate,
|
||||||
|
null::endUpdate,
|
||||||
|
null::clearCamera,
|
||||||
|
null::showRaster,
|
||||||
|
null::setRenderState,
|
||||||
|
null::getRenderState,
|
||||||
|
null::im2DRenderIndexedPrimitive,
|
||||||
|
null::deviceSystem
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
20
src/ps2/rwps2.h
Normal file → Executable file
20
src/ps2/rwps2.h
Normal file → Executable file
@ -1,15 +1,19 @@
|
|||||||
namespace rw {
|
namespace rw {
|
||||||
|
|
||||||
|
#ifdef RW_PS2
|
||||||
|
struct EngineStartParams
|
||||||
|
{
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace ps2 {
|
namespace ps2 {
|
||||||
|
|
||||||
void initializePlatform(void);
|
void initializePlatform(void);
|
||||||
|
|
||||||
|
extern Device renderdevice;
|
||||||
|
|
||||||
struct InstanceData
|
struct InstanceData
|
||||||
{
|
{
|
||||||
// 0 - addresses in ref tags need fixing
|
|
||||||
// 1 - no ref tags, so no fixing
|
|
||||||
// set by the program:
|
|
||||||
// 2 - ref tags are fixed, need to unfix before stream write
|
|
||||||
uint32 arePointersFixed;
|
|
||||||
uint32 dataSize;
|
uint32 dataSize;
|
||||||
uint8 *data;
|
uint8 *data;
|
||||||
Material *material;
|
Material *material;
|
||||||
@ -57,10 +61,8 @@ void registerNativeDataPlugin(void);
|
|||||||
void printDMA(InstanceData *inst);
|
void printDMA(InstanceData *inst);
|
||||||
void sizedebug(InstanceData *inst);
|
void sizedebug(InstanceData *inst);
|
||||||
|
|
||||||
// only RW_PS2
|
void fixDmaOffsets(InstanceData *inst); // only RW_PS2
|
||||||
void fixDmaOffsets(InstanceData *inst);
|
int32 unfixDmaOffsets(InstanceData *inst);
|
||||||
void unfixDmaOffsets(InstanceData *inst);
|
|
||||||
//
|
|
||||||
|
|
||||||
struct PipeAttribute
|
struct PipeAttribute
|
||||||
{
|
{
|
||||||
|
3
src/rwengine.h
Normal file → Executable file
3
src/rwengine.h
Normal file → Executable file
@ -140,6 +140,7 @@ namespace null {
|
|||||||
void beginUpdate(Camera*);
|
void beginUpdate(Camera*);
|
||||||
void endUpdate(Camera*);
|
void endUpdate(Camera*);
|
||||||
void clearCamera(Camera*, RGBA *col, uint32 mode);
|
void clearCamera(Camera*, RGBA *col, uint32 mode);
|
||||||
|
void showRaster(Raster*);
|
||||||
|
|
||||||
void setRenderState(int32 state, uint32 value);
|
void setRenderState(int32 state, uint32 value);
|
||||||
uint32 getRenderState(int32 state);
|
uint32 getRenderState(int32 state);
|
||||||
@ -154,7 +155,7 @@ namespace null {
|
|||||||
void im2DRenderIndexedPrimitive(PrimitiveType,
|
void im2DRenderIndexedPrimitive(PrimitiveType,
|
||||||
void*, int32, void*, int32);
|
void*, int32, void*, int32);
|
||||||
|
|
||||||
int deviceSystem(DeviceReq req);
|
int deviceSystem(DeviceReq req, void*);
|
||||||
|
|
||||||
extern Device renderdevice;
|
extern Device renderdevice;
|
||||||
}
|
}
|
||||||
|
3
src/rwobjects.h
Normal file → Executable file
3
src/rwobjects.h
Normal file → Executable file
@ -624,6 +624,9 @@ struct Camera
|
|||||||
void showRaster(void);
|
void showRaster(void);
|
||||||
void setNearPlane(float32);
|
void setNearPlane(float32);
|
||||||
void setFarPlane(float32);
|
void setFarPlane(float32);
|
||||||
|
void setViewWindow(const V2d *window);
|
||||||
|
void setViewOffset(const V2d *offset);
|
||||||
|
void setProjection(int32 proj);
|
||||||
int32 frustumTestSphere(Sphere *s);
|
int32 frustumTestSphere(Sphere *s);
|
||||||
static Camera *streamRead(Stream *stream);
|
static Camera *streamRead(Stream *stream);
|
||||||
bool streamWrite(Stream *stream);
|
bool streamWrite(Stream *stream);
|
||||||
|
2
src/rwplugins.h
Normal file → Executable file
2
src/rwplugins.h
Normal file → Executable file
@ -130,7 +130,7 @@ struct MatFX
|
|||||||
static void setEffects(Material *m, uint32 flags);
|
static void setEffects(Material *m, uint32 flags);
|
||||||
static uint32 getEffects(Material *m);
|
static uint32 getEffects(Material *m);
|
||||||
static MatFX *get(Material *m);
|
static MatFX *get(Material *m);
|
||||||
uint32 getEffectIndex(uint32 type);
|
int32 getEffectIndex(uint32 type);
|
||||||
void setBumpTexture(Texture *t);
|
void setBumpTexture(Texture *t);
|
||||||
void setBumpCoefficient(float32 coef);
|
void setBumpCoefficient(float32 coef);
|
||||||
void setEnvTexture(Texture *t);
|
void setEnvTexture(Texture *t);
|
||||||
|
7
src/world.cpp
Normal file → Executable file
7
src/world.cpp
Normal file → Executable file
@ -35,14 +35,19 @@ World::addLight(Light *light)
|
|||||||
light->world = this;
|
light->world = this;
|
||||||
if(light->getType() < Light::POINT){
|
if(light->getType() < Light::POINT){
|
||||||
this->directionalLights.append(&light->inWorld);
|
this->directionalLights.append(&light->inWorld);
|
||||||
}else
|
}else{
|
||||||
this->lights.append(&light->inWorld);
|
this->lights.append(&light->inWorld);
|
||||||
|
if(light->getFrame())
|
||||||
|
light->getFrame()->updateObjects();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
World::addCamera(Camera *cam)
|
World::addCamera(Camera *cam)
|
||||||
{
|
{
|
||||||
cam->world = this;
|
cam->world = this;
|
||||||
|
if(cam->getFrame())
|
||||||
|
cam->getFrame()->updateObjects();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
437
tools/ps2test/gs.h
Executable file
437
tools/ps2test/gs.h
Executable file
@ -0,0 +1,437 @@
|
|||||||
|
#define GS_NONINTERLACED 0
|
||||||
|
#define GS_INTERLACED 1
|
||||||
|
|
||||||
|
#define GS_NTSC 2
|
||||||
|
#define GS_PAL 3
|
||||||
|
#define GS_VESA1A 0x1a
|
||||||
|
#define GS_VESA1B 0x1b
|
||||||
|
#define GS_VESA1C 0x1c
|
||||||
|
#define GS_VESA1D 0x1d
|
||||||
|
#define GS_VESA2A 0x2a
|
||||||
|
#define GS_VESA2B 0x2b
|
||||||
|
#define GS_VESA2C 0x2c
|
||||||
|
#define GS_VESA2D 0x2d
|
||||||
|
#define GS_VESA2E 0x2e
|
||||||
|
#define GS_VESA3B 0x3b
|
||||||
|
#define GS_VESA3C 0x3c
|
||||||
|
#define GS_VESA3D 0x3d
|
||||||
|
#define GS_VESA3E 0x3e
|
||||||
|
#define GS_VESA4A 0x4a
|
||||||
|
#define GS_VESA4B 0x4b
|
||||||
|
#define GS_DTV480P 0x50
|
||||||
|
|
||||||
|
#define GS_FIELD 0
|
||||||
|
#define GS_FRAME 1
|
||||||
|
|
||||||
|
#define GS_PSMCT32 0
|
||||||
|
#define GS_PSMCT24 1
|
||||||
|
#define GS_PSMCT16 2
|
||||||
|
#define GS_PSMCT16S 10
|
||||||
|
#define GS_PS_GPU24 18
|
||||||
|
|
||||||
|
#define GS_PSMZ32 0
|
||||||
|
#define GS_PSMZ24 1
|
||||||
|
#define GS_PSMZ16 2
|
||||||
|
#define GS_PSMZ16S 10
|
||||||
|
|
||||||
|
#define GS_ZTST_NEVER 0
|
||||||
|
#define GS_ZTST_ALWAYS 1
|
||||||
|
#define GS_ZTST_GREATER 2
|
||||||
|
#define GS_ZTST_GEQUAL 3
|
||||||
|
|
||||||
|
#define GS_PRIM_POINT 0
|
||||||
|
#define GS_PRIM_LINE 1
|
||||||
|
#define GS_PRIM_LINE_STRIP 2
|
||||||
|
#define GS_PRIM_TRI 3
|
||||||
|
#define GS_PRIM_TRI_STRIP 4
|
||||||
|
#define GS_PRIM_TRI_FAN 5
|
||||||
|
#define GS_PRIM_SPRITE 6
|
||||||
|
#define GS_PRIM_NO_SPEC 7
|
||||||
|
#define GS_IIP_FLAT 0
|
||||||
|
#define GS_IIP_GOURAUD 1
|
||||||
|
|
||||||
|
/* GS general purpose registers */
|
||||||
|
|
||||||
|
#define GS_PRIM 0x00
|
||||||
|
#define GS_RGBAQ 0x01
|
||||||
|
#define GS_ST 0x02
|
||||||
|
#define GS_UV 0x03
|
||||||
|
#define GS_XYZF2 0x04
|
||||||
|
#define GS_XYZ2 0x05
|
||||||
|
#define GS_TEX0_1 0x06
|
||||||
|
#define GS_TEX0_2 0x07
|
||||||
|
#define GS_CLAMP_1 0x08
|
||||||
|
#define GS_CLAMP_2 0x09
|
||||||
|
#define GS_FOG 0x0a
|
||||||
|
#define GS_XYZF3 0x0c
|
||||||
|
#define GS_XYZ3 0x0d
|
||||||
|
#define GS_TEX1_1 0x14
|
||||||
|
#define GS_TEX1_2 0x15
|
||||||
|
#define GS_TEX2_1 0x16
|
||||||
|
#define GS_TEX2_2 0x17
|
||||||
|
#define GS_XYOFFSET_1 0x18
|
||||||
|
#define GS_XYOFFSET_2 0x19
|
||||||
|
#define GS_PRMODECONT 0x1a
|
||||||
|
#define GS_PRMODE 0x1b
|
||||||
|
#define GS_TEXCLUT 0x1c
|
||||||
|
#define GS_SCANMSK 0x22
|
||||||
|
#define GS_MIPTBP1_1 0x34
|
||||||
|
#define GS_MIPTBP1_2 0x35
|
||||||
|
#define GS_MIPTBP2_1 0x36
|
||||||
|
#define GS_MIPTBP2_2 0x37
|
||||||
|
#define GS_TEXA 0x3b
|
||||||
|
#define GS_FOGCOL 0x3d
|
||||||
|
#define GS_TEXFLUSH 0x3f
|
||||||
|
#define GS_SCISSOR_1 0x40
|
||||||
|
#define GS_SCISSOR_2 0x41
|
||||||
|
#define GS_ALPHA_1 0x42
|
||||||
|
#define GS_ALPHA_2 0x43
|
||||||
|
#define GS_DIMX 0x44
|
||||||
|
#define GS_DTHE 0x45
|
||||||
|
#define GS_COLCLAMP 0x46
|
||||||
|
#define GS_TEST_1 0x47
|
||||||
|
#define GS_TEST_2 0x48
|
||||||
|
#define GS_PABE 0x49
|
||||||
|
#define GS_FBA_1 0x4a
|
||||||
|
#define GS_FBA_2 0x4b
|
||||||
|
#define GS_FRAME_1 0x4c
|
||||||
|
#define GS_FRAME_2 0x4d
|
||||||
|
#define GS_ZBUF_1 0x4e
|
||||||
|
#define GS_ZBUF_2 0x4f
|
||||||
|
#define GS_BITBLTBUF 0x50
|
||||||
|
#define GS_TRXPOS 0x51
|
||||||
|
#define GS_TRXREG 0x52
|
||||||
|
#define GS_TRXDIR 0x53
|
||||||
|
#define GS_HWREG 0x54
|
||||||
|
#define GS_SIGNAL 0x60
|
||||||
|
#define GS_FINISH 0x61
|
||||||
|
#define GS_LABEL 0x62
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 EN1 : 1;
|
||||||
|
uint64 EN2 : 1;
|
||||||
|
uint64 CRTMD : 3;
|
||||||
|
uint64 MMOD : 1;
|
||||||
|
uint64 AMOD : 1;
|
||||||
|
uint64 SLBG : 1;
|
||||||
|
uint64 ALP : 8;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsPmode;
|
||||||
|
|
||||||
|
#define GS_MAKE_PMODE(EN1,EN2,MMOD,AMOD,SLBG,ALP) \
|
||||||
|
(BIT64(EN1,0) | BIT64(EN2,1) | BIT64(1,2) | \
|
||||||
|
BIT64(MMOD,5) | BIT64(AMOD,6) | BIT64(SLBG,7) | BIT64(ALP,8))
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 INT : 1;
|
||||||
|
uint64 FFMD : 1;
|
||||||
|
uint64 DPMS : 2;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsSmode2;
|
||||||
|
|
||||||
|
#define GS_MAKE_SMODE2(INT,FFMD,DPMS) \
|
||||||
|
(BIT64(INT,0) | BIT64(FFMD,1) | BIT64(DPMS,2))
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 FBP : 9;
|
||||||
|
uint64 FBW : 6;
|
||||||
|
uint64 PSM : 5;
|
||||||
|
uint64 : 12;
|
||||||
|
uint64 DBX : 11;
|
||||||
|
uint64 DBY : 11;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsDispfb;
|
||||||
|
|
||||||
|
#define GS_MAKE_DISPFB(FBP,FBW,PSM,DBX,DBY) \
|
||||||
|
(BIT64(FBP,0) | BIT64(FBW,9) | BIT64(PSM,15) | \
|
||||||
|
BIT64(DBX,32) | BIT64(DBY,43))
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 DX : 12;
|
||||||
|
uint64 DY : 11;
|
||||||
|
uint64 MAGH : 4;
|
||||||
|
uint64 MAGV : 2;
|
||||||
|
uint64 : 3;
|
||||||
|
uint64 DW : 12;
|
||||||
|
uint64 DH : 11;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsDisplay;
|
||||||
|
|
||||||
|
#define GS_MAKE_DISPLAY(DX,DY,MAGH,MAGV,DW,DH) \
|
||||||
|
(BIT64(DX,0) | BIT64(DY,12) | BIT64(MAGH,23) | \
|
||||||
|
BIT64(MAGV,27) | BIT64(DW,32) | BIT64(DH,44))
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 EXBP : 14;
|
||||||
|
uint64 EXBW : 6;
|
||||||
|
uint64 FBIN : 2;
|
||||||
|
uint64 WFFMD : 1;
|
||||||
|
uint64 EMODA : 2;
|
||||||
|
uint64 EMODC : 2;
|
||||||
|
uint64 : 5;
|
||||||
|
uint64 WDX : 11;
|
||||||
|
uint64 WDY : 11;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsExtbuf;
|
||||||
|
|
||||||
|
#define GS_MAKE_EXTBUF(EXBP,EXBW,FBIN,WFFMD,EMODA,EMODC,WDX,WDY) \
|
||||||
|
(BIT64(EXBP,0) | BIT64(EXBW,14) | BIT64(FBIN,20) | \
|
||||||
|
BIT64(WFFMD,22) | BIT64(EMODA,23) | BIT64(EMODC,25) | \
|
||||||
|
BIT64(WDX,32) | BIT64(WDY,43))
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 SX : 12;
|
||||||
|
uint64 SY : 11;
|
||||||
|
uint64 SMPH : 4;
|
||||||
|
uint64 SMPV : 2;
|
||||||
|
uint64 : 3;
|
||||||
|
uint64 WW : 12;
|
||||||
|
uint64 WH : 11;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsExtdata;
|
||||||
|
|
||||||
|
#define GS_MAKE_EXTDATA(SX,SY,SMPH,SMPV,WW,WH) \
|
||||||
|
(BIT64(SX,0) | BIT64(SY,12) | BIT64(SMPH,23) | \
|
||||||
|
BIT64(SMPV,27) | BIT64(WW,32) | BIT64(WH,44))
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 WRITE : 1;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsExtwrite;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 R : 8;
|
||||||
|
uint64 G : 8;
|
||||||
|
uint64 B : 8;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsBgcolor;
|
||||||
|
|
||||||
|
#define GS_MAKE_BGCOLOR(R,G,B) \
|
||||||
|
(BIT64(R,0) | BIT64(G,8) | BIT64(B,16))
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 SIGNAL : 1;
|
||||||
|
uint64 FINISH : 1;
|
||||||
|
uint64 HSINT : 1;
|
||||||
|
uint64 VSINT : 1;
|
||||||
|
uint64 EDWINT : 1;
|
||||||
|
uint64 : 3;
|
||||||
|
uint64 FLUSH : 1;
|
||||||
|
uint64 RESET : 1;
|
||||||
|
uint64 : 2;
|
||||||
|
uint64 NFIELD : 1;
|
||||||
|
uint64 FIELD : 1;
|
||||||
|
uint64 FIFO : 2;
|
||||||
|
uint64 REV : 8;
|
||||||
|
uint64 ID : 8;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsCsr;
|
||||||
|
|
||||||
|
#define GS_CSR_SIGNAL_O 0
|
||||||
|
#define GS_CSR_FINISH_O 1
|
||||||
|
#define GS_CSR_HSINT_O 2
|
||||||
|
#define GS_CSR_VSINT_O 3
|
||||||
|
#define GS_CSR_EDWINT_O 4
|
||||||
|
#define GS_CSR_FLUSH_O 8
|
||||||
|
#define GS_CSR_RESET_O 9
|
||||||
|
#define GS_CSR_NFIELD_O 12
|
||||||
|
#define GS_CSR_FIELD_O 13
|
||||||
|
#define GS_CSR_FIFO_O 14
|
||||||
|
#define GS_CSR_REV_O 16
|
||||||
|
#define GS_CSR_ID_O 24
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 : 8;
|
||||||
|
uint64 SIGMSK : 1;
|
||||||
|
uint64 FINISHMSK : 1;
|
||||||
|
uint64 HSMSKMSK : 1;
|
||||||
|
uint64 VSMSKMSK : 1;
|
||||||
|
uint64 EDWMSKMSK : 1;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsImr;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 DIR : 1;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsBusdir;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 SIGID : 32;
|
||||||
|
uint64 LBLID : 32;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsSiglblid;
|
||||||
|
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 FBP : 9;
|
||||||
|
uint64 : 7;
|
||||||
|
uint64 FBW : 6;
|
||||||
|
uint64 : 2;
|
||||||
|
uint64 PSM : 6;
|
||||||
|
uint64 : 2;
|
||||||
|
uint64 FBMSK : 32;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsFrame;
|
||||||
|
|
||||||
|
#define GS_MAKE_FRAME(FBP,FBW,PSM,FBMASK) \
|
||||||
|
(BIT64(FBP,0) | BIT64(FBW,16) | BIT64(PSM,24) | BIT64(FBMASK,32))
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 ZBP : 9;
|
||||||
|
uint64 : 15;
|
||||||
|
uint64 PSM : 4;
|
||||||
|
uint64 : 4;
|
||||||
|
uint64 ZMSDK : 1;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsZbuf;
|
||||||
|
|
||||||
|
#define GS_MAKE_ZBUF(ZBP,PSM,ZMSK) \
|
||||||
|
(BIT64(ZBP,0) | BIT64(PSM,24) | BIT64(ZMSK,32))
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 OFX : 16;
|
||||||
|
uint64 : 16;
|
||||||
|
uint64 OFY : 16;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsXyOffset;
|
||||||
|
|
||||||
|
#define GS_MAKE_XYOFFSET(OFX,OFY) \
|
||||||
|
(BIT64(OFX,0) | BIT64(OFY,32))
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
uint64 SCAX0 : 11;
|
||||||
|
uint64 : 5;
|
||||||
|
uint64 SCAX1 : 11;
|
||||||
|
uint64 : 5;
|
||||||
|
uint64 SCAY0 : 11;
|
||||||
|
uint64 : 5;
|
||||||
|
uint64 SCAY1 : 11;
|
||||||
|
} f;
|
||||||
|
uint64 d;
|
||||||
|
} GsScissor;
|
||||||
|
|
||||||
|
#define GS_MAKE_SCISSOR(SCAX0,SCAX1,SCAY0,SCAY1) \
|
||||||
|
(BIT64(SCAX0,0) | BIT64(SCAX1,16) | BIT64(SCAY0,32) | BIT64(SCAY1,48))
|
||||||
|
|
||||||
|
#define GS_MAKE_TEST(ATE,ATST,AREF,AFAIL,DATE,DATM,ZTE,ZTST) \
|
||||||
|
(BIT64(ATE,0) | BIT64(ATST,1) | BIT64(AREF,4) | BIT64(AFAIL,12) | \
|
||||||
|
BIT64(DATE,14) | BIT64(DATM,15) | BIT64(ZTE,16) | BIT64(ZTST,17))
|
||||||
|
|
||||||
|
#define GS_MAKE_PRIM(PRIM,IIP,TME,FGE,ABE,AA1,FST,CTXT,FIX) \
|
||||||
|
(BIT64(PRIM,0) | BIT64(IIP,3) | BIT64(TME,4) | BIT64(FGE,5) | \
|
||||||
|
BIT64(ABE,6) | BIT64(AA1,7) | BIT64(FST,8) | BIT64(CTXT,9) | BIT64(FIX,10))
|
||||||
|
|
||||||
|
#define GS_MAKE_RGBAQ(R,G,B,A,Q) \
|
||||||
|
(BIT64(R,0) | BIT64(G,8) | BIT64(B,16) | BIT64(A,24) | BIT64(Q,32))
|
||||||
|
|
||||||
|
#define GS_MAKE_XYZ(X,Y,Z) \
|
||||||
|
(BIT64(X,0) | BIT64(Y,16) | BIT64(Z,32))
|
||||||
|
|
||||||
|
#define GIF_PACKED 0
|
||||||
|
#define GIF_REGLIST 1
|
||||||
|
#define GIF_IMAGE 2
|
||||||
|
|
||||||
|
#define GIF_MAKE_TAG(NLOOP,EOP,PRE,PRIM,FLG,NREG) \
|
||||||
|
(BIT64(NLOOP,0) | BIT64(EOP,15) | BIT64(PRE,46) | \
|
||||||
|
BIT64(PRIM,47) | BIT64(FLG,58) | BIT64(NREG,60))
|
||||||
|
|
||||||
|
/* This is global and not tied to a user context because
|
||||||
|
* it is set up by kernel functions and not really changed
|
||||||
|
* afterwards. */
|
||||||
|
typedef struct GsCrtState GsCrtState;
|
||||||
|
struct GsCrtState
|
||||||
|
{
|
||||||
|
short inter, mode, ff;
|
||||||
|
};
|
||||||
|
extern GsCrtState gsCrtState;
|
||||||
|
|
||||||
|
typedef struct GsDispCtx GsDispCtx;
|
||||||
|
struct GsDispCtx
|
||||||
|
{
|
||||||
|
// two circuits
|
||||||
|
GsPmode pmode;
|
||||||
|
GsDispfb dispfb1;
|
||||||
|
GsDispfb dispfb2;
|
||||||
|
GsDisplay display1;
|
||||||
|
GsDisplay display2;
|
||||||
|
GsBgcolor bgcolor;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct GsDrawCtx GsDrawCtx;
|
||||||
|
struct GsDrawCtx
|
||||||
|
{
|
||||||
|
//two contexts
|
||||||
|
uint128 gifTag;
|
||||||
|
GsFrame frame1;
|
||||||
|
uint64 ad_frame1;
|
||||||
|
GsFrame frame2;
|
||||||
|
uint64 ad_frame2;
|
||||||
|
GsZbuf zbuf1;
|
||||||
|
uint64 ad_zbuf1;
|
||||||
|
GsZbuf zbuf2;
|
||||||
|
uint64 ad_zbuf2;
|
||||||
|
GsXyOffset xyoffset1;
|
||||||
|
uint64 ad_xyoffset1;
|
||||||
|
GsXyOffset xyoffset2;
|
||||||
|
uint64 ad_xyoffset2;
|
||||||
|
GsScissor scissor1;
|
||||||
|
uint64 ad_scissor1;
|
||||||
|
GsScissor scissor2;
|
||||||
|
uint64 ad_scissor2;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct GsCtx GsCtx;
|
||||||
|
struct GsCtx
|
||||||
|
{
|
||||||
|
// display context; two buffers
|
||||||
|
GsDispCtx disp[2];
|
||||||
|
// draw context; two buffers
|
||||||
|
GsDrawCtx draw[2];
|
||||||
|
};
|
656
tools/ps2test/main.cpp
Executable file
656
tools/ps2test/main.cpp
Executable file
@ -0,0 +1,656 @@
|
|||||||
|
#include <cstdio>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
#include <rw.h>
|
||||||
|
using rw::uint8;
|
||||||
|
using rw::uint16;
|
||||||
|
using rw::uint32;
|
||||||
|
using rw::uint64;
|
||||||
|
using rw::int8;
|
||||||
|
using rw::int16;
|
||||||
|
using rw::int32;
|
||||||
|
using rw::int64;
|
||||||
|
using rw::bool32;
|
||||||
|
using rw::float32;
|
||||||
|
typedef uint8 uchar;
|
||||||
|
typedef uint16 ushort;
|
||||||
|
typedef uint32 uint;
|
||||||
|
|
||||||
|
#define WIDTH 640
|
||||||
|
#define HEIGHT 448
|
||||||
|
|
||||||
|
#include "ps2.h"
|
||||||
|
|
||||||
|
// getting undefined references otherwise :/
|
||||||
|
int *__errno() { return &errno; }
|
||||||
|
|
||||||
|
// NONINTERLACED and FRAME have half of the FIELD vertical resolution!
|
||||||
|
// NONINTERLACED has half the vertical units
|
||||||
|
|
||||||
|
uint128 packetbuf[128];
|
||||||
|
uint128 chainbuf[128];
|
||||||
|
|
||||||
|
int frames;
|
||||||
|
|
||||||
|
void
|
||||||
|
printquad(uint128 p)
|
||||||
|
{
|
||||||
|
uint64 *lp;
|
||||||
|
lp = (uint64*)&p;
|
||||||
|
printf("%016lx %016lx\n", lp[1], lp[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct DmaChannel {
|
||||||
|
uint32 chcr; uint32 pad0[3];
|
||||||
|
uint32 madr; uint32 pad1[3];
|
||||||
|
uint32 qwc; uint32 pad2[3];
|
||||||
|
uint32 tadr; uint32 pad3[3];
|
||||||
|
uint32 asr0; uint32 pad4[3];
|
||||||
|
uint32 asr1; uint32 pad5[3];
|
||||||
|
uint32 pad6[8];
|
||||||
|
uint32 sadr;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct DmaChannel *dmaChannels[] = {
|
||||||
|
(struct DmaChannel *) &D0_CHCR,
|
||||||
|
(struct DmaChannel *) &D1_CHCR,
|
||||||
|
(struct DmaChannel *) &D2_CHCR,
|
||||||
|
(struct DmaChannel *) &D3_CHCR,
|
||||||
|
(struct DmaChannel *) &D4_CHCR,
|
||||||
|
(struct DmaChannel *) &D5_CHCR,
|
||||||
|
(struct DmaChannel *) &D6_CHCR,
|
||||||
|
(struct DmaChannel *) &D7_CHCR,
|
||||||
|
(struct DmaChannel *) &D8_CHCR,
|
||||||
|
(struct DmaChannel *) &D9_CHCR
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
dmaReset(void)
|
||||||
|
{
|
||||||
|
/* don't clear the SIF channels */
|
||||||
|
int doclear[] = { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1 };
|
||||||
|
int i;
|
||||||
|
|
||||||
|
D_CTRL = 0;
|
||||||
|
for(i = 0; i < 10; i++)
|
||||||
|
if(doclear[i]){
|
||||||
|
dmaChannels[i]->chcr = 0;
|
||||||
|
dmaChannels[i]->madr = 0;
|
||||||
|
dmaChannels[i]->qwc = 0;
|
||||||
|
dmaChannels[i]->tadr = 0;
|
||||||
|
dmaChannels[i]->asr0 = 0;
|
||||||
|
dmaChannels[i]->asr1 = 0;
|
||||||
|
dmaChannels[i]->sadr = 0;
|
||||||
|
}
|
||||||
|
D_CTRL = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
waitDMA(volatile uint32 *chcr)
|
||||||
|
{
|
||||||
|
while(*chcr & (1<<8));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
qwcpy(uint128 *dst, uint128 *src, int n)
|
||||||
|
{
|
||||||
|
while(n--) *dst++ = *src++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
toGIF(void *src, int n)
|
||||||
|
{
|
||||||
|
FlushCache(0);
|
||||||
|
D2_QWC = n;
|
||||||
|
D2_MADR = (uint32)src;
|
||||||
|
D2_CHCR = 1<<8;
|
||||||
|
waitDMA(&D2_CHCR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
toGIFchain(void *src)
|
||||||
|
{
|
||||||
|
FlushCache(0);
|
||||||
|
D2_QWC = 0;
|
||||||
|
D2_TADR = (uint32)src & 0x0FFFFFFF;
|
||||||
|
D2_CHCR = 1<<0 | 1<<2 | 1<<6 | 1<<8;
|
||||||
|
waitDMA(&D2_CHCR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
toVIF1chain(void *src)
|
||||||
|
{
|
||||||
|
FlushCache(0);
|
||||||
|
D1_QWC = 0;
|
||||||
|
D1_TADR = (uint32)src & 0x0FFFFFFF;
|
||||||
|
D1_CHCR = 1<<0 | 1<<2 | 1<<6 | 1<<8;
|
||||||
|
waitDMA(&D1_CHCR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GsCrtState gsCrtState;
|
||||||
|
|
||||||
|
int psmsizemap[64] = {
|
||||||
|
4, // GS_PSMCT32
|
||||||
|
4, // GS_PSMCT24
|
||||||
|
2, // GS_PSMCT16
|
||||||
|
0, 0, 0, 0, 0, 0, 0,
|
||||||
|
2, // GS_PSMCT16S
|
||||||
|
0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
4, // GS_PSMZ32
|
||||||
|
4, // GS_PSMZ24
|
||||||
|
2, // GS_PSMZ16
|
||||||
|
2, // GS_PSMZ16S
|
||||||
|
0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
GsResetCrt(uchar inter, uchar mode, uchar ff)
|
||||||
|
{
|
||||||
|
gsCrtState.inter = inter;
|
||||||
|
gsCrtState.mode = mode;
|
||||||
|
gsCrtState.ff = ff;
|
||||||
|
GS_CSR = 1 << GS_CSR_RESET_O;
|
||||||
|
__asm__("sync.p; nop");
|
||||||
|
GsPutIMR(0xff00);
|
||||||
|
SetGsCrt(gsCrtState.inter, gsCrtState.mode, gsCrtState.ff);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint gsAllocPtr = 0;
|
||||||
|
|
||||||
|
void
|
||||||
|
GsInitDispCtx(GsDispCtx *disp, int width, int height, int psm)
|
||||||
|
{
|
||||||
|
int magh, magv;
|
||||||
|
int dx, dy;
|
||||||
|
int dw, dh;
|
||||||
|
|
||||||
|
dx = gsCrtState.mode == GS_NTSC ? 636 : 656;
|
||||||
|
dy = gsCrtState.mode == GS_NTSC ? 25 : 36;
|
||||||
|
magh = 2560/width - 1;
|
||||||
|
magv = 0;
|
||||||
|
dw = 2560-1;
|
||||||
|
dh = height-1;
|
||||||
|
|
||||||
|
if(gsCrtState.inter == GS_INTERLACED){
|
||||||
|
dy *= 2;
|
||||||
|
if(gsCrtState.ff == GS_FRAME)
|
||||||
|
dh = (dh+1)*2-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
disp->pmode.d = GS_MAKE_PMODE(0, 1, 1, 1, 0, 0x00);
|
||||||
|
disp->bgcolor.d = 0x404040;
|
||||||
|
disp->dispfb1.d = 0;
|
||||||
|
disp->dispfb2.d = GS_MAKE_DISPFB(0, width/64, psm, 0, 0);
|
||||||
|
disp->display1.d = 0;
|
||||||
|
disp->display2.d = GS_MAKE_DISPLAY(dx, dy, magh, magv, dw, dh);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GsPutDispCtx(GsDispCtx *disp)
|
||||||
|
{
|
||||||
|
GS_PMODE = disp->pmode.d;
|
||||||
|
GS_DISPFB1 = disp->dispfb1.d;
|
||||||
|
GS_DISPLAY1 = disp->display1.d;
|
||||||
|
GS_DISPFB2 = disp->dispfb2.d;
|
||||||
|
GS_DISPLAY2 = disp->display2.d;
|
||||||
|
GS_BGCOLOR = disp->bgcolor.d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GsInitDrawCtx(GsDrawCtx *draw, int width, int height, int psm, int zpsm)
|
||||||
|
{
|
||||||
|
MAKE128(draw->gifTag, 0xe,
|
||||||
|
GIF_MAKE_TAG(8, 1, 0, 0, GIF_PACKED, 1));
|
||||||
|
draw->frame1.d = GS_MAKE_FRAME(0, width/64, psm, 0);
|
||||||
|
draw->ad_frame1 = GS_FRAME_1;
|
||||||
|
draw->frame2.d = draw->frame1.d;
|
||||||
|
draw->ad_frame2 = GS_FRAME_2;
|
||||||
|
draw->zbuf1.d = GS_MAKE_ZBUF(0, zpsm, 0);
|
||||||
|
draw->ad_zbuf1 = GS_ZBUF_1;
|
||||||
|
draw->zbuf2.d = draw->zbuf1.d;
|
||||||
|
draw->ad_zbuf2 = GS_ZBUF_2;
|
||||||
|
draw->xyoffset1.d = GS_MAKE_XYOFFSET(2048<<4, 2048<<4);
|
||||||
|
draw->ad_xyoffset1 = GS_XYOFFSET_1;
|
||||||
|
draw->xyoffset2.d = draw->xyoffset1.d;
|
||||||
|
draw->ad_xyoffset2 = GS_XYOFFSET_2;
|
||||||
|
draw->scissor1.d = GS_MAKE_SCISSOR(0, width-1, 0, height-1);
|
||||||
|
draw->ad_scissor1 = GS_SCISSOR_1;
|
||||||
|
draw->scissor2.d = draw->scissor1.d;
|
||||||
|
draw->ad_scissor2 = GS_SCISSOR_2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GsPutDrawCtx(GsDrawCtx *draw)
|
||||||
|
{
|
||||||
|
printquad(*(uint128*)&draw->frame1);
|
||||||
|
toGIF(draw, 9);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GsInitCtx(GsCtx *ctx, int width, int height, int psm, int zpsm)
|
||||||
|
{
|
||||||
|
uint fbsz, zbsz;
|
||||||
|
uint fbp, zbp;
|
||||||
|
fbsz = (width*height*psmsizemap[psm] + 2047)/2048;
|
||||||
|
zbsz = (width*height*psmsizemap[0x30|zpsm] + 2047)/2048;
|
||||||
|
gsAllocPtr = 2*fbsz + zbsz;
|
||||||
|
fbp = fbsz;
|
||||||
|
zbp = fbsz*2;
|
||||||
|
|
||||||
|
GsInitDispCtx(&ctx->disp[0], width, height, psm);
|
||||||
|
GsInitDispCtx(&ctx->disp[1], width, height, psm);
|
||||||
|
GsInitDrawCtx(&ctx->draw[0], width, height, psm, zpsm);
|
||||||
|
GsInitDrawCtx(&ctx->draw[1], width, height, psm, zpsm);
|
||||||
|
ctx->disp[1].dispfb2.f.FBP = fbp/4;
|
||||||
|
ctx->draw[0].frame1.f.FBP = fbp/4;
|
||||||
|
ctx->draw[0].frame2.f.FBP = fbp/4;
|
||||||
|
ctx->draw[0].zbuf1.f.ZBP = zbp/4;
|
||||||
|
ctx->draw[0].zbuf2.f.ZBP = zbp/4;
|
||||||
|
ctx->draw[1].zbuf1.f.ZBP = zbp/4;
|
||||||
|
ctx->draw[1].zbuf2.f.ZBP = zbp/4;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
initrender(void)
|
||||||
|
{
|
||||||
|
uint128 *p, tmp;
|
||||||
|
p = packetbuf;
|
||||||
|
MAKE128(tmp, 0xe, GIF_MAKE_TAG(2, 1, 0, 0, GIF_PACKED, 1));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_PRMODECONT, 1);
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_COLCLAMP, 1);
|
||||||
|
*p++ = tmp;
|
||||||
|
toGIF(packetbuf, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clearscreen(int r, int g, int b)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
uint128 *p, tmp;
|
||||||
|
p = packetbuf;
|
||||||
|
|
||||||
|
x = (2048 + 640)<<4;
|
||||||
|
y = (2048 + 448)<<4;
|
||||||
|
|
||||||
|
MAKE128(tmp, 0xe, GIF_MAKE_TAG(5, 1, 0, 0, GIF_PACKED, 1));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_TEST_1, GS_MAKE_TEST(0, 0, 0, 0, 0, 0, 1, 1));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_PRIM, GS_MAKE_PRIM(GS_PRIM_SPRITE,0,0,0,0,0,0,0,0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(r, g, b, 0, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(2048<<4, 2048<<4, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x, y, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
toGIF(packetbuf, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drawtest(void)
|
||||||
|
{
|
||||||
|
int x0, x1, x2, x3;
|
||||||
|
int y0, y1, y2;
|
||||||
|
uint128 *p, tmp;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
x0 = 2048<<4;
|
||||||
|
x1 = (2048 + 210)<<4;
|
||||||
|
x2 = (2048 + 430)<<4;
|
||||||
|
x3 = (2048 + 640)<<4;
|
||||||
|
y0 = 2048<<4;
|
||||||
|
y1 = (2048 + 224)<<4;
|
||||||
|
y2 = (2048 + 448)<<4;
|
||||||
|
|
||||||
|
n = 2 + 3*7;
|
||||||
|
p = packetbuf;
|
||||||
|
MAKEQ(tmp, 0x70000000 | n+1, 0, 0, 0);
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, 0xe, GIF_MAKE_TAG(n, 1, 0, 0, GIF_PACKED, 1));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_TEST_1, GS_MAKE_TEST(0, 0, 0, 0, 0, 0, 1, 1));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_PRIM, GS_MAKE_PRIM(GS_PRIM_SPRITE,0,0,0,0,0,0,0,0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(255, 0, 0, 0, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x0, y0, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x1, y1, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(0, 255, 0, 0, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x1, y0, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x2, y1, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(0, 0, 255, 0, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x2, y0, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x3, y1, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(0, 255, 255, 0, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x0, y1, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x1, y2, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(255, 0, 255, 0, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x1, y1, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x2, y2, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(255, 255, 0, 0, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x2, y1, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x3, y2, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_RGBAQ, GS_MAKE_RGBAQ(255, 255, 255, 0, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ((2048+20)<<4, y0, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYZ2, GS_MAKE_XYZ(x3, (2048+20)<<4, 0));
|
||||||
|
*p++ = tmp;
|
||||||
|
toGIFchain(packetbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drawtri(void)
|
||||||
|
{
|
||||||
|
uint128 *p, tmp;
|
||||||
|
uint32 *ip;
|
||||||
|
int nverts, n;
|
||||||
|
|
||||||
|
nverts = 3;
|
||||||
|
n = 2*nverts;
|
||||||
|
p = packetbuf;
|
||||||
|
MAKEQ(tmp, 0x70000000 | n+1, 0, 0, 0);
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, (0x5<<4) | 0x1,
|
||||||
|
GIF_MAKE_TAG(nverts, 1, 1, GS_MAKE_PRIM(GS_PRIM_TRI, 1, 0, 0, 0, 0, 0, 0, 0), GIF_PACKED, 2));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKEQ(tmp, 255, 0, 0, 0);
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKEQ(tmp, (2048+85)<<4, (2048+70)<<4, 0, 0);
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKEQ(tmp, 0, 255, 0, 0);
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKEQ(tmp, (2048+260)<<4, (2048+200)<<4, 0, 0);
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKEQ(tmp, 0, 0, 255, 0);
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKEQ(tmp, (2048+180)<<4, (2048+350)<<4, 0, 0);
|
||||||
|
*p++ = tmp;
|
||||||
|
toGIFchain(packetbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rw::Matrix projMat, viewMat, worldMat;
|
||||||
|
|
||||||
|
extern uint32 MyDmaPacket[];
|
||||||
|
extern rw::RawMatrix vuMat;
|
||||||
|
extern rw::RawMatrix vuLightMat;
|
||||||
|
extern float vuXYZScale[];
|
||||||
|
extern float vuXYZOffset[];
|
||||||
|
extern float vuOffset[];
|
||||||
|
extern uint64 vuGIFtag[];
|
||||||
|
extern float vuMatcolor[];
|
||||||
|
extern float vuSurfProps[];
|
||||||
|
extern float vuAmbLight[];
|
||||||
|
extern uint32 vuGeometry[];
|
||||||
|
extern uint32 mpgCall[];
|
||||||
|
extern uint32 textureCall[];
|
||||||
|
extern uint32 geometryCall[];
|
||||||
|
extern uint32 defaultPipe[];
|
||||||
|
extern uint32 skinPipe[];
|
||||||
|
|
||||||
|
rw::World *world;
|
||||||
|
rw::Camera *camera;
|
||||||
|
|
||||||
|
void
|
||||||
|
printMatrix(rw::Matrix *m)
|
||||||
|
{
|
||||||
|
rw::V3d *x = &m->right;
|
||||||
|
rw::V3d *y = &m->up;
|
||||||
|
rw::V3d *z = &m->at;
|
||||||
|
rw::V3d *w = &m->pos;
|
||||||
|
printf(
|
||||||
|
"[ [ %8.4f, %8.4f, %8.4f, %8.4f ]\n"
|
||||||
|
" [ %8.4f, %8.4f, %8.4f, %8.4f ]\n"
|
||||||
|
" [ %8.4f, %8.4f, %8.4f, %8.4f ]\n"
|
||||||
|
" [ %8.4f, %8.4f, %8.4f, %8.4f ] ]\n"
|
||||||
|
" %08x == flags\n",
|
||||||
|
x->x, y->x, z->x, w->x,
|
||||||
|
x->y, y->y, z->y, w->y,
|
||||||
|
x->z, y->z, z->z, w->z,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f,
|
||||||
|
m->flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
drawAtomic(rw::Atomic *atomic)
|
||||||
|
{
|
||||||
|
using namespace rw;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
Geometry *geo;
|
||||||
|
Matrix *vp;
|
||||||
|
|
||||||
|
printf("view matrix\n");
|
||||||
|
printMatrix(&camera->viewMatrix);
|
||||||
|
printf("camera matrix\n");
|
||||||
|
printMatrix(camera->getFrame()->getLTM());
|
||||||
|
printf("atomic ltm\n");
|
||||||
|
printMatrix(atomic->getFrame()->getLTM());
|
||||||
|
|
||||||
|
/*
|
||||||
|
RpAtomicPS2AllGetMeshHeaderMeshCache(atomic, ps2AllPipeData);
|
||||||
|
RpAtomicPS2AllGatherObjMetrics(atomic);
|
||||||
|
RpAtomicPS2AllMorphSetup(atomic, ps2AllPipeData);
|
||||||
|
RpAtomicPS2AllObjInstanceTest(atomic, ps2AllPipeData);
|
||||||
|
RpAtomicPS2AllClear(atomic);
|
||||||
|
RpAtomicPS2AllTransformSetup(atomic, transform);
|
||||||
|
RpAtomicPS2AllFrustumTest(atomic, &inFrustum);
|
||||||
|
RpAtomicPS2AllPrimTypeTransTypeSetup(ps2AllPipeData, inFrustum);
|
||||||
|
RpAtomicPS2AllMatModulateSetup(atomic, ps2AllPipeData);
|
||||||
|
RpAtomicPS2AllLightingSetup(ps2AllPipeData);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Transform Setup
|
||||||
|
Matrix::mult((Matrix*)&vuMat, atomic->getFrame()->getLTM(), &camera->viewMatrix);
|
||||||
|
vuMat.rightw = vuMat.right.z;
|
||||||
|
vuMat.upw = vuMat.up.z;
|
||||||
|
vuMat.atw = vuMat.at.z;
|
||||||
|
vuMat.posw = vuMat.pos.z;
|
||||||
|
|
||||||
|
*(Matrix*)&vuLightMat = *atomic->getFrame()->getLTM();
|
||||||
|
vuLightMat.rightw = 0.0f;
|
||||||
|
vuLightMat.upw = 0.0f;
|
||||||
|
vuLightMat.atw = 0.0f;
|
||||||
|
vuLightMat.posw = 1.0f;
|
||||||
|
|
||||||
|
geo = atomic->geometry;
|
||||||
|
if(!(geo->flags & Geometry::NATIVE)){
|
||||||
|
printf("not instanced!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vuAmbLight[0] = 80;
|
||||||
|
vuAmbLight[1] = 80;
|
||||||
|
vuAmbLight[2] = 80;
|
||||||
|
vuAmbLight[3] = 0;
|
||||||
|
|
||||||
|
assert(geo->instData != NULL);
|
||||||
|
rw::ps2::InstanceDataHeader *instData =
|
||||||
|
(rw::ps2::InstanceDataHeader*)geo->instData;
|
||||||
|
rw::MeshHeader *meshHeader = geo->meshHeader;
|
||||||
|
rw::Mesh *mesh;
|
||||||
|
for(i = 0; i < instData->numMeshes; i++){
|
||||||
|
geometryCall[1] = (uint32)instData->instanceMeshes[i].data;
|
||||||
|
vuMatcolor[0] = 1.0f;
|
||||||
|
vuMatcolor[1] = 1.0f;
|
||||||
|
vuMatcolor[2] = 1.0f;
|
||||||
|
vuMatcolor[3] = 1.0f;
|
||||||
|
|
||||||
|
vuGIFtag[0] = GIF_MAKE_TAG(0, 1, 1, GS_MAKE_PRIM(GS_PRIM_TRI_STRIP,1,0,0,0,0,0,0,0), GIF_PACKED, 3);
|
||||||
|
vuGIFtag[1] = 0x412;
|
||||||
|
|
||||||
|
geometryCall[3] = 0x020000DC;
|
||||||
|
mpgCall[1] = (uint32)skinPipe;
|
||||||
|
// geometryCall[3] = 0x02000114;
|
||||||
|
// mpgCall[1] = (uint32)defaultPipe;
|
||||||
|
toVIF1chain(MyDmaPacket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
beginCamera(void)
|
||||||
|
{
|
||||||
|
uint128 *p, tmp;
|
||||||
|
p = packetbuf;
|
||||||
|
MAKE128(tmp, 0xe, GIF_MAKE_TAG(2, 1, 0, 0, GIF_PACKED, 1));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_XYOFFSET_1, GS_MAKE_XYOFFSET(2048-WIDTH/2 <<4, 2048-HEIGHT/2 <<4));
|
||||||
|
*p++ = tmp;
|
||||||
|
MAKE128(tmp, GS_TEST_1, GS_MAKE_TEST(0, 0, 0, 0, 0, 0, 1, 2));
|
||||||
|
*p++ = tmp;
|
||||||
|
toGIF(packetbuf, 3);
|
||||||
|
vuXYZScale[0] = WIDTH;
|
||||||
|
vuXYZScale[1] = HEIGHT;
|
||||||
|
vuXYZScale[2] = camera->zScale;
|
||||||
|
vuXYZScale[3] = 0.0f;
|
||||||
|
vuXYZOffset[0] = 2048.0f;
|
||||||
|
vuXYZOffset[1] = 2048.0f;
|
||||||
|
vuXYZOffset[2] = camera->zShift;
|
||||||
|
vuXYZOffset[3] = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
rw::EngineStartParams engineStartParams;
|
||||||
|
|
||||||
|
void
|
||||||
|
pluginattach(void)
|
||||||
|
{
|
||||||
|
rw::ps2::registerPDSPlugin(40);
|
||||||
|
rw::ps2::registerPluginPDSPipes();
|
||||||
|
|
||||||
|
rw::registerMeshPlugin();
|
||||||
|
rw::registerNativeDataPlugin();
|
||||||
|
rw::registerAtomicRightsPlugin();
|
||||||
|
rw::registerMaterialRightsPlugin();
|
||||||
|
rw::xbox::registerVertexFormatPlugin();
|
||||||
|
rw::registerSkinPlugin();
|
||||||
|
rw::registerHAnimPlugin();
|
||||||
|
rw::registerMatFXPlugin();
|
||||||
|
rw::registerUVAnimPlugin();
|
||||||
|
rw::ps2::registerADCPlugin();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool32
|
||||||
|
initrw(void)
|
||||||
|
{
|
||||||
|
rw::version = 0x34000;
|
||||||
|
rw::platform = rw::PLATFORM_PS2;
|
||||||
|
if(!rw::Engine::init())
|
||||||
|
return 0;
|
||||||
|
pluginattach();
|
||||||
|
if(!rw::Engine::open())
|
||||||
|
return 0;
|
||||||
|
if(!rw::Engine::start(&engineStartParams))
|
||||||
|
return 0;
|
||||||
|
rw::engine->loadTextures = 0;
|
||||||
|
|
||||||
|
rw::TexDictionary::setCurrent(rw::TexDictionary::create());
|
||||||
|
rw::Image::setSearchPath(".");
|
||||||
|
|
||||||
|
world = rw::World::create();
|
||||||
|
camera = rw::Camera::create();
|
||||||
|
camera->setFrame(rw::Frame::create());
|
||||||
|
rw::V3d t = { 0.0f, 0.0f, -4.0f };
|
||||||
|
// rw::V3d t = { 0.0f, 0.0f, -40.0f };
|
||||||
|
camera->getFrame()->translate(&t, rw::COMBINEPOSTCONCAT);
|
||||||
|
rw::V3d axis = { 0.0f, 1.0f, 0.0f };
|
||||||
|
camera->getFrame()->rotate(&axis, 40.0f, rw::COMBINEPOSTCONCAT);
|
||||||
|
camera->setNearPlane(0.1f);
|
||||||
|
camera->setFarPlane(450.0f);
|
||||||
|
camera->setFOV(60.0f, 4.0f/3.0f);
|
||||||
|
world->addCamera(camera);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
vsynch(int id)
|
||||||
|
{
|
||||||
|
frames++;
|
||||||
|
ExitHandler();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
FlushCache(0);
|
||||||
|
if(!initrw()){
|
||||||
|
printf("init failed!\n");
|
||||||
|
for(;;);
|
||||||
|
}
|
||||||
|
|
||||||
|
rw::uint32 len;
|
||||||
|
rw::uint8 *data = rw::getFileContents("host:player.DFF", &len);
|
||||||
|
// rw::uint8 *data = rw::getFileContents("host:od_newscafe_dy.dff", &len);
|
||||||
|
rw::StreamMemory in;
|
||||||
|
in.open(data, len);
|
||||||
|
rw::findChunk(&in, rw::ID_CLUMP, NULL, NULL);
|
||||||
|
rw::Clump *clump = rw::Clump::streamRead(&in);
|
||||||
|
in.close();
|
||||||
|
delete[] data;
|
||||||
|
|
||||||
|
GsCtx gsCtx;
|
||||||
|
|
||||||
|
dmaReset();
|
||||||
|
|
||||||
|
// GsResetCrt(GS_NONINTERLACED, GS_NTSC, 0);
|
||||||
|
// GsInitCtx(&gsCtx, 640, 224, GS_PSMCT32, GS_PSMZ32);
|
||||||
|
|
||||||
|
// GsResetCrt(GS_INTERLACED, GS_NTSC, GS_FRAME);
|
||||||
|
// GsInitCtx(&gsCtx, 640, 224, GS_PSMCT32, GS_PSMZ32);
|
||||||
|
|
||||||
|
GsResetCrt(GS_INTERLACED, GS_NTSC, GS_FIELD);
|
||||||
|
GsInitCtx(&gsCtx, WIDTH, HEIGHT, GS_PSMCT32, GS_PSMZ32);
|
||||||
|
|
||||||
|
initrender();
|
||||||
|
|
||||||
|
AddIntcHandler(2, vsynch, 0);
|
||||||
|
EnableIntc(2);
|
||||||
|
|
||||||
|
GsPutDrawCtx(&gsCtx.draw[0]);
|
||||||
|
GsPutDispCtx(&gsCtx.disp[1]);
|
||||||
|
// PCSX2 needs a delay for some reason
|
||||||
|
{ int i; for(i = 0; i < 1000000; i++); }
|
||||||
|
clearscreen(0, 0, 0);
|
||||||
|
drawtest();
|
||||||
|
drawtri();
|
||||||
|
|
||||||
|
vuOffset[0] = 0.0f;
|
||||||
|
vuOffset[1] = 0.0f;
|
||||||
|
|
||||||
|
camera->beginUpdate();
|
||||||
|
beginCamera();
|
||||||
|
FORLIST(lnk, clump->atomics)
|
||||||
|
drawAtomic(rw::Atomic::fromClump(lnk));
|
||||||
|
camera->endUpdate();
|
||||||
|
|
||||||
|
printf("hello %p\n", clump);
|
||||||
|
for(;;);
|
||||||
|
// printf("");
|
||||||
|
return 0;
|
||||||
|
}
|
95
tools/ps2test/mem.h
Executable file
95
tools/ps2test/mem.h
Executable file
@ -0,0 +1,95 @@
|
|||||||
|
/* FIFOs */
|
||||||
|
#define VIF0_FIFO (*(volatile uint128*)0x10004000)
|
||||||
|
#define VIF1_FIFO (*(volatile uint128*)0x10005000)
|
||||||
|
#define GIF_FIFO (*(volatile uint128*)0x10006000)
|
||||||
|
#define IPU_out_FIFO (*(volatile uint128*)0x10007000)
|
||||||
|
#define IPU_in_FIFO (*(volatile uint128*)0x10007010)
|
||||||
|
|
||||||
|
/* DMA channels */
|
||||||
|
// to VIF0
|
||||||
|
#define D0_CHCR (*(volatile uint32*)0x10008000)
|
||||||
|
#define D0_MADR (*(volatile uint32*)0x10008010)
|
||||||
|
#define D0_QWC (*(volatile uint32*)0x10008020)
|
||||||
|
#define D0_TADR (*(volatile uint32*)0x10008030)
|
||||||
|
#define D0_ASR0 (*(volatile uint32*)0x10008040)
|
||||||
|
#define D0_ASR1 (*(volatile uint32*)0x10008050)
|
||||||
|
// VIF1
|
||||||
|
#define D1_CHCR (*(volatile uint32*)0x10009000)
|
||||||
|
#define D1_MADR (*(volatile uint32*)0x10009010)
|
||||||
|
#define D1_QWC (*(volatile uint32*)0x10009020)
|
||||||
|
#define D1_TADR (*(volatile uint32*)0x10009030)
|
||||||
|
#define D1_ASR0 (*(volatile uint32*)0x10009040)
|
||||||
|
#define D1_ASR1 (*(volatile uint32*)0x10009050)
|
||||||
|
// to GIF
|
||||||
|
#define D2_CHCR (*(volatile uint32*)0x1000a000)
|
||||||
|
#define D2_MADR (*(volatile uint32*)0x1000a010)
|
||||||
|
#define D2_QWC (*(volatile uint32*)0x1000a020)
|
||||||
|
#define D2_TADR (*(volatile uint32*)0x1000a030)
|
||||||
|
#define D2_ASR0 (*(volatile uint32*)0x1000a040)
|
||||||
|
#define D2_ASR1 (*(volatile uint32*)0x1000a050)
|
||||||
|
// fromIPU
|
||||||
|
#define D3_CHCR (*(volatile uint32*)0x1000b000)
|
||||||
|
#define D3_MADR (*(volatile uint32*)0x1000b010)
|
||||||
|
#define D3_QWC (*(volatile uint32*)0x1000b020)
|
||||||
|
// toIPU
|
||||||
|
#define D4_CHCR (*(volatile uint32*)0x1000b400)
|
||||||
|
#define D4_MADR (*(volatile uint32*)0x1000b410)
|
||||||
|
#define D4_QWC (*(volatile uint32*)0x1000b420)
|
||||||
|
#define D4_TADR (*(volatile uint32*)0x1000b430)
|
||||||
|
// from SIF0
|
||||||
|
#define D5_CHCR (*(volatile uint32*)0x1000c000)
|
||||||
|
#define D5_MADR (*(volatile uint32*)0x1000c010)
|
||||||
|
#define D5_QWC (*(volatile uint32*)0x1000c020)
|
||||||
|
// to SIF1
|
||||||
|
#define D6_CHCR (*(volatile uint32*)0x1000c400)
|
||||||
|
#define D6_MADR (*(volatile uint32*)0x1000c410)
|
||||||
|
#define D6_QWC (*(volatile uint32*)0x1000c420)
|
||||||
|
#define D6_TADR (*(volatile uint32*)0x1000c430)
|
||||||
|
// SIF2
|
||||||
|
#define D7_CHCR (*(volatile uint32*)0x1000c800)
|
||||||
|
#define D7_MADR (*(volatile uint32*)0x1000c810)
|
||||||
|
#define D7_QWC (*(volatile uint32*)0x1000c820)
|
||||||
|
// fromSPR
|
||||||
|
#define D8_CHCR (*(volatile uint32*)0x1000d000)
|
||||||
|
#define D8_MADR (*(volatile uint32*)0x1000d010)
|
||||||
|
#define D8_QWC (*(volatile uint32*)0x1000d020)
|
||||||
|
#define D8_SADR (*(volatile uint32*)0x1000d080)
|
||||||
|
// toSPR
|
||||||
|
#define D9_CHCR (*(volatile uint32*)0x1000d400)
|
||||||
|
#define D9_MADR (*(volatile uint32*)0x1000d410)
|
||||||
|
#define D9_QWC (*(volatile uint32*)0x1000d420)
|
||||||
|
#define D9_TADR (*(volatile uint32*)0x1000d430)
|
||||||
|
#define D9_SADR (*(volatile uint32*)0x1000d480)
|
||||||
|
|
||||||
|
/* DMA controller */
|
||||||
|
#define D_CTRL (*(volatile uint32*)0x1000e000)
|
||||||
|
#define D_STAT (*(volatile uint32*)0x1000e010)
|
||||||
|
#define D_PCR (*(volatile uint32*)0x1000e020)
|
||||||
|
#define D_SQWC (*(volatile uint32*)0x1000e030)
|
||||||
|
#define D_RBSR (*(volatile uint32*)0x1000e040)
|
||||||
|
#define D_RBOR (*(volatile uint32*)0x1000e050)
|
||||||
|
#define D_STADR (*(volatile uint32*)0x1000e060)
|
||||||
|
#define D_ENABLER (*(volatile uint32*)0x1000f520)
|
||||||
|
#define D_ENABLEW (*(volatile uint32*)0x1000f590)
|
||||||
|
|
||||||
|
|
||||||
|
/* GS privileged registers */
|
||||||
|
#define GS_PMODE (*(volatile uint64*)0x12000000)
|
||||||
|
#define GS_SMODE1 (*(volatile uint64*)0x12000010)
|
||||||
|
#define GS_SMODE2 (*(volatile uint64*)0x12000020)
|
||||||
|
#define GS_SRFSH (*(volatile uint64*)0x12000030)
|
||||||
|
#define GS_SYNCH1 (*(volatile uint64*)0x12000040)
|
||||||
|
#define GS_SYNCH2 (*(volatile uint64*)0x12000050)
|
||||||
|
#define GS_SYNCV (*(volatile uint64*)0x12000060)
|
||||||
|
#define GS_DISPFB1 (*(volatile uint64*)0x12000070)
|
||||||
|
#define GS_DISPLAY1 (*(volatile uint64*)0x12000080)
|
||||||
|
#define GS_DISPFB2 (*(volatile uint64*)0x12000090)
|
||||||
|
#define GS_DISPLAY2 (*(volatile uint64*)0x120000a0)
|
||||||
|
#define GS_EXTBUF (*(volatile uint64*)0x120000b0)
|
||||||
|
#define GS_EXTDATA (*(volatile uint64*)0x120000c0)
|
||||||
|
#define GS_EXTWRITE (*(volatile uint64*)0x120000d0)
|
||||||
|
#define GS_BGCOLOR (*(volatile uint64*)0x120000e0)
|
||||||
|
#define GS_CSR (*(volatile uint64*)0x12001000)
|
||||||
|
#define GS_IMR (*(volatile uint64*)0x12001010)
|
||||||
|
#define GS_BUSDIR (*(volatile uint64*)0x12001040)
|
||||||
|
#define GS_SIGLBLID (*(volatile uint64*)0x12001080)
|
23
tools/ps2test/ps2.h
Executable file
23
tools/ps2test/ps2.h
Executable file
@ -0,0 +1,23 @@
|
|||||||
|
#include <kernel.h>
|
||||||
|
|
||||||
|
typedef int quad __attribute__((mode(TI)));
|
||||||
|
typedef int int128 __attribute__((mode(TI)));
|
||||||
|
typedef unsigned int uquad __attribute__((mode(TI)));
|
||||||
|
typedef unsigned int uint128 __attribute__((mode(TI)));
|
||||||
|
|
||||||
|
#define MAKE128(RES,MSB,LSB) \
|
||||||
|
__asm__ ( "pcpyld %0, %1, %2" : "=r" (RES) : "r" ((uint64)MSB), "r" ((uint64)LSB))
|
||||||
|
#define UINT64(LOW,HIGH) ((uint64)HIGH<<32 | (uint64)LOW)
|
||||||
|
#define MAKEQ(RES,W0,W1,W2,W3) MAKE128(RES,UINT64(W2,W3),UINT64(W0,W1))
|
||||||
|
|
||||||
|
#define BIT64(v,s) ((uint64)(v) << (s))
|
||||||
|
|
||||||
|
#include "mem.h"
|
||||||
|
#include "gs.h"
|
||||||
|
|
||||||
|
extern uint128 packetbuf[128];
|
||||||
|
|
||||||
|
void waitDMA(volatile uint32 *chcr);
|
||||||
|
void toGIF(void *src, int n);
|
||||||
|
|
||||||
|
void drawcube(void);
|
128
tools/ps2test/vu/defaultpipe.dsm
Executable file
128
tools/ps2test/vu/defaultpipe.dsm
Executable file
@ -0,0 +1,128 @@
|
|||||||
|
.global defaultPipe
|
||||||
|
|
||||||
|
.equ vertexTop, 0x3d0
|
||||||
|
.equ numInAttribs, 4
|
||||||
|
.equ numOutAttribs, 3
|
||||||
|
.equ numOutBuf, 2
|
||||||
|
.equ vertCount, ((vertexTop-numOutBuf)/(numInAttribs*2+numOutAttribs*numOutBuf))
|
||||||
|
.equ offset, (vertCount*numInAttribs)
|
||||||
|
.equ outBuf1, (2*offset)
|
||||||
|
.equ outSize, ((vertexTop-outBuf1-2)/2)
|
||||||
|
.equ outBuf2, (outBuf1+outSize)
|
||||||
|
|
||||||
|
.equ lightMat, 0x3d0
|
||||||
|
.equ lightDir, 0x3d4
|
||||||
|
.equ matrix, 0x3f0
|
||||||
|
.equ XYZScale, 0x3f7
|
||||||
|
.equ XYZOffset, 0x3f8
|
||||||
|
.equ gifTag, 0x3fa
|
||||||
|
.equ matColor, 0x3fb
|
||||||
|
.equ ambientLight, 0x3fd
|
||||||
|
|
||||||
|
/* This is the the projection matrix we start with:
|
||||||
|
* 1/2w 0 ox/2w + 1/2 -ox/2w
|
||||||
|
* 0 -1/2h -oy/2h + 1/2 oy/2h
|
||||||
|
* 0 0 1 0
|
||||||
|
* 0 0 1 0
|
||||||
|
* To get rid of the +1/2 in the combined matrix we
|
||||||
|
* subtract the z-row/2 from the x- and y-rows.
|
||||||
|
*
|
||||||
|
* The z-row is then set to [0 0 0 1] such that multiplication
|
||||||
|
* by XYZscale gives [0 0 0 zScale]. After perspective division
|
||||||
|
* and addition of XYZoffset we then get zScale/w + zShift for z.
|
||||||
|
*
|
||||||
|
* XYZScale scales xy to the resolution and z by zScale.
|
||||||
|
* XYZOffset translates xy to the GS coordinate system (where
|
||||||
|
* [2048, 2048] is the center of the frame buffer) and add zShift to z.
|
||||||
|
*/
|
||||||
|
|
||||||
|
; constant:
|
||||||
|
; VF28-VF31 transformation matrix
|
||||||
|
; VF25 XYZ offset
|
||||||
|
|
||||||
|
|
||||||
|
.balign 16,0
|
||||||
|
defaultPipe:
|
||||||
|
DMAret *
|
||||||
|
MPG 0, *
|
||||||
|
.vu
|
||||||
|
Start:
|
||||||
|
SUB.z VF28, VF28, VF28 LOI 0.5 ; right.z = 0
|
||||||
|
SUB.z VF29, VF29, VF29 LQ VF28, matrix(VI00) ; up.z = 0 - load matrix
|
||||||
|
SUB.z VF30, VF30, VF30 LQ VF29, matrix+1(VI00) ; at.z = 0 - load matrix
|
||||||
|
ADDw.z VF31, VF00, VF00 LQ VF30, matrix+2(VI00) ; at.z = 1 - load matrix
|
||||||
|
NOP LQ VF31, matrix+3(VI00) ; - load matrix
|
||||||
|
MULi.w VF20, VF28, I LQ.xyz VF01, XYZScale(VI00) ; fix matrix - load scale
|
||||||
|
MULi.w VF21, VF29, I NOP ; fix matrix
|
||||||
|
MULi.w VF22, VF30, I NOP ; fix matrix
|
||||||
|
MULi.w VF23, VF31, I NOP ; fix matrix
|
||||||
|
SUBw.xy VF28, VF28, VF20 NOP ; fix matrix
|
||||||
|
SUBw.xy VF29, VF29, VF21 NOP ; fix matrix
|
||||||
|
SUBw.xy VF30, VF30, VF22 NOP ; fix matrix
|
||||||
|
SUBw.xy VF31, VF31, VF23 NOP ; fix matrix
|
||||||
|
MUL.xy VF28, VF28, VF01 LQ.xyz VF25, XYZOffset(VI00) ; scale matrix
|
||||||
|
MUL.xy VF29, VF29, VF01 IADDIU VI12, VI00, outBuf1 ; scale matrix
|
||||||
|
MUL.xy VF30, VF30, VF01 IADDIU VI13, VI00, outBuf2 ; scale matrix
|
||||||
|
MUL.xyz VF31, VF31, VF01 NOP ; scale matrix
|
||||||
|
Cnt:
|
||||||
|
NOP XTOP VI02 ; input pointer
|
||||||
|
NOP LQ VF01, gifTag(VI00)
|
||||||
|
NOP XITOP VI01 ; vertex count
|
||||||
|
NOP IADDIU VI05, VI00, 0x4000
|
||||||
|
NOP IADD VI05, VI05, VI05
|
||||||
|
NOP IOR VI05, VI05, VI01
|
||||||
|
NOP SQ VF01, 0(VI12)
|
||||||
|
NOP ISW.x VI05, 0(VI12)
|
||||||
|
NOP IADDIU VI03, VI12, 1 ; output pointer
|
||||||
|
NOP LQ VF18, lightMat(VI00)
|
||||||
|
NOP LQ VF19, lightMat+1(VI00)
|
||||||
|
NOP LQ VF20, lightMat+2(VI00)
|
||||||
|
|
||||||
|
Loop:
|
||||||
|
NOP LQI VF01, (VI02++) ; vertex
|
||||||
|
NOP LQI VF02, (VI02++) ; UV
|
||||||
|
NOP LQI VF03, (VI02++) ; color
|
||||||
|
NOP LQI VF04, (VI02++) ; normal
|
||||||
|
|
||||||
|
MULAw.xyzw ACC, VF31, VF00w NOP ; transform vertex
|
||||||
|
MADDAx.xyw ACC, VF28, VF01x NOP
|
||||||
|
MADDAy.xyw ACC, VF29, VF01y NOP
|
||||||
|
MADDz.xyzw VF01, VF30, VF01z NOP
|
||||||
|
ITOF0 VF03, VF03 NOP
|
||||||
|
ITOF0[I] VF04, VF04 LOI 0.0078125 ; - normal scale
|
||||||
|
NOP NOP
|
||||||
|
NOP DIV Q, VF00w, VF01w
|
||||||
|
NOP WAITQ
|
||||||
|
MULq VF01, VF01, Q NOP ; perspective division
|
||||||
|
MULi VF04, VF04, I NOP ; scale normal
|
||||||
|
NOP MR32.z VF02, VF00
|
||||||
|
NOP NOP
|
||||||
|
SUB.w VF01, VF01, VF01 NOP
|
||||||
|
MULAx.xyz ACC, VF18, VF04x NOP ; transform normal
|
||||||
|
MADDAy.xyz ACC, VF19, VF04y NOP
|
||||||
|
MADDz.xyz VF04, VF20, VF04z NOP
|
||||||
|
ADD.xyz VF01, VF01, VF25 NOP
|
||||||
|
MULq VF02, VF02, Q NOP
|
||||||
|
NOP NOP
|
||||||
|
FTOI0 VF03, VF03 NOP
|
||||||
|
FTOI4 VF01, VF01 NOP
|
||||||
|
NOP SQ VF04, -2(VI02) ; store normal
|
||||||
|
NOP IADDI VI01, VI01, -1
|
||||||
|
NOP SQI VF02, (VI03++) ; STQ
|
||||||
|
NOP SQI VF03, (VI03++) ; color
|
||||||
|
NOP SQI VF01, (VI03++) ; vertex
|
||||||
|
NOP IBNE VI01, VI00, Loop
|
||||||
|
NOP NOP
|
||||||
|
|
||||||
|
#include "light.vu"
|
||||||
|
|
||||||
|
NOP XGKICK VI12
|
||||||
|
NOP IADD VI15,VI00,VI12
|
||||||
|
NOP IADD VI12,VI00,VI13
|
||||||
|
NOP[E] IADD VI13,VI00,VI15
|
||||||
|
NOP NOP
|
||||||
|
NOP B Cnt
|
||||||
|
NOP NOP
|
||||||
|
|
||||||
|
.EndMPG
|
||||||
|
.EndDmaData
|
94
tools/ps2test/vu/light.vu
Executable file
94
tools/ps2test/vu/light.vu
Executable file
@ -0,0 +1,94 @@
|
|||||||
|
; Ambient light:
|
||||||
|
NOP LQ VF26, ambientLight(VI00)
|
||||||
|
NOP XITOP VI01
|
||||||
|
NOP IADDIU VI03, VI12, 2
|
||||||
|
Ambloop:
|
||||||
|
NOP LQ VF03, 0(VI03) ; output color
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
ITOF0 VF03, VF03 NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
ADD VF03, VF03, VF26 NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
FTOI0 VF03, VF03 NOP
|
||||||
|
NOP IADDI VI01, VI01, -1
|
||||||
|
NOP IADDIU VI03, VI03, numOutAttribs
|
||||||
|
NOP IBNE VI01, VI00, Ambloop
|
||||||
|
NOP SQ VF03, -numOutAttribs(VI03)
|
||||||
|
; end amblight
|
||||||
|
|
||||||
|
; Direct Light
|
||||||
|
NOP LQ VF26, lightDir(VI00)
|
||||||
|
NOP XITOP VI01
|
||||||
|
NOP XTOP VI02
|
||||||
|
NOP IADDIU VI03, VI12, 2
|
||||||
|
SUB.xyz VF26, VF00, VF26 NOP
|
||||||
|
Dirloop:
|
||||||
|
NOP LQ VF01, 3(VI02); ; normal
|
||||||
|
NOP LQ VF02, 0(VI03); ; output color
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
MUL VF03, VF01, VF26 NOP
|
||||||
|
ITOF0 VF02, VF02 NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
ADDy.x VF03, VF03, VF03y NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
ADDz.x VF03, VF03, VF03z NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
MAX.x VF03, VF00, VF03 NOP ; clamp to 0
|
||||||
|
NOP[I] LOI 255
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
MULi.x VF03, VF03, I NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
ADDx.xyz VF02, VF02, VF03x NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
FTOI0 VF02, VF02 NOP
|
||||||
|
NOP IADDI VI01, VI01, -1
|
||||||
|
NOP IADDIU VI02, VI02, numInAttribs
|
||||||
|
NOP IADDIU VI03, VI03, numOutAttribs
|
||||||
|
NOP IBNE VI01, VI00, Dirloop
|
||||||
|
NOP SQ VF02, -numOutAttribs(VI03)
|
||||||
|
; end dirlight
|
||||||
|
|
||||||
|
; Material color and clamp
|
||||||
|
NOP LQ VF27, matColor(VI00)
|
||||||
|
NOP XITOP VI01
|
||||||
|
NOP IADDIU VI03, VI12, 2
|
||||||
|
Colorloop:
|
||||||
|
NOP LQ VF03, 0(VI03)
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
ITOF0 VF03, VF03 NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
;; MUL VF03, VF03, VF27 NOP
|
||||||
|
NOP[I] LOI 255
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
MINIi VF03, VF03, I NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
NOP NOP
|
||||||
|
FTOI0 VF03, VF03 NOP
|
||||||
|
NOP IADDI VI01, VI01, -1
|
||||||
|
NOP IADDIU VI03, VI03, numOutAttribs
|
||||||
|
NOP IBNE VI01, VI00, Colorloop
|
||||||
|
NOP SQ VF03, -numOutAttribs(VI03)
|
||||||
|
; end material color
|
129
tools/ps2test/vu/skinpipe.dsm
Executable file
129
tools/ps2test/vu/skinpipe.dsm
Executable file
@ -0,0 +1,129 @@
|
|||||||
|
.global skinPipe
|
||||||
|
|
||||||
|
.equ vertexTop, 0x2d0
|
||||||
|
.equ numInAttribs, 5
|
||||||
|
.equ numOutAttribs, 3
|
||||||
|
.equ numOutBuf, 2
|
||||||
|
.equ vertCount, ((vertexTop-numOutBuf)/(numInAttribs*2+numOutAttribs*numOutBuf))
|
||||||
|
.equ offset, (vertCount*numInAttribs)
|
||||||
|
.equ outBuf1, (2*offset)
|
||||||
|
.equ outSize, ((vertexTop-outBuf1-2)/2)
|
||||||
|
.equ outBuf2, (outBuf1+outSize)
|
||||||
|
|
||||||
|
.equ lightMat, 0x3d0
|
||||||
|
.equ lightDir, 0x3d4
|
||||||
|
.equ matrix, 0x3f0
|
||||||
|
.equ XYZScale, 0x3f7
|
||||||
|
.equ XYZOffset, 0x3f8
|
||||||
|
.equ gifTag, 0x3fa
|
||||||
|
.equ matColor, 0x3fb
|
||||||
|
.equ ambientLight, 0x3fd
|
||||||
|
|
||||||
|
/* This is the the projection matrix we start with:
|
||||||
|
* 1/2w 0 ox/2w + 1/2 -ox/2w
|
||||||
|
* 0 -1/2h -oy/2h + 1/2 oy/2h
|
||||||
|
* 0 0 1 0
|
||||||
|
* 0 0 1 0
|
||||||
|
* To get rid of the +1/2 in the combined matrix we
|
||||||
|
* subtract the z-row/2 from the x- and y-rows.
|
||||||
|
*
|
||||||
|
* The z-row is then set to [0 0 0 1] such that multiplication
|
||||||
|
* by XYZscale gives [0 0 0 zScale]. After perspective division
|
||||||
|
* and addition of XYZoffset we then get zScale/w + zShift for z.
|
||||||
|
*
|
||||||
|
* XYZScale scales xy to the resolution and z by zScale.
|
||||||
|
* XYZOffset translates xy to the GS coordinate system (where
|
||||||
|
* [2048, 2048] is the center of the frame buffer) and add zShift to z.
|
||||||
|
*/
|
||||||
|
|
||||||
|
; constant:
|
||||||
|
; VF28-VF31 transformation matrix
|
||||||
|
; VF25 XYZ offset
|
||||||
|
|
||||||
|
|
||||||
|
.balign 16,0
|
||||||
|
skinPipe:
|
||||||
|
DMAret *
|
||||||
|
MPG 0, *
|
||||||
|
.vu
|
||||||
|
Start:
|
||||||
|
SUB.z VF28, VF28, VF28 LOI 0.5 ; right.z = 0
|
||||||
|
SUB.z VF29, VF29, VF29 LQ VF28, matrix(VI00) ; up.z = 0 - load matrix
|
||||||
|
SUB.z VF30, VF30, VF30 LQ VF29, matrix+1(VI00) ; at.z = 0 - load matrix
|
||||||
|
ADDw.z VF31, VF00, VF00 LQ VF30, matrix+2(VI00) ; at.z = 1 - load matrix
|
||||||
|
NOP LQ VF31, matrix+3(VI00) ; - load matrix
|
||||||
|
MULi.w VF20, VF28, I LQ.xyz VF01, XYZScale(VI00) ; fix matrix - load scale
|
||||||
|
MULi.w VF21, VF29, I NOP ; fix matrix
|
||||||
|
MULi.w VF22, VF30, I NOP ; fix matrix
|
||||||
|
MULi.w VF23, VF31, I NOP ; fix matrix
|
||||||
|
SUBw.xy VF28, VF28, VF20 NOP ; fix matrix
|
||||||
|
SUBw.xy VF29, VF29, VF21 NOP ; fix matrix
|
||||||
|
SUBw.xy VF30, VF30, VF22 NOP ; fix matrix
|
||||||
|
SUBw.xy VF31, VF31, VF23 NOP ; fix matrix
|
||||||
|
MUL.xy VF28, VF28, VF01 LQ.xyz VF25, XYZOffset(VI00) ; scale matrix
|
||||||
|
MUL.xy VF29, VF29, VF01 IADDIU VI12, VI00, outBuf1 ; scale matrix
|
||||||
|
MUL.xy VF30, VF30, VF01 IADDIU VI13, VI00, outBuf2 ; scale matrix
|
||||||
|
MUL.xyz VF31, VF31, VF01 NOP ; scale matrix
|
||||||
|
Cnt:
|
||||||
|
NOP XTOP VI02 ; input pointer
|
||||||
|
NOP LQ VF01, gifTag(VI00)
|
||||||
|
NOP XITOP VI01 ; vertex count
|
||||||
|
NOP IADDIU VI05, VI00, 0x4000
|
||||||
|
NOP IADD VI05, VI05, VI05
|
||||||
|
NOP IOR VI05, VI05, VI01
|
||||||
|
NOP SQ VF01, 0(VI12)
|
||||||
|
NOP ISW.x VI05, 0(VI12)
|
||||||
|
NOP IADDIU VI03, VI12, 1 ; output pointer
|
||||||
|
NOP LQ VF18, lightMat(VI00)
|
||||||
|
NOP LQ VF19, lightMat+1(VI00)
|
||||||
|
NOP LQ VF20, lightMat+2(VI00)
|
||||||
|
|
||||||
|
Loop:
|
||||||
|
NOP LQI VF01, (VI02++) ; vertex
|
||||||
|
NOP LQI VF02, (VI02++) ; UV
|
||||||
|
NOP LQI VF03, (VI02++) ; color
|
||||||
|
NOP LQI VF04, (VI02++) ; normal
|
||||||
|
NOP IADDIU VI02, VI02, 1 ; skip weights
|
||||||
|
|
||||||
|
MULAw.xyzw ACC, VF31, VF00w NOP ; transform vertex
|
||||||
|
MADDAx.xyw ACC, VF28, VF01x NOP
|
||||||
|
MADDAy.xyw ACC, VF29, VF01y NOP
|
||||||
|
MADDz.xyzw VF01, VF30, VF01z NOP
|
||||||
|
ITOF0 VF03, VF03 NOP
|
||||||
|
ITOF0[I] VF04, VF04 LOI 0.0078125 ; - normal scale
|
||||||
|
NOP NOP
|
||||||
|
NOP DIV Q, VF00w, VF01w
|
||||||
|
NOP WAITQ
|
||||||
|
MULq VF01, VF01, Q NOP ; perspective division
|
||||||
|
MULi VF04, VF04, I NOP ; scale normal
|
||||||
|
NOP MR32.z VF02, VF00
|
||||||
|
NOP NOP
|
||||||
|
SUB.w VF01, VF01, VF01 NOP
|
||||||
|
MULAx.xyz ACC, VF18, VF04x NOP ; transform normal
|
||||||
|
MADDAy.xyz ACC, VF19, VF04y NOP
|
||||||
|
MADDz.xyz VF04, VF20, VF04z NOP
|
||||||
|
ADD.xyz VF01, VF01, VF25 NOP
|
||||||
|
MULq VF02, VF02, Q NOP
|
||||||
|
NOP NOP
|
||||||
|
FTOI0 VF03, VF03 NOP
|
||||||
|
FTOI4 VF01, VF01 NOP
|
||||||
|
NOP SQ VF04, -2(VI02) ; store normal
|
||||||
|
NOP IADDI VI01, VI01, -1
|
||||||
|
NOP SQI VF02, (VI03++) ; STQ
|
||||||
|
NOP SQI VF03, (VI03++) ; color
|
||||||
|
NOP SQI VF01, (VI03++) ; vertex
|
||||||
|
NOP IBNE VI01, VI00, Loop
|
||||||
|
NOP NOP
|
||||||
|
|
||||||
|
#include "light.vu"
|
||||||
|
|
||||||
|
NOP XGKICK VI12
|
||||||
|
NOP IADD VI15,VI00,VI12
|
||||||
|
NOP IADD VI12,VI00,VI13
|
||||||
|
NOP[E] IADD VI13,VI00,VI15
|
||||||
|
NOP NOP
|
||||||
|
NOP B Cnt
|
||||||
|
NOP NOP
|
||||||
|
|
||||||
|
.EndMPG
|
||||||
|
.EndDmaData
|
98
tools/ps2test/vu/vu.dsm
Executable file
98
tools/ps2test/vu/vu.dsm
Executable file
@ -0,0 +1,98 @@
|
|||||||
|
.data
|
||||||
|
.global MyDmaPacket
|
||||||
|
.global vuLightMat
|
||||||
|
.global vuMat
|
||||||
|
.global vuXYZScale
|
||||||
|
.global vuXYZOffset
|
||||||
|
.global vuOffset
|
||||||
|
.global vuGIFtag
|
||||||
|
.global vuMatcolor
|
||||||
|
.global vuSurfProps
|
||||||
|
.global vuAmbLight
|
||||||
|
.global mpgCall
|
||||||
|
.global textureCall
|
||||||
|
.global geometryCall
|
||||||
|
|
||||||
|
.align 4
|
||||||
|
|
||||||
|
MyDmaPacket:
|
||||||
|
DMAcnt *
|
||||||
|
.EndDmaData
|
||||||
|
|
||||||
|
mpgCall:
|
||||||
|
DMAcall *, 0 ;vuProg
|
||||||
|
.EndDmaData
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define vuSDLightOffset 0x3d0
|
||||||
|
#define vuSDBlockLow 0x3c3
|
||||||
|
#define vuSDBlockHigh 0x3f0
|
||||||
|
#define vuSDmat0 vuSDBlockHigh
|
||||||
|
#define vuSDmat1 vuSDBlockHigh+1
|
||||||
|
#define vuSDmat2 vuSDBlockHigh+2
|
||||||
|
#define vuSDmat3 vuSDBlockHigh+3
|
||||||
|
#define vuSDnearClip vuSDBlockHigh+4
|
||||||
|
#define vuSDfarClip vuSDBlockHigh+5
|
||||||
|
#define vuSDxMaxyMax vuSDBlockHigh+6
|
||||||
|
#define vuSDcamWcamHzScale vuSDBlockHigh+7
|
||||||
|
#define vuSDoffXoffYzShift vuSDBlockHigh+8
|
||||||
|
#define vuSDrealOffset vuSDBlockHigh+9
|
||||||
|
#define vuSDgifTag vuSDBlockHigh+10
|
||||||
|
#define vuSDcolScale vuSDBlockHigh+11
|
||||||
|
#define vuSDsurfProps vuSDBlockHigh+12
|
||||||
|
#define vuSDpingPongAddr vuSDBlockHigh+13
|
||||||
|
#define vuSDpingPongCount vuSDBlockHigh+14
|
||||||
|
#define vuSDClipvec1 vuSDBlockHigh+13
|
||||||
|
#define vuSDClipvec2 vuSDBlockHigh+14
|
||||||
|
#define vuSDVUSwitch vuSDBlockHigh+15
|
||||||
|
*/
|
||||||
|
|
||||||
|
DMAcnt *
|
||||||
|
UNPACK 4, 4, V4_32, 0x3d0, *
|
||||||
|
vuLightMat:
|
||||||
|
.float 1.0, 0.0, 0.0, 0.0
|
||||||
|
.float 0.0, 1.0, 0.0, 0.0
|
||||||
|
.float 0.0, 0.0, 1.0, 0.0
|
||||||
|
.float 0.0, 0.0, 0.0, 1.0
|
||||||
|
lightDir:
|
||||||
|
.float 0.5, -0.5, -0.70710, 0.0
|
||||||
|
.EndUnpack
|
||||||
|
|
||||||
|
UNPACK 4, 4, V4_32, 0x3f0, *
|
||||||
|
vuMat:
|
||||||
|
.float 0.0, 0.0, 0.0, 0.0
|
||||||
|
.float 0.0, 0.0, 0.0, 0.0
|
||||||
|
.float 0.0, 0.0, 0.0, 0.0
|
||||||
|
.float 0.0, 0.0, 0.0, 0.0
|
||||||
|
.EndUnpack
|
||||||
|
|
||||||
|
UNPACK 4, 4, V4_32, 0x3f7, *
|
||||||
|
vuXYZScale:
|
||||||
|
.float 0.0, 0.0, 0.0, 0.0
|
||||||
|
vuXYZOffset:
|
||||||
|
.float 0.0, 0.0, 0.0, 0.0
|
||||||
|
vuOffset:
|
||||||
|
.float 0.0, 0.0, 0.0, 0.0
|
||||||
|
vuGIFtag:
|
||||||
|
.int 0x00008000, 0x3005C000, 0x0000000412, 0x00000000
|
||||||
|
vuMatcolor:
|
||||||
|
.float 1.0, 1.0, 1.0, 0.5
|
||||||
|
vuSurfProps:
|
||||||
|
.float 1.0, 1.0, 1.0, 1.0
|
||||||
|
vuAmbLight:
|
||||||
|
.float 0, 0, 0, 0
|
||||||
|
.EndUnpack
|
||||||
|
.EndDmaData
|
||||||
|
|
||||||
|
;;textureCall:
|
||||||
|
;;DMAcall *, 0
|
||||||
|
;;.EndDmaData
|
||||||
|
|
||||||
|
geometryCall:
|
||||||
|
DMAcall *, 0 ;vuGeometry
|
||||||
|
BASE 0
|
||||||
|
OFFSET 0x0
|
||||||
|
.EndDmaData
|
||||||
|
|
||||||
|
DMAend
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user