Render3D:

- Do some code cleanup and refactoring.
This commit is contained in:
rogerman 2015-05-07 00:42:28 +00:00
parent f56e15da02
commit 0c0f968d01
8 changed files with 306 additions and 242 deletions

View File

@ -160,7 +160,8 @@ int NDS_Init()
//why is this done here? shitty engineering. not intended.
NDS_RunAdvansceneAutoImport();
}
Render3D_Init();
gfx3d_init();
armcpu_new(&NDS_ARM9,0);
@ -190,7 +191,7 @@ void NDS_DeInit(void)
SPU_DeInit();
Screen_DeInit();
MMU_DeInit();
gpu3D->NDS_3D_Close();
Render3D_DeInit();
WIFI_DeInit();

View File

@ -578,29 +578,32 @@ void texDeleteCallback(TexCacheItem *item)
}
template<bool require_profile, bool enable_3_2>
static char OGLInit(void)
static Render3D* OGLInit()
{
char result = 0;
OpenGLRenderer *newRenderer = NULL;
Render3DError error = OGLERROR_NOERR;
if(!oglrender_init)
return result;
if(!oglrender_init())
return result;
result = Default3D_Init();
if (result == 0)
if (oglrender_init == NULL)
{
return result;
return NULL;
}
if(!BEGINGL())
if (!oglrender_init())
{
return NULL;
}
if (!BEGINGL())
{
INFO("OpenGL<%s,%s>: Could not initialize -- BEGINGL() failed.\n",require_profile?"force":"auto",enable_3_2?"3_2":"old");
result = 0;
return result;
return NULL;
}
// Force the creation of a new rendering object since we don't know what OpenGL version
// the user might be requesting.
delete _OGLRenderer;
_OGLRenderer = NULL;
// Get OpenGL info
const char *oglVersionString = (const char *)glGetString(GL_VERSION);
const char *oglVendorString = (const char *)glGetString(GL_VENDOR);
@ -611,9 +614,8 @@ static char OGLInit(void)
// http://forums.desmume.org/viewtopic.php?id=9286
if(!strcmp(oglVendorString,"Intel") && strstr(oglRendererString,"965"))
{
INFO("Incompatible graphic card detected. Disabling OpenGL support.\n");
result = 0;
return result;
INFO("OpenGL: Incompatible graphic card detected. Disabling OpenGL support.\n");
return _OGLRenderer;
}
// Check the driver's OpenGL version
@ -625,74 +627,72 @@ static char OGLInit(void)
OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MAJOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_MINOR, OGLRENDER_MINIMUM_DRIVER_VERSION_REQUIRED_REVISION,
oglVersionString, oglVendorString, oglRendererString);
result = 0;
return result;
return _OGLRenderer;
}
// Create new OpenGL rendering object
if(enable_3_2)
if (enable_3_2)
{
if (OGLLoadEntryPoints_3_2_Func != NULL && OGLCreateRenderer_3_2_Func != NULL)
{
OGLLoadEntryPoints_3_2_Func();
OGLLoadEntryPoints_Legacy(); //zero 04-feb-2013 - this seems to be necessary as well
OGLCreateRenderer_3_2_Func(&_OGLRenderer);
OGLCreateRenderer_3_2_Func(&newRenderer);
}
else
{
if(require_profile)
return 0;
return _OGLRenderer;
}
}
// If the renderer doesn't initialize with OpenGL v3.2 or higher, fall back
// to one of the lower versions.
if (_OGLRenderer == NULL)
if (newRenderer == NULL)
{
OGLLoadEntryPoints_Legacy();
if (IsVersionSupported(2, 1, 0))
{
_OGLRenderer = new OpenGLRenderer_2_1;
_OGLRenderer->SetVersion(2, 1, 0);
newRenderer = new OpenGLRenderer_2_1;
newRenderer->SetVersion(2, 1, 0);
}
else if (IsVersionSupported(2, 0, 0))
{
_OGLRenderer = new OpenGLRenderer_2_0;
_OGLRenderer->SetVersion(2, 0, 0);
newRenderer = new OpenGLRenderer_2_0;
newRenderer->SetVersion(2, 0, 0);
}
else if (IsVersionSupported(1, 5, 0))
{
_OGLRenderer = new OpenGLRenderer_1_5;
_OGLRenderer->SetVersion(1, 5, 0);
newRenderer = new OpenGLRenderer_1_5;
newRenderer->SetVersion(1, 5, 0);
}
else if (IsVersionSupported(1, 4, 0))
{
_OGLRenderer = new OpenGLRenderer_1_4;
_OGLRenderer->SetVersion(1, 4, 0);
newRenderer = new OpenGLRenderer_1_4;
newRenderer->SetVersion(1, 4, 0);
}
else if (IsVersionSupported(1, 3, 0))
{
_OGLRenderer = new OpenGLRenderer_1_3;
_OGLRenderer->SetVersion(1, 3, 0);
newRenderer = new OpenGLRenderer_1_3;
newRenderer->SetVersion(1, 3, 0);
}
else if (IsVersionSupported(1, 2, 0))
{
_OGLRenderer = new OpenGLRenderer_1_2;
_OGLRenderer->SetVersion(1, 2, 0);
newRenderer = new OpenGLRenderer_1_2;
newRenderer->SetVersion(1, 2, 0);
}
}
if (_OGLRenderer == NULL)
if (newRenderer == NULL)
{
INFO("OpenGL: Renderer did not initialize. Disabling 3D renderer.\n[ Driver Info -\n Version: %s\n Vendor: %s\n Renderer: %s ]\n",
oglVersionString, oglVendorString, oglRendererString);
result = 0;
return result;
return _OGLRenderer;
}
// Initialize OpenGL extensions
error = _OGLRenderer->InitExtensions();
error = newRenderer->InitExtensions();
if (error != OGLERROR_NOERR)
{
if ( IsVersionSupported(2, 0, 0) &&
@ -701,31 +701,48 @@ static char OGLInit(void)
error == OGLERROR_FRAGMENT_SHADER_PROGRAM_LOAD_ERROR) )
{
INFO("OpenGL: Shaders are not working, even though they should be. Disabling 3D renderer.\n");
result = 0;
return result;
delete newRenderer;
return _OGLRenderer;
}
else if (IsVersionSupported(3, 0, 0) && error == OGLERROR_FBO_CREATE_ERROR && OGLLoadEntryPoints_3_2_Func != NULL)
{
INFO("OpenGL: FBOs are not working, even though they should be. Disabling 3D renderer.\n");
result = 0;
return result;
delete newRenderer;
return _OGLRenderer;
}
}
// Initialization finished -- reset the renderer
_OGLRenderer->Reset();
newRenderer->Reset();
ENDGL();
unsigned int major = 0;
unsigned int minor = 0;
unsigned int revision = 0;
_OGLRenderer->GetVersion(&major, &minor, &revision);
newRenderer->GetVersion(&major, &minor, &revision);
INFO("OpenGL: Renderer initialized successfully (v%u.%u.%u).\n[ Driver Info -\n Version: %s\n Vendor: %s\n Renderer: %s ]\n",
major, minor, revision, oglVersionString, oglVendorString, oglRendererString);
return result;
_OGLRenderer = newRenderer;
return _OGLRenderer;
}
static void OGLClose()
{
if(!BEGINGL())
return;
if (CurrentRenderer == _OGLRenderer)
{
CurrentRenderer = NULL;
}
delete _OGLRenderer;
_OGLRenderer = NULL;
ENDGL();
}
static void OGLReset()
@ -738,19 +755,6 @@ static void OGLReset()
ENDGL();
}
static void OGLClose()
{
if(!BEGINGL())
return;
delete _OGLRenderer;
_OGLRenderer = NULL;
ENDGL();
Default3D_Close();
}
static void OGLRender()
{
if(!BEGINGL())
@ -785,8 +789,8 @@ static void OGLRenderFinish()
GPU3DInterface gpu3Dgl = {
"OpenGL",
OGLInit<false,true>,
OGLReset,
OGLClose,
OGLReset,
OGLRender,
OGLRenderFinish,
OGLVramReconfigureSignal
@ -796,8 +800,8 @@ GPU3DInterface gpu3Dgl = {
GPU3DInterface gpu3DglOld = {
"OpenGL Old",
OGLInit<true,false>,
OGLReset,
OGLClose,
OGLReset,
OGLRender,
OGLRenderFinish,
OGLVramReconfigureSignal
@ -807,8 +811,8 @@ GPU3DInterface gpu3DglOld = {
GPU3DInterface gpu3Dgl_3_2 = {
"OpenGL 3.2",
OGLInit<true,true>,
OGLReset,
OGLClose,
OGLReset,
OGLRender,
OGLRenderFinish,
OGLVramReconfigureSignal
@ -816,6 +820,9 @@ GPU3DInterface gpu3Dgl_3_2 = {
OpenGLRenderer::OpenGLRenderer()
{
_renderID = RENDERID_OPENGL_AUTO;
_renderName = "OpenGL";
versionMajor = 0;
versionMinor = 0;
versionRevision = 0;
@ -967,7 +974,7 @@ OpenGLRenderer_1_2::~OpenGLRenderer_1_2()
DestroyFBOs();
DestroyMultisampledFBO();
//kill the tex cache to free all the texture ids
// Kill the texture cache now before all of our texture IDs disappear.
TexCache_Reset();
while(!ref->freeTextureIDs.empty())
@ -1196,10 +1203,10 @@ Render3DError OpenGLRenderer_1_2::InitGeometryProgramShaderLocations()
OGLRenderRef &OGLRef = *this->ref;
// Set up shader uniforms
OGLRef.uniformTexRenderObject = glGetUniformLocation(OGLRef.programGeometryID, "texRenderObject");
OGLRef.uniformTexToonTable = glGetUniformLocation(OGLRef.programGeometryID, "texToonTable");
glUniform1i(OGLRef.uniformTexRenderObject, 0);
glUniform1i(OGLRef.uniformTexToonTable, OGLTextureUnitID_ToonTable);
const GLint uniformTexRenderObject = glGetUniformLocation(OGLRef.programGeometryID, "texRenderObject");
const GLint uniformTexToonTable = glGetUniformLocation(OGLRef.programGeometryID, "texToonTable");
glUniform1i(uniformTexRenderObject, 0);
glUniform1i(uniformTexToonTable, OGLTextureUnitID_ToonTable);
OGLRef.uniformStateToonShadingMode = glGetUniformLocation(OGLRef.programGeometryID, "stateToonShadingMode");
OGLRef.uniformStateEnableAlphaTest = glGetUniformLocation(OGLRef.programGeometryID, "stateEnableAlphaTest");
@ -2071,7 +2078,7 @@ Render3DError OpenGLRenderer_1_2::BeginRender(const GFX3D &engine)
return OGLERROR_NOERR;
}
Render3DError OpenGLRenderer_1_2::RenderGeometry(const GFX3D_State &renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList)
Render3DError OpenGLRenderer_1_2::RenderGeometry(const GFX3D_State &renderState, const POLYLIST *polyList, const INDEXLIST *indexList)
{
OGLRenderRef &OGLRef = *this->ref;
const size_t polyCount = polyList->count;
@ -2413,7 +2420,7 @@ Render3DError OpenGLRenderer_1_2::SetupTexture(const POLY &thePoly, bool enableT
const PolygonTexParams params = thePoly.getTexParams();
// Check if we need to use textures
if (thePoly.texParam == 0 || params.texFormat == TEXMODE_NONE || !enableTexturing)
if (params.texFormat == TEXMODE_NONE || !enableTexturing)
{
if (this->isShaderSupported)
{
@ -2538,6 +2545,14 @@ Render3DError OpenGLRenderer_1_2::Reset()
OGLRef.vtxPtrTexCoord = (GLvoid *)offsetof(VERT, texcoord);
OGLRef.vtxPtrColor = (this->isShaderSupported) ? (GLvoid *)offsetof(VERT, color) : OGLRef.color4fBuffer;
memset(this->clearImageColor16Buffer, 0, sizeof(this->clearImageColor16Buffer));
memset(this->clearImageDepthBuffer, 0, sizeof(this->clearImageDepthBuffer));
memset(this->clearImagePolyIDBuffer, 0, sizeof(this->clearImagePolyIDBuffer));
memset(this->clearImageFogBuffer, 0, sizeof(this->clearImageFogBuffer));
memset(gfx3d_convertedScreen, 0, sizeof(gfx3d_convertedScreen));
TexCache_Reset();
return OGLERROR_NOERR;
}
@ -3116,13 +3131,13 @@ Render3DError OpenGLRenderer_2_0::InitEdgeMarkProgramShaderLocations()
{
OGLRenderRef &OGLRef = *this->ref;
OGLRef.uniformTexGDepth_EdgeMark = glGetUniformLocation(OGLRef.programEdgeMarkID, "texInFragDepth");
OGLRef.uniformTexGPolyID_EdgeMark = glGetUniformLocation(OGLRef.programEdgeMarkID, "texInPolyID");
glUniform1i(OGLRef.uniformTexGDepth_EdgeMark, OGLTextureUnitID_GDepth);
glUniform1i(OGLRef.uniformTexGPolyID_EdgeMark, OGLTextureUnitID_GPolyID);
const GLint uniformTexGDepth = glGetUniformLocation(OGLRef.programEdgeMarkID, "texInFragDepth");
const GLint uniformTexGPolyID = glGetUniformLocation(OGLRef.programEdgeMarkID, "texInPolyID");
glUniform1i(uniformTexGDepth, OGLTextureUnitID_GDepth);
glUniform1i(uniformTexGPolyID, OGLTextureUnitID_GPolyID);
OGLRef.uniformFramebufferSize = glGetUniformLocation(OGLRef.programEdgeMarkID, "framebufferSize");
OGLRef.uniformStateEdgeColor = glGetUniformLocation(OGLRef.programEdgeMarkID, "stateEdgeColor");
OGLRef.uniformFramebufferSize = glGetUniformLocation(OGLRef.programEdgeMarkID, "framebufferSize");
OGLRef.uniformStateEdgeColor = glGetUniformLocation(OGLRef.programEdgeMarkID, "stateEdgeColor");
return OGLERROR_NOERR;
}
@ -3307,12 +3322,12 @@ Render3DError OpenGLRenderer_2_0::InitFogProgramShaderLocations()
{
OGLRenderRef &OGLRef = *this->ref;
OGLRef.uniformTexGColor_Fog = glGetUniformLocation(OGLRef.programFogID, "texInFragColor");
OGLRef.uniformTexGDepth_Fog = glGetUniformLocation(OGLRef.programFogID, "texInFragDepth");
OGLRef.uniformTexGFog_Fog = glGetUniformLocation(OGLRef.programFogID, "texInFogAttributes");
glUniform1i(OGLRef.uniformTexGColor_Fog, OGLTextureUnitID_GColor);
glUniform1i(OGLRef.uniformTexGDepth_Fog, OGLTextureUnitID_GDepth);
glUniform1i(OGLRef.uniformTexGFog_Fog, OGLTextureUnitID_FogAttr);
const GLint uniformTexGColor = glGetUniformLocation(OGLRef.programFogID, "texInFragColor");
const GLint uniformTexGDepth = glGetUniformLocation(OGLRef.programFogID, "texInFragDepth");
const GLint uniformTexGFog = glGetUniformLocation(OGLRef.programFogID, "texInFogAttributes");
glUniform1i(uniformTexGColor, OGLTextureUnitID_GColor);
glUniform1i(uniformTexGDepth, OGLTextureUnitID_GDepth);
glUniform1i(uniformTexGFog, OGLTextureUnitID_FogAttr);
OGLRef.uniformStateEnableFogAlphaOnly = glGetUniformLocation(OGLRef.programFogID, "stateEnableFogAlphaOnly");
OGLRef.uniformStateFogColor = glGetUniformLocation(OGLRef.programFogID, "stateFogColor");
@ -3675,7 +3690,7 @@ Render3DError OpenGLRenderer_2_0::SetupTexture(const POLY &thePoly, bool enableT
const PolygonTexParams params = thePoly.getTexParams();
// Check if we need to use textures
if (thePoly.texParam == 0 || params.texFormat == TEXMODE_NONE || !enableTexturing)
if (params.texFormat == TEXMODE_NONE || !enableTexturing)
{
glUniform1i(OGLRef.uniformPolyEnableTexture, GL_FALSE);
return OGLERROR_NOERR;

View File

@ -330,6 +330,13 @@ union GLvec2
GLfloat v[2];
};
union GLvec3
{
struct { GLfloat r, g, b; };
struct { GLfloat x, y, z; };
GLfloat v[3];
};
union GLvec4
{
struct { GLfloat r, g, b, a; };
@ -337,6 +344,13 @@ union GLvec4
GLfloat v[4];
};
struct OGLVertex
{
GLvec4 position;
GLvec2 texCoord;
GLvec3 color;
};
struct OGLRenderStates
{
GLvec2 framebufferSize;
@ -428,19 +442,6 @@ struct OGLRenderRef
GLuint programEdgeMarkID;
GLuint programFogID;
GLuint uniformBlockRenderStatesGeometry;
GLuint uniformBlockRenderStatesEdgeMark;
GLuint uniformBlockRenderStatesFog;
GLuint uniformTexBufferPolyStates;
GLuint uniformTexRenderObject;
GLuint uniformTexToonTable;
GLuint uniformTexGDepth_EdgeMark;
GLuint uniformTexGPolyID_EdgeMark;
GLuint uniformTexGColor_Fog;
GLuint uniformTexGDepth_Fog;
GLuint uniformTexGFog_Fog;
GLint uniformFramebufferSize;
GLint uniformStateToonShadingMode;
GLint uniformStateEnableAlphaTest;
@ -655,7 +656,7 @@ protected:
// Base rendering methods
virtual Render3DError BeginRender(const GFX3D &engine);
virtual Render3DError RenderGeometry(const GFX3D_State &renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList);
virtual Render3DError RenderGeometry(const GFX3D_State &renderState, const POLYLIST *polyList, const INDEXLIST *indexList);
virtual Render3DError EndRender(const u64 frameCount);
virtual Render3DError ClearUsingImage(const u16 *__restrict colorBuffer, const u32 *__restrict depthBuffer, const bool *__restrict fogBuffer, const u8 *__restrict polyIDBuffer);

View File

@ -549,13 +549,13 @@ Render3DError OpenGLRenderer_3_2::InitEdgeMarkProgramShaderLocations()
{
OGLRenderRef &OGLRef = *this->ref;
OGLRef.uniformBlockRenderStatesEdgeMark = glGetUniformBlockIndex(OGLRef.programEdgeMarkID, "RenderStates");
glUniformBlockBinding(OGLRef.programEdgeMarkID, OGLRef.uniformBlockRenderStatesEdgeMark, OGLBindingPointID_RenderStates);
const GLuint uniformBlockRenderStates = glGetUniformBlockIndex(OGLRef.programEdgeMarkID, "RenderStates");
glUniformBlockBinding(OGLRef.programEdgeMarkID, uniformBlockRenderStates, OGLBindingPointID_RenderStates);
OGLRef.uniformTexGDepth_EdgeMark = glGetUniformLocation(OGLRef.programEdgeMarkID, "texInFragDepth");
OGLRef.uniformTexGPolyID_EdgeMark = glGetUniformLocation(OGLRef.programEdgeMarkID, "texInPolyID");
glUniform1i(OGLRef.uniformTexGDepth_EdgeMark, OGLTextureUnitID_GDepth);
glUniform1i(OGLRef.uniformTexGPolyID_EdgeMark, OGLTextureUnitID_GPolyID);
const GLint uniformTexGDepth = glGetUniformLocation(OGLRef.programEdgeMarkID, "texInFragDepth");
const GLint uniformTexGPolyID = glGetUniformLocation(OGLRef.programEdgeMarkID, "texInPolyID");
glUniform1i(uniformTexGDepth, OGLTextureUnitID_GDepth);
glUniform1i(uniformTexGPolyID, OGLTextureUnitID_GPolyID);
return OGLERROR_NOERR;
}
@ -574,15 +574,15 @@ Render3DError OpenGLRenderer_3_2::InitFogProgramShaderLocations()
{
OGLRenderRef &OGLRef = *this->ref;
OGLRef.uniformBlockRenderStatesFog = glGetUniformBlockIndex(OGLRef.programFogID, "RenderStates");
glUniformBlockBinding(OGLRef.programFogID, OGLRef.uniformBlockRenderStatesFog, OGLBindingPointID_RenderStates);
const GLuint uniformBlockRenderStates = glGetUniformBlockIndex(OGLRef.programFogID, "RenderStates");
glUniformBlockBinding(OGLRef.programFogID, uniformBlockRenderStates, OGLBindingPointID_RenderStates);
OGLRef.uniformTexGColor_Fog = glGetUniformLocation(OGLRef.programFogID, "texInFragColor");
OGLRef.uniformTexGDepth_Fog = glGetUniformLocation(OGLRef.programFogID, "texInFragDepth");
OGLRef.uniformTexGFog_Fog = glGetUniformLocation(OGLRef.programFogID, "texInFogAttributes");
glUniform1i(OGLRef.uniformTexGColor_Fog, OGLTextureUnitID_GColor);
glUniform1i(OGLRef.uniformTexGDepth_Fog, OGLTextureUnitID_GDepth);
glUniform1i(OGLRef.uniformTexGFog_Fog, OGLTextureUnitID_FogAttr);
const GLint uniformTexGColor = glGetUniformLocation(OGLRef.programFogID, "texInFragColor");
const GLint uniformTexGDepth = glGetUniformLocation(OGLRef.programFogID, "texInFragDepth");
const GLint uniformTexGFog = glGetUniformLocation(OGLRef.programFogID, "texInFogAttributes");
glUniform1i(uniformTexGColor, OGLTextureUnitID_GColor);
glUniform1i(uniformTexGDepth, OGLTextureUnitID_GDepth);
glUniform1i(uniformTexGFog, OGLTextureUnitID_FogAttr);
return OGLERROR_NOERR;
}
@ -915,11 +915,11 @@ Render3DError OpenGLRenderer_3_2::InitGeometryProgramShaderLocations()
OGLRenderRef &OGLRef = *this->ref;
// Set up render states UBO
OGLRef.uniformBlockRenderStatesGeometry = glGetUniformBlockIndex(OGLRef.programGeometryID, "RenderStates");
glUniformBlockBinding(OGLRef.programGeometryID, OGLRef.uniformBlockRenderStatesGeometry, OGLBindingPointID_RenderStates);
const GLuint uniformBlockRenderStates = glGetUniformBlockIndex(OGLRef.programGeometryID, "RenderStates");
glUniformBlockBinding(OGLRef.programGeometryID, uniformBlockRenderStates, OGLBindingPointID_RenderStates);
GLint uboSize = 0;
glGetActiveUniformBlockiv(OGLRef.programGeometryID, OGLRef.uniformBlockRenderStatesGeometry, GL_UNIFORM_BLOCK_DATA_SIZE, &uboSize);
glGetActiveUniformBlockiv(OGLRef.programGeometryID, uniformBlockRenderStates, GL_UNIFORM_BLOCK_DATA_SIZE, &uboSize);
assert(uboSize == sizeof(OGLRenderStates));
glGenBuffers(1, &OGLRef.uboRenderStatesID);
@ -939,12 +939,12 @@ Render3DError OpenGLRenderer_3_2::InitGeometryProgramShaderLocations()
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA8UI, OGLRef.tboPolyStatesID);
glActiveTexture(GL_TEXTURE0);
OGLRef.uniformTexRenderObject = glGetUniformLocation(OGLRef.programGeometryID, "texRenderObject");
OGLRef.uniformTexBufferPolyStates = glGetUniformLocation(OGLRef.programGeometryID, "PolyStates");
glUniform1i(OGLRef.uniformTexRenderObject, 0);
glUniform1i(OGLRef.uniformTexBufferPolyStates, OGLTextureUnitID_PolyStates);
const GLint uniformTexRenderObject = glGetUniformLocation(OGLRef.programGeometryID, "texRenderObject");
const GLint uniformTexBufferPolyStates = glGetUniformLocation(OGLRef.programGeometryID, "PolyStates");
glUniform1i(uniformTexRenderObject, 0);
glUniform1i(uniformTexBufferPolyStates, OGLTextureUnitID_PolyStates);
OGLRef.uniformPolyStateIndex = glGetUniformLocation(OGLRef.programGeometryID, "polyIndex");
OGLRef.uniformPolyStateIndex = glGetUniformLocation(OGLRef.programGeometryID, "polyIndex");
return OGLERROR_NOERR;
}
@ -1112,7 +1112,7 @@ Render3DError OpenGLRenderer_3_2::BeginRender(const GFX3D &engine)
PolygonAttributes polyAttr = thePoly->getAttributes();
PolygonTexParams texParams = thePoly->getTexParams();
polyStates[i].enableTexture = (thePoly->texParam != 0 && texParams.texFormat != TEXMODE_NONE && engine.renderState.enableTexturing) ? GL_TRUE : GL_FALSE;
polyStates[i].enableTexture = (texParams.texFormat != TEXMODE_NONE && engine.renderState.enableTexturing) ? GL_TRUE : GL_FALSE;
polyStates[i].enableFog = (polyAttr.enableRenderFog) ? GL_TRUE : GL_FALSE;
polyStates[i].enableDepthWrite = ((!polyAttr.isTranslucent || polyAttr.enableAlphaDepthWrite) && !(polyAttr.polygonMode == 3 && polyAttr.polygonID == 0)) ? GL_TRUE : GL_FALSE;
polyStates[i].setNewDepthForTranslucent = (polyAttr.enableAlphaDepthWrite) ? GL_TRUE : GL_FALSE;
@ -1374,7 +1374,7 @@ Render3DError OpenGLRenderer_3_2::SetupTexture(const POLY &thePoly, bool enableT
const PolygonTexParams params = thePoly.getTexParams();
// Check if we need to use textures
if (thePoly.texParam == 0 || params.texFormat == TEXMODE_NONE || !enableTexturing)
if (params.texFormat == TEXMODE_NONE || !enableTexturing)
{
return OGLERROR_NOERR;
}

View File

@ -120,8 +120,6 @@ static FORCEINLINE int fastFloor(float f)
// verts[vert_index] = &rawvert;
//}
static SoftRasterizerRenderer *_SoftRastRenderer = NULL;
static FORCEINLINE int iround(float f) {
return (int)f; //lol
}
@ -1118,60 +1116,26 @@ void _HACK_Viewer_ExecUnit()
_HACK_viewer_rasterizerUnit.mainLoop<false>();
}
static char SoftRastInit(void)
static Render3D* SoftRastInit()
{
char result = Default3D_Init();
if (result == 0)
{
return result;
}
if (_SoftRastRenderer == NULL)
{
_SoftRastRenderer = new SoftRasterizerRenderer;
}
return result;
}
static void SoftRastReset()
{
_SoftRastRenderer->Reset();
}
static void SoftRastClose()
{
delete _SoftRastRenderer;
_SoftRastRenderer = NULL;
}
static void SoftRastRender()
{
_SoftRastRenderer->Render(gfx3d);
}
static void SoftRastVramReconfigureSignal()
{
_SoftRastRenderer->VramReconfigureSignal();
}
static void SoftRastRenderFinish()
{
_SoftRastRenderer->RenderFinish();
return new SoftRasterizerRenderer;
}
GPU3DInterface gpu3DRasterize = {
"SoftRasterizer",
SoftRastInit,
SoftRastReset,
SoftRastClose,
SoftRastRender,
SoftRastRenderFinish,
SoftRastVramReconfigureSignal
Default3D_Close,
Default3D_Reset,
Default3D_Render,
Default3D_RenderFinish,
Default3D_VramReconfigureSignal
};
SoftRasterizerRenderer::SoftRasterizerRenderer()
{
_renderID = RENDERID_SOFTRASTERIZER;
_renderName = "SoftRasterizer";
_debug_drawClippedUserPoly = -1;
clippedPolys = clipper.clippedPolys = new GFX3D_Clipper::TClippedPoly[POLYLIST_SIZE*2];
@ -1235,8 +1199,6 @@ SoftRasterizerRenderer::~SoftRasterizerRenderer()
free(screenAttributes);
free(screenColor);
Default3D_Close();
}
Render3DError SoftRasterizerRenderer::InitTables()
@ -1507,7 +1469,7 @@ Render3DError SoftRasterizerRenderer::BeginRender(const GFX3D &engine)
return RENDER3DERROR_NOERR;
}
Render3DError SoftRasterizerRenderer::RenderGeometry(const GFX3D_State &renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList)
Render3DError SoftRasterizerRenderer::RenderGeometry(const GFX3D_State &renderState, const POLYLIST *polyList, const INDEXLIST *indexList)
{
// If multithreaded, allow for states to finish setting up
if (this->_stateSetupNeedsFinish)
@ -1812,7 +1774,14 @@ Render3DError SoftRasterizerRenderer::Reset()
this->_stateSetupNeedsFinish = false;
this->_renderGeometryNeedsFinish = false;
Default3D_Reset();
memset(this->clearImageColor16Buffer, 0, sizeof(this->clearImageColor16Buffer));
memset(this->clearImageDepthBuffer, 0, sizeof(this->clearImageDepthBuffer));
memset(this->clearImagePolyIDBuffer, 0, sizeof(this->clearImagePolyIDBuffer));
memset(this->clearImageFogBuffer, 0, sizeof(this->clearImageFogBuffer));
memset(gfx3d_convertedScreen, 0, sizeof(gfx3d_convertedScreen));
TexCache_Reset();
return RENDER3DERROR_NOERR;
}
@ -1827,7 +1796,7 @@ Render3DError SoftRasterizerRenderer::Render(const GFX3D &engine)
return error;
}
this->RenderGeometry(engine.renderState, engine.vertlist, engine.polylist, &engine.indexlist);
this->RenderGeometry(engine.renderState, engine.polylist, &engine.indexlist);
this->EndRender(engine.frameCtr);
return error;

View File

@ -43,7 +43,7 @@ protected:
// Base rendering methods
virtual Render3DError BeginRender(const GFX3D &engine);
virtual Render3DError RenderGeometry(const GFX3D_State &renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList);
virtual Render3DError RenderGeometry(const GFX3D_State &renderState, const POLYLIST *polyList, const INDEXLIST *indexList);
virtual Render3DError RenderEdgeMarking(const u16 *colorTable, const bool useAntialias);
virtual Render3DError RenderFog(const u8 *densityTable, const u32 color, const u32 offset, const u8 shift, const bool alphaOnly);
virtual Render3DError EndRender(const u64 frameCount);

View File

@ -31,76 +31,118 @@ int cur3DCore = GPU3D_NULL;
GPU3DInterface gpu3DNull = {
"None",
Default3D_Init,
Default3D_Reset,
Default3D_Close,
Default3D_Reset,
Default3D_Render,
Default3D_RenderFinish,
Default3D_VramReconfigureSignal
};
GPU3DInterface *gpu3D = &gpu3DNull;
static bool default3DAlreadyClearedLayer = false;
static Render3D *_baseRenderer = NULL;
Render3D *CurrentRenderer = NULL;
char Default3D_Init()
void Render3D_Init()
{
default3DAlreadyClearedLayer = false;
return 1;
}
void Default3D_Reset()
{
default3DAlreadyClearedLayer = false;
TexCache_Reset();
}
void Default3D_Close()
{
memset(gfx3d_convertedScreen, 0, sizeof(gfx3d_convertedScreen));
default3DAlreadyClearedLayer = false;
}
void Default3D_Render()
{
if (!default3DAlreadyClearedLayer)
if (_baseRenderer == NULL)
{
memset(gfx3d_convertedScreen, 0, sizeof(gfx3d_convertedScreen));
default3DAlreadyClearedLayer = true;
_baseRenderer = new Render3D;
}
if (CurrentRenderer == NULL)
{
gpu3D = &gpu3DNull;
cur3DCore = GPU3D_NULL;
CurrentRenderer = _baseRenderer;
}
}
void Default3D_RenderFinish()
void Render3D_DeInit()
{
// Do nothing
}
void Default3D_VramReconfigureSignal()
{
TexCache_Invalidate();
}
void NDS_3D_SetDriver (int core3DIndex)
{
cur3DCore = core3DIndex;
gpu3D = core3DList[cur3DCore];
gpu3D->NDS_3D_Close();
delete _baseRenderer;
_baseRenderer = NULL;
}
bool NDS_3D_ChangeCore(int newCore)
{
gpu3D->NDS_3D_Close();
NDS_3D_SetDriver(newCore);
if(gpu3D->NDS_3D_Init() == 0)
bool result = false;
Render3DInterface *newRenderInterface = core3DList[newCore];
if (newRenderInterface->NDS_3D_Init == NULL)
{
NDS_3D_SetDriver(GPU3D_NULL);
gpu3D->NDS_3D_Init();
return false;
return result;
}
return true;
if (newRenderInterface == gpu3D)
{
result = true;
return result;
}
// Some resources are shared between renderers, such as the texture cache,
// so we need to shut down the current renderer now to ensure that any
// shared resources aren't in use.
CurrentRenderer->RenderFinish();
gpu3D->NDS_3D_Close();
gpu3D = &gpu3DNull;
cur3DCore = GPU3D_NULL;
CurrentRenderer = _baseRenderer;
Render3D *newRenderer = newRenderInterface->NDS_3D_Init();
if (newRenderer == NULL)
{
return result;
}
gpu3D = newRenderInterface;
cur3DCore = newCore;
CurrentRenderer = newRenderer;
result = true;
return result;
}
Render3D* Default3D_Init()
{
_baseRenderer->Reset();
return _baseRenderer;
}
void Default3D_Close()
{
if (CurrentRenderer != _baseRenderer)
{
delete CurrentRenderer;
CurrentRenderer = NULL;
}
}
void Default3D_Reset()
{
CurrentRenderer->Reset();
}
void Default3D_Render()
{
CurrentRenderer->Render(gfx3d);
}
void Default3D_RenderFinish()
{
CurrentRenderer->RenderFinish();
}
void Default3D_VramReconfigureSignal()
{
CurrentRenderer->VramReconfigureSignal();
}
Render3D::Render3D()
{
_renderID = RENDERID_NULL;
_renderName = "None";
static bool needTableInit = true;
if (needTableInit)
@ -116,12 +158,28 @@ Render3D::Render3D()
Reset();
}
Render3D::~Render3D()
{
memset(gfx3d_convertedScreen, 0, sizeof(gfx3d_convertedScreen));
TexCache_Reset();
}
RendererID Render3D::GetRenderID()
{
return this->_renderID;
}
std::string Render3D::GetName()
{
return this->_renderName;
}
Render3DError Render3D::BeginRender(const GFX3D &engine)
{
return RENDER3DERROR_NOERR;
}
Render3DError Render3D::RenderGeometry(const GFX3D_State &renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList)
Render3DError Render3D::RenderGeometry(const GFX3D_State &renderState, const POLYLIST *polyList, const INDEXLIST *indexList)
{
return RENDER3DERROR_NOERR;
}
@ -251,6 +309,9 @@ Render3DError Render3D::Reset()
memset(this->clearImageDepthBuffer, 0, sizeof(this->clearImageDepthBuffer));
memset(this->clearImagePolyIDBuffer, 0, sizeof(this->clearImagePolyIDBuffer));
memset(this->clearImageFogBuffer, 0, sizeof(this->clearImageFogBuffer));
memset(gfx3d_convertedScreen, 0, sizeof(gfx3d_convertedScreen));
TexCache_Reset();
return RENDER3DERROR_NOERR;
}
@ -268,7 +329,7 @@ Render3DError Render3D::Render(const GFX3D &engine)
this->UpdateToonTable(engine.renderState.u16ToonTable);
this->ClearFramebuffer(engine.renderState);
this->RenderGeometry(engine.renderState, engine.vertlist, engine.polylist, &engine.indexlist);
this->RenderGeometry(engine.renderState, engine.polylist, &engine.indexlist);
if (engine.renderState.enableEdgeMarking)
{
@ -287,6 +348,7 @@ Render3DError Render3D::Render(const GFX3D &engine)
Render3DError Render3D::RenderFinish()
{
memset(gfx3d_convertedScreen, 0, sizeof(gfx3d_convertedScreen));
return RENDER3DERROR_NOERR;
}

View File

@ -22,36 +22,35 @@
#include "gfx3d.h"
#include "types.h"
//not using this right now
#define CALL_CONVENTION
#define kUnsetTranslucentPolyID 255
class Render3D;
typedef struct Render3DInterface
{
// The name of the plugin, this name will appear in the plugins list
const char * name;
//called once when the plugin starts up
char (CALL_CONVENTION* NDS_3D_Init) ();
const char *name;
//called when the emulator resets (is this necessary?)
void (CALL_CONVENTION* NDS_3D_Reset) ();
//called once when the plugin starts up
Render3D* (*NDS_3D_Init)();
//called when the plugin shuts down
void (CALL_CONVENTION* NDS_3D_Close) ();
void (*NDS_3D_Close)();
//called when the emulator resets
void (*NDS_3D_Reset)();
//called when the renderer should do its job and render the current display lists
void (CALL_CONVENTION* NDS_3D_Render) ();
void (*NDS_3D_Render)();
// Called whenever 3D rendering needs to finish. This function should block the calling thread
// and only release the block when 3D rendering is finished. (Before reading the 3D layer, be
// sure to always call this function.)
void (CALL_CONVENTION* NDS_3D_RenderFinish) ();
void (*NDS_3D_RenderFinish)();
//called when the emulator reconfigures its vram. you may need to invalidate your texture cache.
void (CALL_CONVENTION* NDS_3D_VramReconfigureSignal) ();
void (*NDS_3D_VramReconfigureSignal)();
} GPU3DInterface;
extern int cur3DCore;
@ -64,18 +63,29 @@ extern GPU3DInterface *core3DList[];
extern GPU3DInterface gpu3DNull;
// Extern pointer
extern Render3D *CurrentRenderer;
extern GPU3DInterface *gpu3D;
char Default3D_Init();
void Default3D_Reset();
Render3D* Default3D_Init();
void Default3D_Close();
void Default3D_Reset();
void Default3D_Render();
void Default3D_RenderFinish();
void Default3D_VramReconfigureSignal();
void NDS_3D_SetDriver (int core3DIndex);
void Render3D_Init();
void Render3D_DeInit();
bool NDS_3D_ChangeCore(int newCore);
enum RendererID
{
RENDERID_NULL = 0,
RENDERID_SOFTRASTERIZER = 1,
RENDERID_OPENGL_AUTO = 1000,
RENDERID_OPENGL_LEGACY = 1001,
RENDERID_OPENGL_3_2 = 1002
};
enum Render3DErrorCode
{
RENDER3DERROR_NOERR = 0
@ -112,13 +122,16 @@ inline FragmentColor MakeFragmentColor(u8 r, u8 g,u8 b,u8 a)
class Render3D
{
protected:
RendererID _renderID;
std::string _renderName;
CACHE_ALIGN u16 clearImageColor16Buffer[GFX3D_FRAMEBUFFER_WIDTH * GFX3D_FRAMEBUFFER_HEIGHT];
CACHE_ALIGN u32 clearImageDepthBuffer[GFX3D_FRAMEBUFFER_WIDTH * GFX3D_FRAMEBUFFER_HEIGHT];
CACHE_ALIGN bool clearImageFogBuffer[GFX3D_FRAMEBUFFER_WIDTH * GFX3D_FRAMEBUFFER_HEIGHT];
CACHE_ALIGN u8 clearImagePolyIDBuffer[GFX3D_FRAMEBUFFER_WIDTH * GFX3D_FRAMEBUFFER_HEIGHT];
virtual Render3DError BeginRender(const GFX3D &engine);
virtual Render3DError RenderGeometry(const GFX3D_State &renderState, const VERTLIST *vertList, const POLYLIST *polyList, const INDEXLIST *indexList);
virtual Render3DError RenderGeometry(const GFX3D_State &renderState, const POLYLIST *polyList, const INDEXLIST *indexList);
virtual Render3DError RenderEdgeMarking(const u16 *colorTable, const bool useAntialias);
virtual Render3DError RenderFog(const u8 *densityTable, const u32 color, const u32 offset, const u8 shift, const bool alphaOnly);
virtual Render3DError EndRender(const u64 frameCount);
@ -132,6 +145,10 @@ protected:
public:
Render3D();
~Render3D();
RendererID GetRenderID();
std::string GetName();
virtual Render3DError UpdateToonTable(const u16 *toonTableBuffer);
virtual Render3DError ClearFramebuffer(const GFX3D_State &renderState);
@ -143,4 +160,3 @@ public:
};
#endif