From f4e00c31599765db106c7c50eae07a28399b5ab2 Mon Sep 17 00:00:00 2001 From: mittorn Date: Sat, 16 Sep 2023 03:39:09 +0300 Subject: [PATCH] HACK: make compositor work. Get glname from undistorted texture and put to compositor. need vr_use_offscreen_rendering enabled and multicore rendering disabled to work --- materialsystem/cmaterialsystem.h | 1 + materialsystem/gltexturehack.cpp | 53 +++++++++++++++++++++ materialsystem/mat_stub.cpp | 2 +- materialsystem/wscript | 1 + public/materialsystem/imaterialsystem.h | 1 + sourcevr/sourcevirtualreality.cpp | 62 ++++++++++++++++++++++--- sourcevr/wscript | 3 +- 7 files changed, 115 insertions(+), 8 deletions(-) create mode 100644 materialsystem/gltexturehack.cpp diff --git a/materialsystem/cmaterialsystem.h b/materialsystem/cmaterialsystem.h index 60aad1fd8..75cbbed7b 100644 --- a/materialsystem/cmaterialsystem.h +++ b/materialsystem/cmaterialsystem.h @@ -501,6 +501,7 @@ class CMaterialSystem : public CTier2AppSystem< IMaterialSystemInternal >, publi DELEGATE_TO_OBJECT_0( bool, OnFlushBufferedPrimitives, GetRenderContextInternal() ); void OnThreadEvent( uint32 threadEvent ); ShaderAPITextureHandle_t GetShaderAPITextureBindHandle( ITexture *pTexture, int nFrame, int nTextureChannel ); // JasonM ???? + uint32_t GetShaderAPIGLTexture( ITexture *pTexture, int nFrame, int nTextureChannel ); // fuck diff --git a/materialsystem/gltexturehack.cpp b/materialsystem/gltexturehack.cpp new file mode 100644 index 000000000..8748cce19 --- /dev/null +++ b/materialsystem/gltexturehack.cpp @@ -0,0 +1,53 @@ +#include "pch_materialsystem.h" +#include "togl/rendermechanism.h" + +#define MATSYS_INTERNAL + +#include "cmaterialsystem.h" +//----------------------------------------------------------------------------- +// The Base implementation of the shader rendering interface +//----------------------------------------------------------------------------- +class CShaderAPIBase : public IShaderAPI +{ +public: + // constructor, destructor + CShaderAPIBase(); + virtual ~CShaderAPIBase(); + + // Called when the device is initializing or shutting down + virtual bool OnDeviceInit() = 0; + virtual void OnDeviceShutdown() = 0; + + // Pix events + virtual void BeginPIXEvent( unsigned long color, const char *szName ) = 0; + virtual void EndPIXEvent() = 0; + virtual void AdvancePIXFrame() = 0; + + // Release, reacquire objects + virtual void ReleaseShaderObjects() = 0; + virtual void RestoreShaderObjects() = 0; + + // Resets the render state to its well defined initial value + virtual void ResetRenderState( bool bFullReset = true ) = 0; + + // Returns a d3d texture associated with a texture handle + virtual IDirect3DBaseTexture9* GetD3DTexture( ShaderAPITextureHandle_t hTexture ) = 0; + + // Queues a non-full reset of render state next BeginFrame. + virtual void QueueResetRenderState() = 0; + + // Methods of IShaderDynamicAPI +public: + virtual void GetCurrentColorCorrection( ShaderColorCorrectionInfo_t* pInfo ); + +protected: +}; + +uint32_t CMaterialSystem::GetShaderAPIGLTexture( ITexture *pTexture, int nFrame, int nTextureChannel ) +{ + ShaderAPITextureHandle_t handle = ShaderSystem()->GetShaderAPITextureBindHandle( pTexture, nFrame, nTextureChannel ); + IDirect3DTexture9* pTex = ((CShaderAPIBase*)g_pShaderAPI)->GetD3DTexture(handle); + IDirect3DSurface9* surf = pTex->m_surfZero; + CGLMTex *tex = surf->m_tex; + return tex->GetTexName(); +} diff --git a/materialsystem/mat_stub.cpp b/materialsystem/mat_stub.cpp index c9820c2c2..bae40c859 100644 --- a/materialsystem/mat_stub.cpp +++ b/materialsystem/mat_stub.cpp @@ -2276,7 +2276,7 @@ class CDummyMaterialSystem : public IMaterialSystemStub, public CRefCounted1GetEyeOutputViewport( SourceEyeToHmdEye( eEye ), &x, &y, &w, &h ); m_pExtDisplay->GetEyeOutputViewport( SourceEyeToHmdEye( eEye ), &x, &y, &w, &h ); if( pnX && pnY ) @@ -543,7 +543,13 @@ bool CSourceVirtualReality::SampleTrackingState ( float PlayerGameFov, float fPr { if( !m_pHmd || !m_bActive ) return false; - + vr::VREvent_t event; + while( m_pHmd->PollNextEvent( &event, sizeof( event ) ) ) + { + //ProcessVREvent( event ); + } + vr::TrackedDevicePose_t m_rTrackedDevicePose[ vr::k_unMaxTrackedDeviceCount ]; + vr::VRCompositor()->WaitGetPoses(m_rTrackedDevicePose, vr::k_unMaxTrackedDeviceCount, NULL, 0 ); // If tracker can't return a pose (it's possibly recalibrating itself) // then we will freeze tracking at its current state, rather than // snapping it back to the zero position @@ -577,6 +583,7 @@ bool CSourceVirtualReality::SampleTrackingState ( float PlayerGameFov, float fPr return true; } +#include "togl/rendermechanism.h" // ---------------------------------------------------------------------- @@ -594,10 +601,16 @@ bool CSourceVirtualReality::DoDistortionProcessing ( VREye eEye ) CMatRenderContextPtr pRenderContext( materials ); IMaterial *pDistortMaterial; + ITexture *pDistortTexture; + if( eEye == VREye_Left ) pDistortMaterial = m_DistortLeftMaterial; else pDistortMaterial = m_DistortRightMaterial; + if( eEye == VREye_Left ) + pDistortTexture = m_pDistortionTextureLeft; + else + pDistortTexture = m_pDistortionTextureRight; if( !UsingOffscreenRenderTarget() ) { @@ -607,17 +620,46 @@ bool CSourceVirtualReality::DoDistortionProcessing ( VREye eEye ) return false; Rect_t r; + r.x = !eEye?0:640; + r.y = 0; + r.width = 640; + r.height = 480; this->GetViewportBounds( eEye, &r.x, &r.y, &r.width, &r.height ); pRenderContext->CopyRenderTargetToTextureEx( pFullFrameFB1, 0, &r, &r ); } // This is where we are rendering to uint32_t x, y, w, h; + x = !eEye?0:640; + y = 0; + w = 640; + h = 480; m_pExtDisplay->GetEyeOutputViewport( SourceEyeToHmdEye( eEye ), &x, &y, &w, &h ); pRenderContext->DrawScreenSpaceRectangle ( pDistortMaterial, x, y, w, h, 0, 0, distortionTextureSize-1,distortionTextureSize-1,distortionTextureSize,distortionTextureSize); + static int id = -1; + //static CDynamicFunctionOpenGL< true, GLvoid ( APIENTRY *)(GLenum pname, GLint *params), GLvoid > glGetIntegerv("glGetIntegerv"); +// pRenderContext->Bind(pDistortMaterial); +// pRenderContext->Flush( true ); +// ShaderAPITextureHandle_t hndl = materials->GetShaderAPITextureBindHandle(pDistortTexture,0,0); + //if(id < 0) + id = materials->GetShaderAPIGLTexture(m_pPredistortRT,0,0); + + static int last_tex[2] = {-1, -1}; +// glGetIntegerv(GL_TEXTURE_BINDING_2D, &id); + if(id > 0) + last_tex[eEye != VREye_Left] = id; + Msg("tex %d\n", id); + const vr::VRTextureBounds_t bounds = { 0.0f, 1.0f, 1.0f, 0.0f }; + vr::Texture_t eyeTexture = {(void*)(uintptr_t)last_tex[eEye != VREye_Left], vr::TextureType_OpenGL, vr::ColorSpace_Gamma }; + if(last_tex[eEye != VREye_Left] <= 0) + return true; +// if(eEye != VREye_Left) +// return 0; + glFinish(); + vr::VRCompositor()->Submit(SourceEyeToHmdEye( eEye ), &eyeTexture, &bounds ); return true; } @@ -687,11 +729,15 @@ bool CSourceVirtualReality::CompositeHud ( VREye eEye, float ndcHudBounds[4], bo CMatRenderContextPtr pRenderContext( materials ); uint32_t x, y, w, h; + x = !eEye?0:640; + y = 0; + w = 640; + h = 480; m_pExtDisplay->GetEyeOutputViewport( SourceEyeToHmdEye( eEye ), &x, &y, &w, &h ); - pRenderContext->DrawScreenSpaceRectangle ( pDistortHUDMaterial, - x, y, w, h, - 0, 0, distortionTextureSize-1,distortionTextureSize-1,distortionTextureSize,distortionTextureSize); +// pRenderContext->DrawScreenSpaceRectangle ( pDistortHUDMaterial, +// x, y, w, h, +// 0, 0, distortionTextureSize-1,distortionTextureSize-1,distortionTextureSize,distortionTextureSize); return true; } @@ -714,13 +760,17 @@ bool CSourceVirtualReality::StartTracker() m_pHmd = vr::VR_Init( &err, vr::VRApplication_Scene ); m_pExtDisplay = vr::VRExtendedDisplay(); m_pChap = vr::VRChaperone(); - if( err != vr::VRInitError_None ) { Msg( "Unable to initialize HMD tracker. Error code %d\n", err ); return false; } + if( !vr::VRCompositor() ) + { + Msg("Compositor initialization failed. See log file for details"); + } + m_pChap->ResetZeroPose(TrackingUniverseSeated); m_bHaveValidPose = false; diff --git a/sourcevr/wscript b/sourcevr/wscript index e66089e18..e930c29b1 100755 --- a/sourcevr/wscript +++ b/sourcevr/wscript @@ -15,6 +15,7 @@ def configure(conf): conf.env.append_unique('DEFINES',['strncpy=use_Q_strncpy_instead', '_snprintf=use_Q_snprintf_instead','SOURCEVR_DLL']) conf.check_cfg(package='openvr', uselib_store='OPENVR', args=['--cflags', '--libs']) + conf.check(lib='GL', uselib_store='GL') def build(bld): source = [ @@ -30,7 +31,7 @@ def build(bld): defines = [] - libs = ['tier0','tier1','tier2', 'tier3','vstdlib','mathlib','OPENVR'] + libs = ['tier0','tier1','tier2', 'tier3','vstdlib','mathlib','OPENVR', 'GL'] install_path = bld.env.LIBDIR