view src/system_sdl.c @ 17:41ec033ef8c3

Enable vsync
author Michael Pavone <pavone@retrodev.com>
date Sun, 27 Mar 2016 21:54:13 -0700
parents ae58e7c3c328
children 4c9dbfa30a66
line wrap: on
line source

#include <SDL.h>
#include <stdint.h>
#include <stdlib.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);
	window = SDL_CreateWindow("simple16", 0, 0, width, height, 0);
	if (!window) {
		fprintf(stderr, "Failed to create window: %s\n", SDL_GetError());
		return 0;
	}
	
	renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
	if (!renderer) {
		fprintf(stderr, "Failed to create 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);
}

void system_poll_events()
{
	SDL_Event event;
	while(SDL_PollEvent(&event))
	{
		switch (event.type)
		{
		case SDL_QUIT:
			exit(0);
			break;
		}
	}
}