changeset 15:c8a0dbd7752c

Forgot to commit SDL code
author Michael Pavone <pavone@retrodev.com>
date Sun, 27 Mar 2016 21:31:34 -0700
parents 769120da2c1f
children ae58e7c3c328
files src/system.h src/system_sdl.c
diffstat 2 files changed, 59 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/system.h	Sun Mar 27 21:31:34 2016 -0700
@@ -0,0 +1,8 @@
+#ifndef SYSTEM_H_
+#define SYSTEM_H_
+
+int system_init(int width, int height);
+uint16_t *system_get_framebuffer(int *pitch);
+void system_framebuffer_updated();
+
+#endif //SYSTEM_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/system_sdl.c	Sun Mar 27 21:31:34 2016 -0700
@@ -0,0 +1,51 @@
+#include <SDL.h>
+#include <stdint.h>
+
+
+SDL_Window   *window;
+SDL_Renderer *renderer;
+SDL_Texture  *texture;
+
+int system_init(int width, int height)
+{
+	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
+		fprintf(stderr, "Failed to init SDL: %s\n", SDL_GetError());
+		return 0;
+	}
+	atexit(SDL_Quit);
+	SDL_CreateWindowAndRenderer(width, height, 0, &window, &renderer);
+	
+	if (!window || !renderer) {
+		fprintf(stderr, "Failed to create window or renderer: %s\n", SDL_GetError());
+		return 0;
+	}
+	texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB444, SDL_TEXTUREACCESS_STREAMING, 320, 240);
+	if (!texture) {
+		fprintf(stderr, "Failed to create texture: %s\n", SDL_GetError());
+		SDL_DestroyRenderer(renderer);
+		SDL_DestroyWindow(window);
+		return 0;
+	}
+	return 1;
+}
+
+//Should be called once per frame to get a pointer to the output buffer at the start of rendering
+uint16_t *system_get_framebuffer(int *pitch)
+{
+	void *pixels;
+	if (SDL_LockTexture(texture, NULL, &pixels, pitch) < 0) {
+		fprintf(stderr, "Failed to lock texture: %s\n", SDL_GetError());
+		return NULL;
+	}
+	return pixels;
+}
+
+//Should be called once per frame at the competion of rendering
+//The pointer returned by system_get_framebuffer should be discarded after calling this function
+void system_framebuffer_updated()
+{
+	SDL_UnlockTexture(texture);
+	SDL_RenderCopy(renderer, texture, NULL, NULL);
+	SDL_RenderPresent(renderer);
+}
+