From f471b4a8da7c4d3c5e16df49d2173902175a696b Mon Sep 17 00:00:00 2001 From: Themaister Date: Sun, 27 Jun 2010 15:46:23 +0200 Subject: [PATCH] Updated build --- Makefile | 25 +++++++++++++++--------- hqflt/hq.c | 4 ++-- hqflt/pastlib.h | 8 ++++---- ssnes.c | 52 +++++++++++++++++++++++++++++++++++++------------ 4 files changed, 62 insertions(+), 27 deletions(-) diff --git a/Makefile b/Makefile index a9c07a2faf..515634dfc4 100644 --- a/Makefile +++ b/Makefile @@ -2,37 +2,42 @@ include config.mk TARGET = ssnes -SOURCE = ssnes.c +OBJ = ssnes.o LIBS = -lsamplerate -lsnes ifeq ($(BUILD_RSOUND), 1) - SOURCE += rsound.c + OBJ += rsound.o LIBS += -lrsound endif ifeq ($(BUILD_OSS), 1) - SOURCE += oss.c + OBJ += oss.o endif ifeq ($(BUILD_ALSA), 1) - SOURCE += alsa.c + OBJ += alsa.o LIBS += -lasound endif ifeq ($(BUILD_OPENGL), 1) - SOURCE += gl.c + OBJ += gl.o LIBS += -lglfw endif ifeq ($(BUILD_FILTER), 1) - SOURCE += hqflt/hq.c + OBJ += hqflt/hq.o endif CFLAGS = -Wall -O3 -march=native -std=c99 -OBJ = ssnes.o +all: $(TARGET) -all: - $(CC) $(CFLAGS) -o $(TARGET) $(SOURCE) $(LIBS) +ssnes: $(OBJ) + @$(CC) -o $@ $(OBJ) $(LIBS) + @echo "LD $@" + +%.o: %.c config.h config.mk + @$(CC) $(CFLAGS) -c -o $@ $< + @echo "CC $<" install: $(TARGET) install -m755 $(TARGET) $(PREFIX)/bin @@ -43,3 +48,5 @@ uninstall: $(TARGET) clean: rm -rf $(OBJ) rm -rf $(TARGET) + +.PHONY: all install uninstall clean diff --git a/hqflt/hq.c b/hqflt/hq.c index f91cbe9a87..7e6de60d2e 100644 --- a/hqflt/hq.c +++ b/hqflt/hq.c @@ -261,7 +261,7 @@ uint8_t lastLineDiffs[__PAST_LIBRARY_WIDTH]; #define RotatePattern(x) ((((x) & 0x777) << 1) | (((x) & 0x888) >> 3)) -void ProcessHQ2x(const pixel *in, pixel *out) { +void ProcessHQ2x(const pixel * restrict in, pixel * restrict out) { signed int y, x; unsigned int pattern, newpattern; uint32_t pixels[9]; @@ -377,7 +377,7 @@ void ProcessHQ2x(const pixel *in, pixel *out) { } while (y >= 0); } -void ProcessHQ4x(const pixel *in, pixel *out) { +void ProcessHQ4x(const pixel * restrict in, pixel * restrict out) { signed int y, x; unsigned int pattern, newpattern; uint32_t pixels[9]; diff --git a/hqflt/pastlib.h b/hqflt/pastlib.h index 969ebcff44..d38395dd05 100644 --- a/hqflt/pastlib.h +++ b/hqflt/pastlib.h @@ -36,19 +36,19 @@ typedef uint16_t pixel; * guard-bits and masking. */ -static __inline__ uint32_t RGBUnpack(pixel i) { +static inline uint32_t RGBUnpack(pixel i) { uint32_t o = i; o = (o * 0x10001); o = o & 0x03E07C1F; return o; } -static __inline__ pixel RGBPack(uint32_t x) { +static inline pixel RGBPack(uint32_t x) { x &= 0x03E07C1F; x |= (x >> 16); return x; } -void ProcessHQ2x(const pixel *inbuffer, pixel *outbuffer); -void ProcessHQ4x(const pixel *inbuffer, pixel *outbuffer); +void ProcessHQ2x(const pixel * restrict inbuffer, pixel * restrict outbuffer); +void ProcessHQ4x(const pixel * restrict inbuffer, pixel * restrict outbuffer); #endif /* __PAST_LIBRARY_H */ diff --git a/ssnes.c b/ssnes.c index 3e52513fb0..4101a8f4a5 100644 --- a/ssnes.c +++ b/ssnes.c @@ -150,6 +150,27 @@ static void uninit_video_input(void) driver.input->free(driver.input_data); } +// Temporary hack. Needs to do some color space switching for some unknown reason. Worked in 0.064 without hack at least. +#define USE_HACK 0 +static inline void process_frame (uint16_t * restrict out, const uint16_t * restrict in, unsigned width, unsigned height) +{ + for ( int y = 0; y < height; y++ ) + { + const uint16_t *src = in + y * 1024; + uint16_t *dst = out + y * width; + +#if USE_HACK + for ( int x = 0; x < width; x++ ) + { + uint16_t color = src[x]; + *dst++ = ((color >> 10) & 0x1f) | (color & 0x3e0) | ((color & 0x1f) << 10); + } +#else + memcpy(dst, src, width * sizeof(uint16_t)); +#endif + } +} + static void video_frame(const uint16_t *data, unsigned width, unsigned height) { if ( !video_active ) @@ -159,17 +180,10 @@ static void video_frame(const uint16_t *data, unsigned width, unsigned height) uint16_t outputHQ2x[width * height * 2 * 2]; #elif VIDEO_FILTER == FILTER_HQ4X uint16_t outputHQ4x[width * height * 4 * 4]; -#else - uint16_t output[width * height]; #endif + uint16_t output[width * height]; - for ( int y = 0; y < height; y++ ) - { - const uint16_t *src = data + y * 1024; - uint16_t *dst = output + y * width; - - memcpy(dst, src, width * sizeof(uint16_t)); - } + process_frame(output, data, width, height); #if VIDEO_FILTER == FILTER_NONE if ( !driver.video->frame(driver.video_data, output, width, height) ) @@ -278,13 +292,13 @@ int main(int argc, char *argv[]) if ( rom_buf == NULL ) { fprintf(stderr, "SSNES [ERROR] :: Couldn't allocate memory!\n"); - exit(1); + goto error; } if ( fread(rom_buf, 1, length, file) < length ) { fprintf(stderr, "SSNES [ERROR] :: Didn't read whole file.\n"); - exit(1); + goto error; } fclose(file); @@ -295,6 +309,14 @@ int main(int argc, char *argv[]) unsigned serial_size = snes_serialize_size(); uint8_t *serial_data = malloc(serial_size); + + if ( serial_size > (unsigned)length ) + { + fprintf(stderr, "SSNES [ERROR] :: Length of save file does match size given by libsnes.\n"); + fprintf(stderr, "\tserial_size = %u, length = %u\n", serial_size, (unsigned)length); + goto error; + } + snes_serialize(serial_data, serial_size); load_state(savefile_name, serial_data, serial_size); @@ -330,10 +352,16 @@ int main(int argc, char *argv[]) snes_unload_cartridge(); snes_term(); - uninit_drivers(); return 0; + +error: + snes_unload_cartridge(); + snes_term(); + uninit_drivers(); + + return 1; } static void write_state(const char* path, uint8_t* data, size_t size)