Welcome!
Final Burn Neo => FBN Development => Topic started by: dmitry_smagin on March 15, 2015, 06:11:52 AM
-
Hello.
Btw, I'm supporting a port of FBA for GCW-Zero/Dingoo a320: https://github.com/dmitrysmagin/fba-sdl
FBA SDL build is broken long ago, so here are the fixes: https://www.sendspace.com/file/w63h4v
Unpack the archive over fba_src_029735 contents and type 'make -f makefile sdl'
Changes:
- makefile.sdl is fixed to work with win/linux
- sound is fixed (no more stuttering)
- wrong colors for OpenGL mode are fixed
- ATTENTION: Reverted back autofire, since it's not working right with FBASDL.
Besides, do you use any versioning system to control sources?
Regards,
Dmitry
-
Hi,
Nice job on the fixes, my idea is to integrate your fixes into our codebase, but my only concern is the shared sources such as intf/interface.h, intf/input/inp_interface.*, instead of cutting out the stuff for qt, and win32 autofire, how about put #ifndef "SOME_SDL_DEFINE" around the code unused by your project, this way we retain compatibility and features with the other targets. Also, with burner/image & state.cpp win32 defines changed from BUILD_WIN32 to WIN32 and _WIN32 - we should keep things standardized, perhaps?
best regards.
- dink
-
Hello,
you are right concerning autofire, I'll post changes later with #ifdef'ed portions for SDL. Also, makefile.sdl is improved as well.
As for WIN32 and _WIN32 in state.cpp and image.cpp, it would be better to use #ifdef BUILD_WIN32 for more consistency. Reason: SDL build could be built both on windows and linux and those portions of code refer to windows exclusively.
Besides, it would be better to use #include <SDL/SDL.h> everywhere to avoid path problems on all platforms. (BTW Qt build has its own SDL.h which simply includes real SDL/SDL.h)
regards,
Dmitry
PS: I'd recommend using git for code versioning, this makes submitting patches and tracking changes much easier. Right now FBA code has both unix and windows style end of strings, trailing spaces and tab/spaces mixture.
-
Ok, here's attached a new fix. Unpack over FBA 0.2.97.35 sources
- makefile.sdl is fully linux-friendly
- Input with autofire is unified with FBA 0.2.97.35
it works on linux at least, i'll check with mingw/windows tomorrow
Some small fixes for non-sdl files:
burner/image.cpp:
-#ifdef WIN3
+#ifdef BUILD_WIN32
burner/state.cpp:
-#ifdef _WIN32
+#ifdef BUILD_WIN32
intf/video/scalers/superscale.asm:
GLOBAL _superscale_line
GLOBAL _superscale_line_75
+ GLOBAL superscale_line
+ GLOBAL superscale_line_75
...
_superscale_line:
+superscale_line:
...
_superscale_line_75: ;do a 75% reduction on the final pixel colour
+superscale_line_75: ;do a 75% reduction on the final pixel colour
intf/video/vid_softfx.h:
- #include <SDL.h>
+ #include <SDL/SDL.h>
And I'd recommend this fix as well (vital for mingw):
burn/burnint.h:
#include <assert.h>
+#include <stdint.h>
-
Fixed keys autorepeat for SDL on all platforms.
The fix is rather trivial:
diff --git a/src/intf/input/sdl/inp_sdl.cpp b/src/intf/input/sdl/inp_sdl.cpp
index c65040c..de49c87 100644
--- a/src/intf/input/sdl/inp_sdl.cpp
+++ b/src/intf/input/sdl/inp_sdl.cpp
@@ -24,7 +24,8 @@ static int SDLinpJoystickInit(int i)
static int SDLinpKeyboardInit()
{
for (int i = 0; i < 512; i++) {
- FBKtoSDL[SDLtoFBK[i]] = i;
+ if (SDLtoFBK[i] > 0)
+ FBKtoSDL[SDLtoFBK[i]] = i;
}
return 0;
Updated archive attached.
-
Again new fix:
- Fixed games with vertical and flipped screens for OpenGL (crashed previously or being shown upside-down)
- Fix formatting in intf/video/sdl/vid_sdlopengl.cpp
The patch is trivial again (OpenGL does all the proper rotations and such):
diff --git a/src/intf/video/sdl/vid_sdlopengl.cpp b/src/intf/video/sdl/vid_sdlopengl.cpp
index 82ea7a9..dcf54a7 100644
--- a/src/intf/video/sdl/vid_sdlopengl.cpp
+++ b/src/intf/video/sdl/vid_sdlopengl.cpp
@@ -29,6 +29,7 @@ static int nSize;
static int nUseBlitter;
static int nRotateGame = 0;
+static bool bFlipped = false;
static int PrimClear()
{
@@ -145,7 +146,7 @@ void init_gl()
glRotatef(0.0, 0.0, 0.0, 1.0);
glOrtho(0, nGamesWidth, nGamesHeight, 0, -1, 1);
} else {
- glRotatef(90.0, 0.0, 0.0, 1.0);
+ glRotatef((bFlipped ? -90.0 : 90.0), 0.0, 0.0, 1.0);
glOrtho(0, nGamesHeight, nGamesWidth, 0, -1, 5);
}
@@ -222,19 +223,14 @@ static int Init()
BurnDrvGetVisibleSize(&nGamesWidth, &nGamesHeight);
if (BurnDrvGetFlags() & BDF_ORIENTATION_VERTICAL) {
- if (nVidRotationAdjust & 1) {
- int n = nGamesWidth;
- nGamesWidth = nGamesHeight;
- nGamesHeight = n;
- nRotateGame |= (nVidRotationAdjust & 2);
- } else {
- nRotateGame |= 1;
- }
+ printf("Vertical\n");
+ nRotateGame = 1;
}
if (BurnDrvGetFlags() & BDF_ORIENTATION_FLIPPED) {
- nRotateGame ^= 2;
- }
+ printf("Flipped\n");
+ bFlipped = true;
+ }
}
if (!nRotateGame) {
@@ -291,31 +287,24 @@ static int Frame(bool bRedraw) // bRedraw = 0
return 0;
}
-typedef unsigned char byte;
-
-void SurfToTex()
+static void SurfToTex()
{
- unsigned char *Surf = (unsigned char *)gamescreen;
- int nPitch = nVidImagePitch;
-
- //printf("nvidImagePitch %d\n",nVidImagePitch);
-
- unsigned char *VidSurf = (unsigned char *)texture;
int nVidPitch = nTextureWidth * nVidImageBPP;
- unsigned char *pd, *ps;
+ unsigned char *ps = (unsigned char *)gamescreen;
+ unsigned char *pd = (unsigned char *)texture;
- int nHeight = nGamesHeight;
- pd = VidSurf; ps = Surf;
- for (int y = 0; y < nHeight; y++, pd += nVidPitch, ps += nPitch) {
- memcpy(pd, ps, nPitch);
+ for (int y = nGamesHeight; y--;) {
+ memcpy(pd, ps, nVidImagePitch);
+ pd += nVidPitch;
+ ps += nVidImagePitch;
}
- glTexImage2D(GL_TEXTURE_2D, 0,3, nTextureWidth, nTextureHeight, 0,
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, nTextureWidth, nTextureHeight, 0,
GL_RGB, texture_type, texture);
}
-void TexToQuad()
+static void TexToQuad()
{
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
-
Nice work. Been meaning to get to this for a while so glad someone has beaten me to it.
-
Thanks for the fixes. I have committed them.
-
Thanks for the fixes. I have committed them.
Hey Barry, what do you think about one make system to rule them all? (CMake).
-
Thanks for the fixes. I have committed them.
Thank you.
Sorry, but here's another vital fix:
- Fixed crashing on exit when using OpenGL
- Fixed column of black pixels at the edge of window
In fact it's a memory corruption bug which lead to unpredicted memory errors. It also showed a column of black pixels at the left or right of the window. With these fixes OpenGL renderer is now quite usable.
diff --git a/src/intf/video/sdl/vid_sdlopengl.cpp b/src/intf/video/sdl/vid_sdlopengl.cpp
index 09ea80e..91e5f12 100644
--- a/src/intf/video/sdl/vid_sdlopengl.cpp
+++ b/src/intf/video/sdl/vid_sdlopengl.cpp
@@ -89,7 +90,7 @@ static int BlitFXInit()
gamescreen = (unsigned char *)malloc(nMemLen);
if (gamescreen) {
memset(gamescreen, 0, nMemLen);
- pVidImage = gamescreen + nVidImagePitch;
+ pVidImage = gamescreen;
return 0;
} else {
pVidImage = NULL;
Please, update.
Regards,
Dmitry
-
Hi again. :)
Here's another memory corruption fix for OpenGL renderer.
In fact, there was some confusion with width/height of video buffer with rotated games. This lead to rare memory corruptions. Now nVidImageWidth, nVidImageHeight and nVidImageDepth contain the buffer as Burn core renders it (normal or rotated) and OpenGL does rotation in hardware.
Also, I'd like to point that some games like sfiii2 or all neogeo titles don't respect nBurnPitch (nVidImagePitch) value and render everything as if nBurnPitch == nVidImageWidth. If they did, one single buffer for OpenGL texture could be used, not two as now.
Regards,
Dmitry
-
Thanks Dmitry!