Merge pull request #418 from mendsley/hmd_device_resolution

VR: Add device resolution to HMD. Init at startup.
This commit is contained in:
Branimir Karadžić 2015-06-03 16:56:45 -07:00
commit 3813b28e9b
19 changed files with 88 additions and 63 deletions

View file

@ -119,7 +119,7 @@ int _main_(int /*_argc*/, char** /*_argv*/)
// Set view and projection matrix for view 0. // Set view and projection matrix for view 0.
const bgfx::HMD* hmd = bgfx::getHMD(); const bgfx::HMD* hmd = bgfx::getHMD();
if (NULL != hmd) if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING))
{ {
float view[16]; float view[16];
bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye); bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye);

View file

@ -548,7 +548,7 @@ int _main_(int /*_argc*/, char** /*_argv*/)
// Set view and projection matrix for view 0. // Set view and projection matrix for view 0.
const bgfx::HMD* hmd = bgfx::getHMD(); const bgfx::HMD* hmd = bgfx::getHMD();
if (NULL != hmd) if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING))
{ {
float view[16]; float view[16];
bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye); bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye);

View file

@ -65,7 +65,7 @@ int _main_(int /*_argc*/, char** /*_argv*/)
// Set view and projection matrix for view 0. // Set view and projection matrix for view 0.
const bgfx::HMD* hmd = bgfx::getHMD(); const bgfx::HMD* hmd = bgfx::getHMD();
if (NULL != hmd) if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING))
{ {
float view[16]; float view[16];
bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye); bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye);

View file

@ -135,7 +135,7 @@ int _main_(int /*_argc*/, char** /*_argv*/)
// Set view and projection matrix for view 0. // Set view and projection matrix for view 0.
const bgfx::HMD* hmd = bgfx::getHMD(); const bgfx::HMD* hmd = bgfx::getHMD();
if (NULL != hmd) if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING))
{ {
float view[16]; float view[16];
bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye); bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye);

View file

@ -195,7 +195,7 @@ int _main_(int /*_argc*/, char** /*_argv*/)
// Set view and projection matrix for view 0. // Set view and projection matrix for view 0.
const bgfx::HMD* hmd = bgfx::getHMD(); const bgfx::HMD* hmd = bgfx::getHMD();
if (NULL != hmd) if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING))
{ {
float view[16]; float view[16];
bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye); bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye);

View file

@ -203,7 +203,7 @@ int _main_(int /*_argc*/, char** /*_argv*/)
// Setup a top-left ortho matrix for screen space drawing. // Setup a top-left ortho matrix for screen space drawing.
const bgfx::HMD* hmd = bgfx::getHMD(); const bgfx::HMD* hmd = bgfx::getHMD();
if (NULL != hmd) if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING))
{ {
float proj[16]; float proj[16];
bx::mtxProj(proj, hmd->eye[0].fov, 0.1f, 100.0f); bx::mtxProj(proj, hmd->eye[0].fov, 0.1f, 100.0f);

View file

@ -201,7 +201,7 @@ int _main_(int /*_argc*/, char** /*_argv*/)
// Setup a top-left ortho matrix for screen space drawing. // Setup a top-left ortho matrix for screen space drawing.
const bgfx::HMD* hmd = bgfx::getHMD(); const bgfx::HMD* hmd = bgfx::getHMD();
if (NULL != hmd) if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING))
{ {
float proj[16]; float proj[16];
bx::mtxProj(proj, hmd->eye[0].fov, 0.1f, 100.0f); bx::mtxProj(proj, hmd->eye[0].fov, 0.1f, 100.0f);

View file

@ -163,7 +163,7 @@ int _main_(int /*_argc*/, char** /*_argv*/)
// Set view and projection matrix for view 0. // Set view and projection matrix for view 0.
const bgfx::HMD* hmd = bgfx::getHMD(); const bgfx::HMD* hmd = bgfx::getHMD();
if (NULL != hmd) if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING))
{ {
float view[16]; float view[16];
bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye); bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye);

View file

@ -2107,7 +2107,7 @@ int _main_(int /*_argc*/, char** /*_argv*/)
// Set view and projection matrix for view 0. // Set view and projection matrix for view 0.
const bgfx::HMD* hmd = bgfx::getHMD(); const bgfx::HMD* hmd = bgfx::getHMD();
if (NULL != hmd) if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING))
{ {
float eye[3]; float eye[3];
cameraGetPosition(eye); cameraGetPosition(eye);

View file

@ -294,7 +294,7 @@ int _main_(int /*_argc*/, char** /*_argv*/)
// Set view and projection matrix for view 0. // Set view and projection matrix for view 0.
const bgfx::HMD* hmd = bgfx::getHMD(); const bgfx::HMD* hmd = bgfx::getHMD();
if (NULL != hmd) if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING))
{ {
float viewHead[16]; float viewHead[16];
float eye[3] = {}; float eye[3] = {};

View file

@ -832,7 +832,7 @@ struct Imgui
bgfx::setViewSeq(_view, true); bgfx::setViewSeq(_view, true);
const bgfx::HMD* hmd = bgfx::getHMD(); const bgfx::HMD* hmd = bgfx::getHMD();
if (NULL != hmd) if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING))
{ {
m_viewWidth = _width / 2; m_viewWidth = _width / 2;
m_surfaceWidth = _surfaceWidth / 2; m_surfaceWidth = _surfaceWidth / 2;

View file

@ -211,6 +211,9 @@ typedef struct bgfx_hmd
bgfx_hmd_eye_t eye[2]; bgfx_hmd_eye_t eye[2];
uint16_t width; uint16_t width;
uint16_t height; uint16_t height;
uint32_t deviceWidth;
uint32_t deviceHeight;
uint8_t flags;
} bgfx_hmd_t; } bgfx_hmd_t;

View file

@ -414,8 +414,11 @@ namespace bgfx
}; };
Eye eye[2]; Eye eye[2];
uint16_t width; //!< Framebuffer width. uint16_t width; //!< Framebuffer width.
uint16_t height; //!< Framebuffer width. uint16_t height; //!< Framebuffer width.
uint32_t deviceWidth; //!< Device resolution width
uint32_t deviceHeight; //!< Device resolution height
uint8_t flags; //!< Status flags
}; };
/// Vertex declaration. /// Vertex declaration.

View file

@ -370,4 +370,9 @@
#define BGFX_PCI_ID_INTEL UINT16_C(0x8086) #define BGFX_PCI_ID_INTEL UINT16_C(0x8086)
#define BGFX_PCI_ID_NVIDIA UINT16_C(0x10de) #define BGFX_PCI_ID_NVIDIA UINT16_C(0x10de)
///
#define BGFX_HMD_NONE UINT8_C(0x00)
#define BGFX_HMD_DEVICE_RESOLUTION UINT8_C(0x01)
#define BGFX_HMD_RENDERING UINT8_C(0x02)
#endif // BGFX_DEFINES_H_HEADER_GUARD #endif // BGFX_DEFINES_H_HEADER_GUARD

View file

@ -1203,7 +1203,7 @@ namespace bgfx
BX_ALIGN_DECL_CACHE_LINE(struct) Frame BX_ALIGN_DECL_CACHE_LINE(struct) Frame
{ {
Frame() Frame()
: m_hmdEnabled(false) : m_hmdInitialized(false)
, m_waitSubmit(0) , m_waitSubmit(0)
, m_waitRender(0) , m_waitRender(0)
{ {
@ -1645,7 +1645,7 @@ namespace bgfx
UniformHandle m_freeUniformHandle[BGFX_CONFIG_MAX_UNIFORMS]; UniformHandle m_freeUniformHandle[BGFX_CONFIG_MAX_UNIFORMS];
TextVideoMem* m_textVideoMem; TextVideoMem* m_textVideoMem;
HMD m_hmd; HMD m_hmd;
bool m_hmdEnabled; bool m_hmdInitialized;
int64_t m_waitSubmit; int64_t m_waitSubmit;
int64_t m_waitRender; int64_t m_waitRender;
@ -1987,7 +1987,7 @@ namespace bgfx
BGFX_API_FUNC(const HMD* getHMD() ) BGFX_API_FUNC(const HMD* getHMD() )
{ {
if (m_submit->m_hmdEnabled) if (m_submit->m_hmdInitialized)
{ {
return &m_submit->m_hmd; return &m_submit->m_hmd;
} }

View file

@ -11,26 +11,56 @@ namespace bgfx
{ {
OVR::OVR() OVR::OVR()
: m_hmd(NULL) : m_hmd(NULL)
, m_initialized(false) , m_isenabled(false)
, m_debug(false) , m_debug(false)
{ {
} }
OVR::~OVR() OVR::~OVR()
{ {
BX_CHECK(!m_initialized, "OVR not shutdown properly."); BX_CHECK(NULL == m_hmd, "OVR not shutdown properly.");
} }
void OVR::init() void OVR::init()
{ {
m_initialized = !!ovr_Initialize(); bool initialized = !!ovr_Initialize();
BX_WARN(initialized, "Unable to create OVR device.");
if (!initialized)
{
return;
}
m_hmd = ovrHmd_Create(0);
if (NULL == m_hmd)
{
m_hmd = ovrHmd_CreateDebug(ovrHmd_DK2);
BX_WARN(NULL != m_hmd, "Unable to create OVR device.");
if (NULL == m_hmd)
{
return;
}
}
BX_TRACE("HMD: %s, %s, firmware: %d.%d"
, m_hmd->ProductName
, m_hmd->Manufacturer
, m_hmd->FirmwareMajor
, m_hmd->FirmwareMinor
);
ovrSizei sizeL = ovrHmd_GetFovTextureSize(m_hmd, ovrEye_Left, m_hmd->DefaultEyeFov[0], 1.0f);
ovrSizei sizeR = ovrHmd_GetFovTextureSize(m_hmd, ovrEye_Right, m_hmd->DefaultEyeFov[1], 1.0f);
m_rtSize.w = sizeL.w + sizeR.w;
m_rtSize.h = bx::uint32_max(sizeL.h, sizeR.h);
m_warning = true;
} }
void OVR::shutdown() void OVR::shutdown()
{ {
BX_CHECK(NULL == m_hmd, "HMD not destroyed."); BX_CHECK(!m_isenabled, "HMD not disabled.");
ovrHmd_Destroy(m_hmd);
m_hmd = NULL;
ovr_Shutdown(); ovr_Shutdown();
m_initialized = false;
} }
bool OVR::postReset(void* _nwh, ovrRenderAPIConfig* _config, bool _debug) bool OVR::postReset(void* _nwh, ovrRenderAPIConfig* _config, bool _debug)
@ -75,33 +105,12 @@ namespace bgfx
return false; return false;
} }
if (!m_initialized) if (NULL == m_hmd)
{ {
return false; return false;
} }
if (!_debug) m_isenabled = true;
{
m_hmd = ovrHmd_Create(0);
}
if (NULL == m_hmd)
{
m_hmd = ovrHmd_CreateDebug(ovrHmd_DK2);
BX_WARN(NULL != m_hmd, "Unable to initialize OVR.");
if (NULL == m_hmd)
{
return false;
}
}
BX_TRACE("HMD: %s, %s, firmware: %d.%d"
, m_hmd->ProductName
, m_hmd->Manufacturer
, m_hmd->FirmwareMajor
, m_hmd->FirmwareMinor
);
ovrBool result; ovrBool result;
result = ovrHmd_AttachToWindow(m_hmd, _nwh, NULL, NULL); result = ovrHmd_AttachToWindow(m_hmd, _nwh, NULL, NULL);
@ -142,18 +151,11 @@ namespace bgfx
{ {
ovrError: ovrError:
BX_TRACE("Failed to initialize OVR."); BX_TRACE("Failed to initialize OVR.");
ovrHmd_Destroy(m_hmd); m_isenabled = false;
m_hmd = NULL;
return false; return false;
} }
ovrSizei sizeL = ovrHmd_GetFovTextureSize(m_hmd, ovrEye_Left, m_hmd->DefaultEyeFov[0], 1.0f);
ovrSizei sizeR = ovrHmd_GetFovTextureSize(m_hmd, ovrEye_Right, m_hmd->DefaultEyeFov[1], 1.0f);
m_rtSize.w = sizeL.w + sizeR.w;
m_rtSize.h = bx::uint32_max(sizeL.h, sizeR.h);
m_warning = true; m_warning = true;
return true; return true;
} }
@ -188,11 +190,12 @@ ovrError:
void OVR::preReset() void OVR::preReset()
{ {
if (NULL != m_hmd) if (m_isenabled)
{ {
ovrHmd_EndFrame(m_hmd, m_pose, m_texture); ovrHmd_EndFrame(m_hmd, m_pose, m_texture);
ovrHmd_Destroy(m_hmd); ovrHmd_AttachToWindow(m_hmd, NULL, NULL, NULL);
m_hmd = NULL; ovrHmd_ConfigureRendering(m_hmd, NULL, 0, NULL, NULL);
m_isenabled = false;
} }
m_debug = false; m_debug = false;
@ -200,11 +203,21 @@ ovrError:
bool OVR::swap(HMD& _hmd) bool OVR::swap(HMD& _hmd)
{ {
if (NULL == m_hmd) _hmd.flags = BGFX_HMD_NONE;
if (NULL != m_hmd)
{
_hmd.flags |= BGFX_HMD_DEVICE_RESOLUTION;
_hmd.deviceWidth = m_hmd->Resolution.w;
_hmd.deviceHeight = m_hmd->Resolution.h;
}
if (!m_isenabled)
{ {
return false; return false;
} }
_hmd.flags |= BGFX_HMD_RENDERING;
ovrHmd_EndFrame(m_hmd, m_pose, m_texture); ovrHmd_EndFrame(m_hmd, m_pose, m_texture);
if (m_warning) if (m_warning)

View file

@ -51,12 +51,12 @@ namespace bgfx
bool isInitialized() const bool isInitialized() const
{ {
return m_initialized; return NULL != m_hmd;
} }
bool isEnabled() const bool isEnabled() const
{ {
return NULL != m_hmd; return m_isenabled;
} }
bool isDebug() const bool isDebug() const
@ -87,7 +87,7 @@ namespace bgfx
ovrTexture m_texture[2]; ovrTexture m_texture[2];
ovrSizei m_rtSize; ovrSizei m_rtSize;
bool m_warning; bool m_warning;
bool m_initialized; bool m_isenabled;
bool m_debug; bool m_debug;
}; };
@ -132,6 +132,7 @@ namespace bgfx
bool swap(HMD& _hmd) bool swap(HMD& _hmd)
{ {
_hmd.flags = BGFX_HMD_NONE;
getEyePose(_hmd); getEyePose(_hmd);
return false; return false;
} }

View file

@ -3736,9 +3736,9 @@ BX_PRAGMA_DIAGNOSTIC_POP();
currentState.m_flags = BGFX_STATE_NONE; currentState.m_flags = BGFX_STATE_NONE;
currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE); currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE);
const bool hmdEnabled = m_ovr.isEnabled() || m_ovr.isDebug(); _render->m_hmdInitialized = m_ovr.isInitialized();
_render->m_hmdEnabled = hmdEnabled;
const bool hmdEnabled = m_ovr.isEnabled() || m_ovr.isDebug();
ViewState& viewState = m_viewState; ViewState& viewState = m_viewState;
viewState.reset(_render, hmdEnabled); viewState.reset(_render, hmdEnabled);

View file

@ -4838,9 +4838,9 @@ namespace bgfx { namespace gl
currentState.m_flags = BGFX_STATE_NONE; currentState.m_flags = BGFX_STATE_NONE;
currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE); currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE);
const bool hmdEnabled = m_ovr.isEnabled() || m_ovr.isDebug(); _render->m_hmdInitialized = m_ovr.isInitialized();
_render->m_hmdEnabled = hmdEnabled;
const bool hmdEnabled = m_ovr.isEnabled() || m_ovr.isDebug();
ViewState viewState(_render, hmdEnabled); ViewState viewState(_render, hmdEnabled);
uint16_t programIdx = invalidHandle; uint16_t programIdx = invalidHandle;