Default disable VR side-by-side for OpenGL ES

VR requires glDrawBuffer, which Mesa OpenGL ES does not offer.  Default
VR to disabled for OpenGL ES users.  Users who want to try it anyway can
still set use_stereo_render=1 in the SCons environment.
This commit is contained in:
Kp 2022-10-09 23:15:20 +00:00
parent dac2fa22d7
commit 90d3d82d8e
12 changed files with 62 additions and 5 deletions

View File

@ -1255,6 +1255,10 @@ int main(int argc,char**argv){(void)argc;(void)argv;
def _check_user_settings_ipv6(self,context,_CPPDEFINES='DXX_USE_IPv6'):
self._result_check_user_setting(context, self.user_settings.ipv6, _CPPDEFINES, 'IPv6 support')
@_custom_test
def _check_user_settings_stereo_render(self,context,_CPPDEFINES='DXX_USE_STEREOSCOPIC_RENDER'):
self._result_check_user_setting(context, self.user_settings.use_stereo_render, _CPPDEFINES, 'stereoscopic rendering')
@_custom_test
def _check_user_settings_udp(self,context,_CPPDEFINES='DXX_USE_UDP'):
self._result_check_user_setting(context, self.user_settings.use_udp, _CPPDEFINES, 'multiplayer over UDP')
@ -3641,6 +3645,8 @@ class DXXCommon(LazyObjectConstructor):
if self.raspberrypi in ('yes', 'mesa'):
return True
return False
def default_use_stereo_render(self):
return self.opengl and not self.opengles
def selected_OGLES_LIB(self):
if self.raspberrypi == 'yes':
return 'brcmGLESv2'
@ -3841,6 +3847,12 @@ class DXXCommon(LazyObjectConstructor):
('show_linker_version', True, None),
),
},
{
'variable': BoolVariable,
'arguments': (
('use_stereo_render', self.default_use_stereo_render, 'enable stereoscopic rendering'),
),
},
{
'variable': generic_variable,
'arguments': (

View File

@ -100,8 +100,10 @@ struct CArg : prohibit_void_ptr<CArg>
bool DbgGlGetTexLevelParamOk;
bool DbgGlLuminance4Alpha4Ok;
bool DbgGlRGBA2Ok;
#if DXX_USE_STEREOSCOPIC_RENDER
bool OglStereo;
uint8_t OglStereoView;
#endif
unsigned OglSyncWait;
#else
bool DbgSdlHWSurface;

View File

@ -66,7 +66,9 @@ void ogl_loadbmtexture_f(grs_bitmap &bm, opengl_texture_filter texfilt, bool tex
void ogl_freebmtexture(grs_bitmap &bm);
void ogl_start_frame(grs_canvas &);
#if DXX_USE_STEREOSCOPIC_RENDER
void ogl_stereo_frame(bool left_eye, int xoff);
#endif
void ogl_end_frame(void);
void ogl_set_screen_mode(void);

View File

@ -92,6 +92,7 @@ extern int Global_missile_firing_count;
extern int PaletteRedAdd, PaletteGreenAdd, PaletteBlueAdd;
#if DXX_USE_STEREOSCOPIC_RENDER
// Stereo viewport formats
enum class StereoFormat : uint8_t;
@ -101,6 +102,7 @@ extern int VR_eye_offset;
extern int VR_sync_width;
extern grs_subcanvas VR_hud_left;
extern grs_subcanvas VR_hud_right;
#endif
extern cockpit_mode_t last_drawn_cockpit;
@ -160,7 +162,9 @@ extern game_window *Game_wind;
void game();
void init_game();
#if DXX_USE_STEREOSCOPIC_RENDER
void init_stereo();
#endif
void init_cockpit();
void PALETTE_FLASH_ADD(int dr, int dg, int db);

View File

@ -138,6 +138,7 @@ struct d_game_unique_state
}
};
#if DXX_USE_STEREOSCOPIC_RENDER
// Stereo viewport formats
enum class StereoFormat : uint8_t
{
@ -148,6 +149,7 @@ enum class StereoFormat : uint8_t
AboveBelowSync,
HighestFormat = AboveBelowSync
};
#endif
}

View File

@ -1280,7 +1280,7 @@ void ogl_start_frame(grs_canvas &canvas)
glLoadIdentity();//clear matrix
}
#if !DXX_USE_OGLES
#if DXX_USE_STEREOSCOPIC_RENDER
void ogl_stereo_frame(const bool left_eye, const int xoff)
{
const float dxoff = xoff * 2.0f / grd_curscreen->sc_canvas.cv_bitmap.bm_w;

View File

@ -203,16 +203,20 @@ constexpr screen_mode initial_small_game_screen_mode{320, 200};
constexpr screen_mode initial_large_game_screen_mode{1024, 768};
screen_mode Game_screen_mode = initial_large_game_screen_mode;
#if DXX_USE_STEREOSCOPIC_RENDER
StereoFormat VR_stereo;
fix VR_eye_width = F1_0;
int VR_eye_offset = 0;
int VR_sync_width = 20;
grs_subcanvas VR_hud_left;
grs_subcanvas VR_hud_right;
#endif
}
namespace dsx {
#if DXX_USE_STEREOSCOPIC_RENDER
void init_stereo()
{
#if DXX_USE_OGL
@ -243,6 +247,7 @@ void init_stereo()
}
#endif
}
#endif
//initialize the various canvases on the game screen
//called every time the screen mode or cockpit changes
@ -300,6 +305,7 @@ void init_cockpit()
{
unsigned w = SWIDTH;
unsigned h = SHEIGHT;
#if DXX_USE_STEREOSCOPIC_RENDER
switch (VR_stereo)
{
case StereoFormat::None:
@ -323,6 +329,7 @@ void init_cockpit()
w /= 2;
break;
}
#endif
game_init_render_sub_buffers(canvas, 0, 0, w, h);
}
break;
@ -356,9 +363,11 @@ void init_cockpit()
//selects a given cockpit (or lack of one). See types in game.h
void select_cockpit(const cockpit_mode_t mode)
{
#if DXX_USE_STEREOSCOPIC_RENDER
// skip switching cockpit views while stereo viewport active
if (VR_stereo != StereoFormat::None && mode != cockpit_mode_t::full_screen)
return;
#endif
if (mode != PlayerCfg.CockpitMode[1]) { //new mode
PlayerCfg.CockpitMode[1]=mode;
@ -380,6 +389,7 @@ void game_init_render_sub_buffers(grs_canvas &canvas, const int x, const int y,
gr_clear_canvas(canvas, 0);
gr_init_sub_canvas(Screen_3d_window, canvas, x, y, w, h);
#if DXX_USE_STEREOSCOPIC_RENDER
if (VR_stereo != StereoFormat::None)
{
// offset HUD screen rects to force out-of-screen parallax on HUD overlays
@ -429,6 +439,7 @@ void game_init_render_sub_buffers(grs_canvas &canvas, const int x, const int y,
gr_init_sub_canvas(VR_hud_left, grd_curscreen->sc_canvas, l.x, l.y, l.w, l.h);
gr_init_sub_canvas(VR_hud_right, grd_curscreen->sc_canvas, r.x, r.y, r.w, r.h);
}
#endif
}
}
@ -1729,7 +1740,9 @@ game_window *game_setup()
auto game_wind = window_create<game_window>(grd_curscreen->sc_canvas, 0, 0, SWIDTH, SHEIGHT);
reset_palette_add();
#if DXX_USE_STEREOSCOPIC_RENDER
init_stereo();
#endif
init_cockpit();
init_gauges();
netplayerinfo_on = 0;

View File

@ -977,7 +977,7 @@ static window_event_result HandleSystemKey(int key)
break;
#endif
#if DXX_USE_OGL
#if DXX_USE_STEREOSCOPIC_RENDER
#if 0
/* These conflict with the drop-primary and drop-secondary
* keybindings. Dropping items is more common than using VR, so

View File

@ -802,13 +802,17 @@ void game_render_frame_mono(const d_robot_info_array &Robot_info, const control_
Viewer = gimobj;
window_rendered_data window;
#if DXX_USE_STEREOSCOPIC_RENDER
if (VR_stereo != StereoFormat::None)
{
render_frame(canvas, -VR_eye_width, window);
render_frame(canvas, +VR_eye_width, window);
}
else
#endif
{
render_frame(canvas, 0, window);
}
wake_up_rendered_objects(*Viewer, window);
show_HUD_names(Robot_info, canvas, Game_mode);
@ -840,13 +844,17 @@ void game_render_frame_mono(const d_robot_info_array &Robot_info, const control_
}
#endif
window_rendered_data window;
#if DXX_USE_STEREOSCOPIC_RENDER
if (VR_stereo != StereoFormat::None)
{
render_frame(canvas, -VR_eye_width, window);
render_frame(canvas, +VR_eye_width, window);
}
else
#endif
{
render_frame(canvas, 0, window);
}
}
}
gr_set_default_canvas();
@ -859,13 +867,17 @@ void game_render_frame_mono(const d_robot_info_array &Robot_info, const control_
}
if (!no_draw_hud) {
#if DXX_USE_STEREOSCOPIC_RENDER
if (VR_stereo != StereoFormat::None)
{
game_draw_hud_stuff(Robot_info, VR_hud_left, Controls);
game_draw_hud_stuff(Robot_info, VR_hud_right, Controls);
}
else
#endif
{
game_draw_hud_stuff(Robot_info, Screen_3d_window, Controls);
}
}
#if defined(DXX_BUILD_DESCENT_II)
@ -884,8 +896,12 @@ void game_render_frame_mono(const d_robot_info_array &Robot_info, const control_
void toggle_cockpit()
{
if (Rear_view || Player_dead_state != player_dead_state::no || VR_stereo != StereoFormat::None)
if (Rear_view || Player_dead_state != player_dead_state::no)
return;
#if DXX_USE_STEREOSCOPIC_RENDER
if (VR_stereo != StereoFormat::None)
return;
#endif
auto new_mode = cockpit_mode_t::full_screen;

View File

@ -220,7 +220,7 @@ static void print_commandline_help()
VERB(" 5: Auto: if VSync is enabled and ARB_sync is supported, use mode 2, otherwise mode 0\n") \
VERB(" -gl_syncwait <n> Wait interval (ms) for sync mode 2 (default: " DXX_STRINGIZE(OGL_SYNC_WAIT_DEFAULT) ")\n") \
VERB(" -gl_darkedges Re-enable dark edges around filtered textures (as present in earlier versions of the engine)\n") \
DXX_if_not_defined_to_1(RELEASE, ( \
DXX_if_defined_01(DXX_USE_STEREOSCOPIC_RENDER, ( \
VERB(" -gl_stereo Enable OpenGL stereo quad buffering, if available\n") \
VERB(" -gl_stereoview <n> Select OpenGL stereo viewport mode (experimental; incomplete)\n") \
VERB(" 1: above/below half-height format\n") \

View File

@ -1265,10 +1265,12 @@ void render_frame(grs_canvas &canvas, fix eye_offset, window_rendered_data &wind
g3_start_frame(canvas);
#if DXX_USE_OGL && !DXX_USE_OGLES
#if DXX_USE_STEREOSCOPIC_RENDER
#if DXX_USE_OGL
// select stereo viewport/transform/buffer per left/right eye
if (VR_stereo != StereoFormat::None && eye_offset)
ogl_stereo_frame(eye_offset < 0, VR_eye_offset);
#endif
#endif
auto Viewer_eye = Viewer->pos;

View File

@ -153,7 +153,9 @@ static void InitGameArg()
#if DXX_USE_OGL
CGameArg.OglSyncMethod = OGL_SYNC_METHOD_DEFAULT;
CGameArg.OglSyncWait = OGL_SYNC_WAIT_DEFAULT;
#if DXX_USE_STEREOSCOPIC_RENDER
CGameArg.OglStereo = false;
#endif
CGameArg.DbgGlIntensity4Ok = true;
CGameArg.DbgGlLuminance4Alpha4Ok = true;
CGameArg.DbgGlRGBA2Ok = true;
@ -294,10 +296,12 @@ static void ReadCmdArgs(Inilist &ini, Arglist &Args)
CGameArg.OglSyncWait = arg_integer(pp, end);
else if (!d_stricmp(p, "-gl_darkedges"))
CGameArg.OglDarkEdges = true;
#if DXX_USE_STEREOSCOPIC_RENDER
else if (!d_stricmp(p, "-gl_stereo"))
CGameArg.OglStereo = true;
else if (!d_stricmp(p, "-gl_stereoview"))
CGameArg.OglStereoView = arg_integer(pp, end);
#endif
#endif
// Multiplayer Options