Merge pull request #244 from cxd4/i_dont_always_debug_but_when_i_do

I don't always debug, but when I do...
This commit is contained in:
zilmar 2015-03-09 08:06:41 +11:00
commit 951c5d089c
9 changed files with 134 additions and 65 deletions

View File

@ -41,15 +41,6 @@
#include "Util.h"
#include "Debugger.h"
/*
* required to include OpenGL library without errors
* Dependency on OpenGL in this module is limited to just `glGetError`.
*/
#ifdef _WIN32
#include <windows.h>
#endif
#include <GL/gl.h>
GLIDE64_DEBUGGER _debugger;
#define SX(x) ((x)*rdp.scale_1024)
@ -1027,52 +1018,3 @@ void output (float x, float y, int scale, const char *fmt, ...)
x+=8;
}
}
static const char * GL_errors[7 + 1] = {
"GL_NO_ERROR", /* "There is no current error." */
"GL_INVALID_ENUM", /* "Invalid parameter." */
"GL_INVALID_VALUE", /* "Invalid enum parameter value." */
"GL_INVALID_OPERATION", /* "Illegal call." */
"GL_STACK_OVERFLOW",
"GL_STACK_UNDERFLOW",
"GL_OUT_OF_MEMORY", /* "Unable to allocate memory." */
"GL_UNKNOWN_ERROR" /* ??? */
};
int grDisplayGLError(const char* message)
{
GLenum status;
unsigned int error_index;
int failure;
status = glGetError();
failure = 1;
if (status == GL_NO_ERROR)
error_index = failure = 0;
else
error_index =
(status < GL_INVALID_ENUM) /* to avoid underflow when subtracting */
? ( 7 ) /* our own, made-up "GL_UNKNOWN_ERROR" error */
: (status - GL_INVALID_ENUM) + 1;
if (error_index > 7)
error_index = 7;
#if !0
/*
* In most cases, we don't want to spam the screen to repeatedly say that
* there were no OpenGL errors yet, though sometimes one may need verbosity.
*/
if (failure == 0)
return (failure);
#endif
#ifdef _WIN32
MessageBoxA(NULL, message, GL_errors[error_index], MB_ICONERROR);
#else
fprintf(stderr, "%s\n%s\n\n", GL_errors[error_index], message);
#endif
return (failure);
}

View File

@ -135,5 +135,3 @@ void debug_cacheviewer ();
void debug_mouse ();
void debug_keys ();
void output (float x, float y, int scale, const char *fmt, ...);
extern int grDisplayGLError( const char * message );

View File

@ -44,6 +44,8 @@
</ClCompile>
<Link>
<AdditionalLibraryDirectories>$(Root)Source\3rd Party\wx\lib\vc_lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Windows</SubSystem>
<SubSystem Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Windows</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemGroup>

View File

@ -1890,10 +1890,6 @@ void CALL UpdateScreen (void)
if (fullscreen && (*gfx.VI_ORIGIN_REG > width))
update_screen_count++;
#if defined(_DEBUG) || 0
grDisplayGLError("UpdateScreen");
#endif
#ifdef FPS
// vertical interrupt has occurred, increment counter
vi_count ++;

View File

@ -167,6 +167,8 @@ void updateCombiner(int i)
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, operand1[i]);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, source2[i]);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, operand2[i]);
grDisplayGLError("updateCombiner");
}
void updateCombinera(int i)
@ -179,6 +181,8 @@ void updateCombinera(int i)
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, operanda1[i]);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA_ARB, sourcea2[i]);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA_ARB, operanda2[i]);
grDisplayGLError("updateCombinera");
}
void init_combiner()
@ -301,6 +305,8 @@ void init_combiner()
dither_enabled = 0;
blackandwhite0 = 0;
blackandwhite1 = 0;
grDisplayGLError("init_combiner");
}
void compile_chroma_shader()
@ -339,6 +345,8 @@ void compile_chroma_shader()
strcat(fragment_shader_chroma, "if (color.rgb == chroma_color.rgb) discard; \n");
strcat(fragment_shader_chroma, "}");
grDisplayGLError("compile_chroma_shader");
}
typedef struct _shader_program_key
@ -525,6 +533,8 @@ void compile_shader()
set_lambda();
number_of_programs++;
grDisplayGLError("compile_shader");
}
void free_combiners()
@ -541,6 +551,8 @@ void set_copy_shader()
glUseProgramObjectARB(program_object_default);
texture0_location = glGetUniformLocationARB(program_object, "texture0");
glUniform1iARB(texture0_location, 0);
grDisplayGLError("set_copy_shader");
}
void set_depth_shader()
@ -550,12 +562,16 @@ void set_depth_shader()
glUseProgramObjectARB(program_object_depth);
texture0_location = glGetUniformLocationARB(program_object, "texture0");
glUniform1iARB(texture0_location, 0);
grDisplayGLError("set_depth_shader");
}
void set_lambda()
{
int lambda_location = glGetUniformLocationARB(program_object, "lambda");
glUniform1fARB(lambda_location, lambda);
grDisplayGLError("set_lambda");
}
FX_ENTRY void FX_CALL
@ -583,6 +599,8 @@ grConstantColorValue( GrColor_t value )
constant_color_location = glGetUniformLocationARB(program_object, "constant_color");
glUniform4fARB(constant_color_location, texture_env_color[0], texture_env_color[1],
texture_env_color[2], texture_env_color[3]);
grDisplayGLError("grConstantColorValue");
}
int setOtherColorSource(int other)
@ -1470,6 +1488,8 @@ grAlphaBlendFunction(
glBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
else
glBlendFunc(sfactorRGB, dfactorRGB);
grDisplayGLError("grAlphaBlendFunction");
}
FX_ENTRY void FX_CALL
@ -1496,12 +1516,15 @@ grAlphaTestFunction( GrCmpFnc_t function )
case GR_CMP_ALWAYS:
glAlphaFunc(GL_ALWAYS, alpha_ref/255.0f);
glDisable(GL_ALPHA_TEST);
grDisplayGLError("grAlphaTestFunction :: GR_CMP_ALWAYS");
return;
break;
default:
display_warning("grAlphaTestFunction : unknown function : %x", function);
}
glEnable(GL_ALPHA_TEST);
grDisplayGLError("grAlphaTestFunction");
}
// fog
@ -1530,6 +1553,8 @@ grFogMode( GrFogMode_t mode )
display_warning("grFogMode : unknown mode : %x", mode);
}
need_to_compile = 1;
grDisplayGLError("grFogMode");
}
FX_ENTRY float FX_CALL
@ -1548,6 +1573,8 @@ guFogGenerateLinear(GrFog_t * /*fogtable*/,
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
glFogf(GL_FOG_START, nearZ / 255.0f);
glFogf(GL_FOG_END, farZ / 255.0f);
grDisplayGLError("guFogGenerateLinear");
}
FX_ENTRY void FX_CALL
@ -1581,6 +1608,7 @@ grFogColorValue( GrColor_t fogcolor )
}
glFogfv(GL_FOG_COLOR, color);
grDisplayGLError("glFogfv");
}
// chroma
@ -1630,6 +1658,7 @@ grChromakeyValue( GrColor_t value )
chroma_color_location = glGetUniformLocationARB(program_object, "chroma_color");
glUniform4fARB(chroma_color_location, chroma_color[0], chroma_color[1],
chroma_color[2], chroma_color[3]);
grDisplayGLError("grChromakeyValue");
}
static void setPattern()
@ -1667,6 +1696,8 @@ static void setPattern()
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glDisable(GL_TEXTURE_2D);
grDisplayGLError("setPattern");
}
FX_ENTRY void FX_CALL
@ -1704,7 +1735,9 @@ grStippleMode( GrStippleMode_t mode )
default:
display_warning("grStippleMode:%x", mode);
}
need_to_compile = 1;
grDisplayGLError("grStippleMode");
}
FX_ENTRY void FX_CALL
@ -2748,4 +2781,5 @@ grConstantColorValueExt(GrChipID_t tmu,
ccolor1_location = glGetUniformLocationARB(program_object, "ccolor1");
glUniform4fARB(ccolor1_location, ccolor1[0], ccolor1[1], ccolor1[2], ccolor1[3]);
}
grDisplayGLError("grConstantColorValueExt");
}

View File

@ -55,6 +55,7 @@ void init_geometry()
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
grDisplayGLError("init_geometry");
}
FX_ENTRY void FX_CALL
@ -141,6 +142,7 @@ grCullMode( GrCullMode_t mode )
default:
display_warning("unknown cull mode : %x", mode);
}
grDisplayGLError("grCullMode");
}
// Depth buffer
@ -168,6 +170,7 @@ grDepthBufferMode( GrDepthBufferMode_t mode )
default:
display_warning("unknown depth buffer mode : %x", mode);
}
grDisplayGLError("grDepthBufferMode");
}
FX_ENTRY void FX_CALL
@ -216,6 +219,7 @@ grDepthBufferFunction( GrCmpFnc_t function )
default:
display_warning("unknown depth buffer function : %x", function);
}
grDisplayGLError("grDepthBufferFunction");
}
FX_ENTRY void FX_CALL
@ -223,6 +227,7 @@ grDepthMask( FxBool mask )
{
LOG("grDepthMask(%d)\r\n", mask);
glDepthMask((GLboolean)mask);
grDisplayGLError("grDepthMask");
}
float biasFactor = 0;
@ -282,6 +287,7 @@ void FindBestDepthBias()
}
//printf(" --> bias factor %g\n", biasFactor);
glPopAttrib();
grDisplayGLError("FindBestDepthBias");
}
FX_ENTRY void FX_CALL
@ -301,6 +307,7 @@ grDepthBiasLevel( FxI32 level )
glPolygonOffset(0,0);
glDisable(GL_POLYGON_OFFSET_FILL);
}
grDisplayGLError("grDepthBiasLevel");
}
// draw
@ -439,6 +446,7 @@ grDrawTriangle( const void *a, const void *b, const void *c )
-(*c_y - (float)heighto) / (float)(height/2) / *c_q, ZCALC(*c_z ,*c_q), 1.0f / *c_q);
glEnd();
grDisplayGLError("grDrawTriangle");
}
FX_ENTRY void FX_CALL
@ -496,6 +504,7 @@ grDrawPoint( const void *pt )
-(*y - (float)heighto) / (float)(height/2) / *q, ZCALC(*z ,*q), 1.0f / *q);
glEnd();
grDisplayGLError("grDrawPoint");
}
FX_ENTRY void FX_CALL
@ -588,6 +597,7 @@ grDrawLine( const void *a, const void *b )
-(*b_y - (float)heighto) / (float)(height/2) / *b_q, ZCALC(*b_z, *b_q), 1.0f / *b_q);
glEnd();
grDisplayGLError("grDrawLine");
}
FX_ENTRY void FX_CALL
@ -659,6 +669,8 @@ grDrawVertexArray(FxU32 mode, FxU32 Count, void *pointers2)
-(*y - (float)heighto) / (float)(height/2) / *q, ZCALC(*z, *q), 1.0f / *q);
}
glEnd();
grDisplayGLError("grDrawVertexArray");
}
FX_ENTRY void FX_CALL
@ -735,4 +747,6 @@ grDrawVertexArrayContiguous(FxU32 mode, FxU32 Count, void *pointers, FxU32 strid
-(*y - (float)heighto) / (float)(height/2) / *q, ZCALC(*z, *q), 1.0f / *q);
}
glEnd();
grDisplayGLError("grDrawVertexArrayContiguous");
}

View File

@ -249,6 +249,7 @@ static inline void opt_glCopyTexImage2D( GLenum target,
// printf("--> %dx%d newfmt %x\n", width, height, fmt);
glCopyTexImage2D(target, level, internalFormat, x, y, width, height, border);
}
grDisplayGLError("opt_glCopyTexImage2D");
}
#define glCopyTexImage2D opt_glCopyTexImage2D
@ -649,6 +650,7 @@ grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy )
if (maxy < miny) maxy = miny;
glScissor(minx, miny, maxx - minx, maxy - miny);
glEnable(GL_SCISSOR_TEST);
grDisplayGLError("grClipWindow :: use_fbo");
return;
}
@ -671,6 +673,7 @@ grClipWindow( FxU32 minx, FxU32 miny, FxU32 maxx, FxU32 maxy )
glScissor(minx, (viewport_offset)+height-maxy, maxx - minx, maxy - miny);
}
glEnable(GL_SCISSOR_TEST);
grDisplayGLError("grClipWindow");
}
FX_ENTRY void FX_CALL
@ -678,6 +681,7 @@ grColorMask( FxBool rgb, FxBool a )
{
LOG("grColorMask(%d, %d)\r\n", rgb, a);
glColorMask((GLboolean)rgb, (GLboolean)rgb, (GLboolean)rgb, (GLboolean)a);
grDisplayGLError("grColorMask");
}
FX_ENTRY void FX_CALL
@ -1384,6 +1388,7 @@ grSstWinOpen(
ati_sucks = 0;
}
grDisplayGLError("grSstWinOpen");
return 1;
}
@ -1597,7 +1602,7 @@ FX_ENTRY void FX_CALL grTextureBufferExt( GrChipID_t tmu,
glScissor(0, viewport_offset, width, height);
grDisplayGLError("grTextureBufferExt :: A");
} else {
if (!render_to_texture) //initialization
{
@ -1651,6 +1656,7 @@ FX_ENTRY void FX_CALL grTextureBufferExt( GrChipID_t tmu,
}
CHECK_FRAMEBUFFER_STATUS();
curBufferAddr = pBufferAddress;
grDisplayGLError("grTextureBufferExt :: C");
return;
}
else //create new FBO at the same address, delete old one
@ -1695,6 +1701,7 @@ FX_ENTRY void FX_CALL grTextureBufferExt( GrChipID_t tmu,
CHECK_FRAMEBUFFER_STATUS();
curBufferAddr = pBufferAddress;
nb_fb++;
grDisplayGLError("grTextureBufferExt :: B");
}
}
@ -2052,6 +2059,7 @@ static void render_rectangle(int texture_number,
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
grDisplayGLError("render_rectangle");
}
void reloadTexture()
@ -2081,6 +2089,7 @@ void reloadTexture()
width, height, -1);
glBindTexture(GL_TEXTURE_2D, default_texture);
glPopAttrib();
grDisplayGLError("reloadTexture");
}
void updateTexture()
@ -2112,6 +2121,7 @@ void updateTexture()
glBindTexture(GL_TEXTURE_2D, default_texture);
glPopAttrib();
}
grDisplayGLError("updateTexture");
}
FX_ENTRY void FX_CALL grFramebufferCopyExt(int /*x*/, int /*y*/, int /*w*/, int /*h*/,
@ -2135,6 +2145,7 @@ FX_ENTRY void FX_CALL grFramebufferCopyExt(int /*x*/, int /*y*/, int /*w*/, int
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,
0, viewport_offset, tw, th, 0);
glBindTexture(GL_TEXTURE_2D, default_texture);
grDisplayGLError("grFramebufferCopyExt :: A");
return;
}
if (from == GR_FBCOPY_BUFFER_FRONT && to == GR_FBCOPY_BUFFER_BACK) {
@ -2156,6 +2167,7 @@ FX_ENTRY void FX_CALL grFramebufferCopyExt(int /*x*/, int /*y*/, int /*w*/, int
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glBindTexture(GL_TEXTURE_2D, default_texture);
glPopAttrib();
grDisplayGLError("grFramebufferCopyExt :: B");
return;
}
@ -2276,6 +2288,7 @@ grRenderBuffer( GrBuffer_t buffer )
default:
display_warning("grRenderBuffer : unknown buffer : %x", buffer);
}
grDisplayGLError("grRenderBuffer");
}
FX_ENTRY void FX_CALL
@ -2300,6 +2313,7 @@ grAuxBufferExt( GrBuffer_t buffer )
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
need_to_compile = 1;
}
grDisplayGLError("grAuxBufferExt");
}
FX_ENTRY void FX_CALL
@ -2333,6 +2347,7 @@ grBufferClear( GrColor_t color, GrAlpha_t alpha, FxU32 depth )
// ZIGGY TODO check that color mask is on
buffer_cleared = 1;
grDisplayGLError("grBufferClear");
}
// #include <unistd.h>
@ -2454,6 +2469,7 @@ grLfbLock( GrLock_t type, GrBuffer_t buffer, GrLfbWriteMode_t writeMode,
}
}
grDisplayGLError("grLfbLock");
return FXTRUE;
}
@ -2530,6 +2546,7 @@ grLfbReadRegion( GrBuffer_t src_buffer,
free(buf);
}
grDisplayGLError("grLfbReadRegion");
return FXTRUE;
}
@ -2689,6 +2706,8 @@ grLfbWriteRegion( GrBuffer_t dst_buffer,
}
glDrawBuffer(current_buffer);
glPopAttrib();
grDisplayGLError("grLfbWriteRegion");
return FXTRUE;
}
@ -2817,12 +2836,14 @@ FX_ENTRY void FX_CALL
grFinish(void)
{
glFinish();
grDisplayGLError("grFinish");
}
FX_ENTRY void FX_CALL
grFlush(void)
{
glFlush();
grDisplayGLError("grFlush");
}
FX_ENTRY void FX_CALL
@ -3101,7 +3122,61 @@ void grTexChromaModeExt(GrChipID_t /*tmu*/, GrChromakeyMode_t /*mode*/)
display_warning("grTexChromaRangeModeExt");
}
static const char * GL_errors[7 + 1] = {
"GL_NO_ERROR", /* "There is no current error." */
"GL_INVALID_ENUM", /* "Invalid parameter." */
"GL_INVALID_VALUE", /* "Invalid enum parameter value." */
"GL_INVALID_OPERATION", /* "Illegal call." */
"GL_STACK_OVERFLOW",
"GL_STACK_UNDERFLOW",
"GL_OUT_OF_MEMORY", /* "Unable to allocate memory." */
"GL_UNKNOWN_ERROR" /* ??? */
};
#ifndef _DEBUG
int grDisplayGLError(const char* /*unused*/)
{
return -1;
}
#else
int grDisplayGLError(const char* message)
{
GLenum status;
unsigned int error_index;
int failure;
status = glGetError();
failure = 1;
if (status == GL_NO_ERROR)
error_index = failure = 0;
else
error_index =
(status < GL_INVALID_ENUM) /* to avoid underflow when subtracting */
? ( 7 ) /* our own, made-up "GL_UNKNOWN_ERROR" error */
: (status - GL_INVALID_ENUM) + 1;
if (error_index > 7)
error_index = 7;
#if !0
/*
* In most cases, we don't want to spam the screen to repeatedly say that
* there were no OpenGL errors yet, though sometimes one may need verbosity.
*/
if (failure == 0)
return (failure);
#endif
#ifdef _WIN32
MessageBoxA(NULL, message, GL_errors[error_index], MB_ICONERROR);
#else
fprintf(stderr, "%s\n%s\n\n", GL_errors[error_index], message);
#endif
return (failure);
}
#endif
// VP debug
#ifdef VPDEBUG
@ -3187,6 +3262,7 @@ void dump_stop()
free(pixels);
}
glBindTexture(GL_TEXTURE_2D, default_texture);
grDisplayGLError("dump_stop");
}
void dump_tex(int id)

View File

@ -27,6 +27,9 @@ extern wrapper_config config;
// returns the bytes per pixel of a given GR texture format
int grTexFormatSize(int fmt);
/* 2015.03.07 cxd4 -- regulated GL state machine debugging using glGetError */
extern int grDisplayGLError(const char* message);
extern int packed_pixels_support;
extern int ati_sucks;
extern float largest_supported_anisotropy;

View File

@ -639,6 +639,7 @@ grTexDownloadMipMap( GrChipID_t tmu,
}
glBindTexture(GL_TEXTURE_2D, default_texture);
grDisplayGLError("grTexDownloadMipMap");
}
int CheckTextureBufferFormat(GrChipID_t tmu, FxU32 startAddress, GrTexInfo *info );
@ -722,6 +723,7 @@ grTexSource( GrChipID_t tmu,
grAuxBufferExt(auxbuffer);
oldbuffer = auxbuffer;
#endif
grDisplayGLError("grTexSource");
}
FX_ENTRY void FX_CALL
@ -788,6 +790,7 @@ grTexFilterMode(
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter1);
}
grDisplayGLError("grTexFilterMode");
}
FX_ENTRY void FX_CALL
@ -867,4 +870,5 @@ grTexClampMode(
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_s1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_t1);
}
grDisplayGLError("grTexClampMode");
}