diff options
Diffstat (limited to 'LibOVR/Src/CAPI/CAPI_DistortionRenderer.h')
-rw-r--r-- | LibOVR/Src/CAPI/CAPI_DistortionRenderer.h | 69 |
1 files changed, 57 insertions, 12 deletions
diff --git a/LibOVR/Src/CAPI/CAPI_DistortionRenderer.h b/LibOVR/Src/CAPI/CAPI_DistortionRenderer.h index a256bc6..601cbc2 100644 --- a/LibOVR/Src/CAPI/CAPI_DistortionRenderer.h +++ b/LibOVR/Src/CAPI/CAPI_DistortionRenderer.h @@ -30,6 +30,7 @@ limitations under the License. #include "CAPI_HMDRenderState.h" #include "CAPI_FrameTimeManager.h" +typedef void (*PostDistortionCallback)(void* pRenderContext); namespace OVR { namespace CAPI { @@ -48,11 +49,24 @@ public: DistortionRenderer(ovrRenderAPIType api, ovrHmd hmd, FrameTimeManager& timeManager, - const HMDRenderState& renderState) - : RenderAPI(api), HMD(hmd), TimeManager(timeManager), RState(renderState) - { } + const HMDRenderState& renderState) : + RenderAPI(api), + HMD(hmd), + TimeManager(timeManager), + RState(renderState), + RegisteredPostDistortionCallback(NULL), + LastUsedOverdriveTextureIndex(-1), + LatencyTestActive(false), + LatencyTest2Active(false) + { +#ifdef OVR_OS_WIN32 + timer = CreateWaitableTimer(NULL, TRUE, NULL); + OVR_ASSERT(timer != NULL); +#endif + } virtual ~DistortionRenderer() - { } + { + } // Configures the Renderer based on externally passed API settings. Must be @@ -65,18 +79,22 @@ public: // Submits one eye texture for rendering. This is in the separate method to // allow "submit as you render" scenarios on horizontal screens where one // eye can be scanned out before the other. - virtual void SubmitEye(int eyeId, ovrTexture* eyeTexture) = 0; + virtual void SubmitEye(int eyeId, const ovrTexture* eyeTexture) = 0; // Finish the frame, optionally swapping buffers. // Many implementations may actually apply the distortion here. - virtual void EndFrame(bool swapBuffers, unsigned char* latencyTesterDrawColor, - unsigned char* latencyTester2DrawColor) = 0; + virtual void EndFrame(bool swapBuffers) = 0; + void RegisterPostDistortionCallback(PostDistortionCallback postDistortionCallback) + { + RegisteredPostDistortionCallback = postDistortionCallback; + } + // Stores the current graphics pipeline state so it can be restored later. - void SaveGraphicsState() { if (!(RState.EnabledHmdCaps & ovrHmdCap_NoRestore)) GfxState->Save(); } + void SaveGraphicsState() { if (!(RState.DistortionCaps & ovrDistortionCap_NoRestore)) GfxState->Save(); } // Restores the saved graphics pipeline state. - void RestoreGraphicsState() { if (!(RState.EnabledHmdCaps & ovrHmdCap_NoRestore)) GfxState->Restore(); } + void RestoreGraphicsState() { if (!(RState.DistortionCaps & ovrDistortionCap_NoRestore)) GfxState->Restore(); } // *** Creation Factory logic @@ -89,8 +107,36 @@ public: static CreateFunc APICreateRegistry[ovrRenderAPI_Count]; -protected: + // Color is expected to be 3 byte RGB + void SetLatencyTestColor(unsigned char* color); + void SetLatencyTest2Color(unsigned char* color); +protected: + // Used for pixel luminance overdrive on DK2 displays + // A copy of back buffer images will be ping ponged + // TODO: figure out 0 dynamically based on DK2 latency? + static const int NumOverdriveTextures = 2; + int LastUsedOverdriveTextureIndex; + + bool LatencyTestActive; + unsigned char LatencyTestDrawColor[3]; + bool LatencyTest2Active; + unsigned char LatencyTest2DrawColor[3]; + + bool IsOverdriveActive() + { + // doesn't make sense to use overdrive when vsync is disabled as we cannot guarantee + // when the rendered frame will be displayed + return LastUsedOverdriveTextureIndex >= 0 && !((RState.EnabledHmdCaps & ovrHmdCap_NoVSync) > 0); + } + + double WaitTillTime(double absTime); + +#ifdef OVR_OS_WIN32 + HANDLE timer; + LARGE_INTEGER waitableTimerInterval; +#endif + class GraphicsState : public RefCountBase<GraphicsState> { public: @@ -108,11 +154,10 @@ protected: FrameTimeManager& TimeManager; const HMDRenderState& RState; Ptr<GraphicsState> GfxState; + PostDistortionCallback RegisteredPostDistortionCallback; }; }} // namespace OVR::CAPI #endif // OVR_CAPI_DistortionRenderer_h - - |