specify render driver in config; print all renderer options

This commit is contained in:
Frank DeMarco 2020-08-28 22:17:01 -04:00
parent 536a5ec5f5
commit 66f6d6ef81
4 changed files with 46 additions and 30 deletions

View File

@ -44,7 +44,8 @@ void Configuration::set_defaults()
{"title", "sfw"}, {"title", "sfw"},
{"debug", false}, {"debug", false},
{"show-cursor", false}, {"show-cursor", false},
{"render-test-spacing", 2} {"render-test-spacing", 2},
{"render driver", "opengl"}
}; };
sys_config["recording"] = { sys_config["recording"] = {
{"enabled", false}, {"enabled", false},

View File

@ -4,10 +4,6 @@
#define GLM_ENABLE_EXPERIMENTAL #define GLM_ENABLE_EXPERIMENTAL
#include "glm/vec2.hpp" #include "glm/vec2.hpp"
#define GL_GLEXT_PROTOTYPES
#define GLEW_STATIC
#include "glew/glew.h"
#include "SDL.h" #include "SDL.h"
#include <SDL_image.h> #include <SDL_image.h>

View File

@ -18,7 +18,7 @@ SDL_Surface* FramerateIndicator::get_surface()
{ {
std::string padded = sfw::pad(get_root()->frame_count_this_second, 2); std::string padded = sfw::pad(get_root()->frame_count_this_second, 2);
SDL_Surface* shaded = TTF_RenderText_Shaded( SDL_Surface* shaded = TTF_RenderText_Shaded(
get_root()->bp_mono_font, padded.c_str(), {0, 0, 0}, {255, 255, 255}); get_root()->bp_mono_font, padded.c_str(), {0, 0, 0, 255}, {255, 255, 255, 255});
// SDL_Surface* converted = SDL_ConvertSurfaceFormat( // SDL_Surface* converted = SDL_ConvertSurfaceFormat(
// shaded, SDL_PIXELFORMAT_ARGB8888, 0); // shaded, SDL_PIXELFORMAT_ARGB8888, 0);
// SDL_Surface* flipped = zoomSurface(converted, 1, -1, SMOOTHING_OFF); // SDL_Surface* flipped = zoomSurface(converted, 1, -1, SMOOTHING_OFF);
@ -46,6 +46,7 @@ void FramerateIndicator::refresh()
Game::Game() Game::Game()
{ {
SDL_SetHint(SDL_HINT_RENDER_DRIVER, get_configuration()["display"]["render driver"].get<std::string>().c_str());
frame_length_history.reserve(5000); frame_length_history.reserve(5000);
set_framerate(get_configuration()["display"]["framerate"]); set_framerate(get_configuration()["display"]["framerate"]);
delegate.subscribe(&Game::handle_quit_event, this, SDL_QUIT); delegate.subscribe(&Game::handle_quit_event, this, SDL_QUIT);
@ -58,40 +59,42 @@ Game::Game()
fprintf(stderr, "stderr test message\n"); fprintf(stderr, "stderr test message\n");
SDL_SetMainReady(); SDL_SetMainReady();
// SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); // SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); // SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); // SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
print_gl_attributes(); // print_gl_attributes();
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
{ {
print_sdl_error("SDL could not initialize"); print_sdl_error("SDL could not initialize");
flag_to_end(); flag_to_end();
} }
// SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); // SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); // SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); // SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); // SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); // SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); // SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); // SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); // SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
// SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
print_gl_attributes(); print_gl_attributes();
auto window_size = get_configuration()["display"]["dimensions"].get<glm::ivec2>(); auto window_size = get_configuration()["display"]["dimensions"].get<glm::ivec2>();
window = SDL_CreateWindow( window = SDL_CreateWindow(
get_configuration()["display"]["title"].get_ref<const std::string&>().c_str(), SDL_WINDOWPOS_CENTERED, get_configuration()["display"]["title"].get_ref<const std::string&>().c_str(), SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, window_size.x, window_size.y, SDL_WINDOW_OPENGL); SDL_WINDOWPOS_CENTERED, window_size.x, window_size.y, SDL_WINDOW_OPENGL);
if (window == NULL) if (window == nullptr)
{ {
print_sdl_error("Could not create window"); print_sdl_error("Could not create window");
flag_to_end(); flag_to_end();
} }
if ((renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_TARGETTEXTURE)) == NULL) if ((renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_TARGETTEXTURE | SDL_RENDERER_ACCELERATED)) == NULL)
// if ((renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_TARGETTEXTURE | SDL_RENDERER_SOFTWARE)) == NULL)
{ {
print_sdl_error("Could not create renderer"); print_sdl_error("Could not create renderer");
flag_to_end(); flag_to_end();
} }
else else
{ {
SDL_SetRenderTarget(renderer, NULL); SDL_SetRenderTarget(renderer, nullptr);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer); SDL_RenderClear(renderer);
int step = get_configuration()["display"]["render-test-spacing"]; int step = get_configuration()["display"]["render-test-spacing"];
@ -193,25 +196,32 @@ void Game::print_frame_length_history()
void Game::load_sdl_context() void Game::load_sdl_context()
{ {
if (glcontext != NULL) if (glcontext != nullptr)
{ {
SDL_GL_DeleteContext(glcontext); SDL_GL_DeleteContext(glcontext);
glcontext = NULL; glcontext = nullptr;
}
SDL_RendererInfo renderer_info;
int render_driver_count = SDL_GetNumRenderDrivers();
SDL_Log("Render drivers:");
for (int ii = 0; ii < render_driver_count; ii++)
{
SDL_GetRenderDriverInfo(ii, &renderer_info);
log_renderer_info(renderer_info);
} }
if ((renderer = SDL_CreateRenderer( if ((renderer = SDL_CreateRenderer(
window, -1, SDL_RENDERER_TARGETTEXTURE)) == NULL) window, -1, SDL_RENDERER_TARGETTEXTURE | SDL_RENDERER_ACCELERATED)) == nullptr)
// if ((renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_TARGETTEXTURE | SDL_RENDERER_SOFTWARE)) == NULL)
{ {
print_sdl_error("Could not create renderer"); print_sdl_error("Could not create renderer");
flag_to_end(); flag_to_end();
} }
else else
{ {
SDL_RendererInfo info; SDL_Log("Current renderer:");
SDL_GetRendererInfo(renderer, &info); SDL_GetRendererInfo(renderer, &renderer_info);
SDL_Log("renderer name: %s, flags: %i, texture formats: %i, " log_renderer_info(renderer_info);
"max texture w: %i, max texture h: %i", info.name, info.flags, SDL_Log("Renderer supports the use of render targets? %d", SDL_RenderTargetSupported(renderer));
info.num_texture_formats, info.max_texture_width,
info.max_texture_height);
} }
is_gl_context = false; is_gl_context = false;
log_display_mode(); log_display_mode();
@ -219,7 +229,7 @@ void Game::load_sdl_context()
void Game::load_gl_context() void Game::load_gl_context()
{ {
if (renderer != NULL) if (renderer != nullptr)
{ {
SDL_DestroyRenderer(renderer); SDL_DestroyRenderer(renderer);
renderer = NULL; renderer = NULL;
@ -247,6 +257,14 @@ void Game::load_gl_context()
log_display_mode(); log_display_mode();
} }
void Game::log_renderer_info(SDL_RendererInfo& info)
{
SDL_Log("renderer name: %s, flags: %i, texture formats: %i, "
"max texture w: %i, max texture h: %i", info.name, info.flags,
info.num_texture_formats, info.max_texture_width,
info.max_texture_height);
}
bool Game::log_gl_errors(std::string suffix) bool Game::log_gl_errors(std::string suffix)
{ {
GLenum error; GLenum error;
@ -546,7 +564,7 @@ void Game::frame(float ticks)
framerate_indicator.update(); framerate_indicator.update();
if (!is_gl_context) if (!is_gl_context)
{ {
SDL_SetRenderTarget(renderer, NULL); SDL_SetRenderTarget(renderer, nullptr);
SDL_RenderPresent(renderer); SDL_RenderPresent(renderer);
} }
} }

View File

@ -70,6 +70,7 @@ struct Game : Node
void print_frame_length_history(); void print_frame_length_history();
void load_sdl_context(); void load_sdl_context();
void load_gl_context(); void load_gl_context();
void log_renderer_info(SDL_RendererInfo&);
bool log_gl_errors(std::string); bool log_gl_errors(std::string);
void log_display_mode(); void log_display_mode();
void log_surface_format(SDL_Surface*, std::string = "surface"); void log_surface_format(SDL_Surface*, std::string = "surface");