151 lines
4.7 KiB
C++
151 lines
4.7 KiB
C++
#pragma once
|
|
|
|
#include "OpenGLRenderPass.h"
|
|
#include "OpenGLRenderPipeline.h"
|
|
#include "OpenGLRenderer.h"
|
|
#include "OpenGLShaderPrograms.h"
|
|
#include "RenderStateComposer.h"
|
|
#include "HealthTelemetry.h"
|
|
#include "RuntimeCoordinator.h"
|
|
#include "RuntimeSnapshotProvider.h"
|
|
|
|
#include <windows.h>
|
|
|
|
#include <cstdint>
|
|
#include <chrono>
|
|
#include <functional>
|
|
#include <map>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
class ShaderBuildQueue;
|
|
|
|
class RenderEngine
|
|
{
|
|
public:
|
|
using RenderEffectCallback = std::function<void()>;
|
|
using ScreenshotCallback = std::function<void()>;
|
|
using PreviewPaintCallback = std::function<void()>;
|
|
|
|
struct OscOverlayUpdate
|
|
{
|
|
std::string routeKey;
|
|
std::string layerKey;
|
|
std::string parameterKey;
|
|
JsonValue targetValue;
|
|
};
|
|
|
|
struct OscOverlayCommitCompletion
|
|
{
|
|
std::string routeKey;
|
|
uint64_t generation = 0;
|
|
};
|
|
|
|
struct OscOverlayCommitRequest
|
|
{
|
|
std::string routeKey;
|
|
std::string layerKey;
|
|
std::string parameterKey;
|
|
JsonValue value;
|
|
uint64_t generation = 0;
|
|
};
|
|
|
|
struct PreparedShaderBuildApplyResult
|
|
{
|
|
bool hadReadyBuild = false;
|
|
bool applied = false;
|
|
std::string errorMessage;
|
|
};
|
|
|
|
RenderEngine(
|
|
RuntimeSnapshotProvider& runtimeSnapshotProvider,
|
|
HealthTelemetry& healthTelemetry,
|
|
CRITICAL_SECTION& mutex,
|
|
HDC hdc,
|
|
HGLRC hglrc,
|
|
RenderEffectCallback renderEffect,
|
|
ScreenshotCallback screenshotReady,
|
|
PreviewPaintCallback previewPaint);
|
|
~RenderEngine();
|
|
|
|
bool CompileDecodeShader(int errorMessageSize, char* errorMessage);
|
|
bool CompileOutputPackShader(int errorMessageSize, char* errorMessage);
|
|
bool InitializeResources(
|
|
unsigned inputFrameWidth,
|
|
unsigned inputFrameHeight,
|
|
unsigned captureTextureWidth,
|
|
unsigned outputFrameWidth,
|
|
unsigned outputFrameHeight,
|
|
unsigned outputPackTextureWidth,
|
|
std::string& error);
|
|
bool CompileLayerPrograms(unsigned inputFrameWidth, unsigned inputFrameHeight, int errorMessageSize, char* errorMessage);
|
|
bool CommitPreparedLayerPrograms(const PreparedShaderBuild& preparedBuild, unsigned inputFrameWidth, unsigned inputFrameHeight, int errorMessageSize, char* errorMessage);
|
|
bool ApplyPreparedShaderBuild(
|
|
const PreparedShaderBuild& preparedBuild,
|
|
unsigned inputFrameWidth,
|
|
unsigned inputFrameHeight,
|
|
bool preserveFeedbackState,
|
|
int errorMessageSize,
|
|
char* errorMessage);
|
|
PreparedShaderBuildApplyResult TryApplyReadyShaderBuild(
|
|
ShaderBuildQueue& shaderBuildQueue,
|
|
unsigned inputFrameWidth,
|
|
unsigned inputFrameHeight,
|
|
bool preserveFeedbackState);
|
|
|
|
const std::vector<RuntimeRenderState>& CommittedLayerStates() const;
|
|
void ResetTemporalHistoryState();
|
|
void ResetShaderFeedbackState();
|
|
void ApplyRuntimeCoordinatorRenderReset(RuntimeCoordinatorRenderResetScope resetScope);
|
|
void ClearOscOverlayState();
|
|
void UpdateOscOverlayState(
|
|
const std::vector<OscOverlayUpdate>& updates,
|
|
const std::vector<OscOverlayCommitCompletion>& completedCommits);
|
|
void ResizeView(int width, int height);
|
|
bool TryPresentPreview(bool force, unsigned previewFps, unsigned outputFrameWidth, unsigned outputFrameHeight);
|
|
bool TryUploadInputFrame(const VideoIOFrame& inputFrame, const VideoIOState& videoState);
|
|
bool RenderOutputFrame(const RenderPipelineFrameContext& context, VideoIOOutputFrame& outputFrame);
|
|
bool ResolveRenderLayerStates(
|
|
bool useCommittedLayerStates,
|
|
unsigned renderWidth,
|
|
unsigned renderHeight,
|
|
double oscSmoothing,
|
|
std::vector<OscOverlayCommitRequest>* commitRequests,
|
|
std::vector<RuntimeRenderState>& layerStates);
|
|
void RenderLayerStack(
|
|
bool hasInputSource,
|
|
const std::vector<RuntimeRenderState>& layerStates,
|
|
unsigned inputFrameWidth,
|
|
unsigned inputFrameHeight,
|
|
unsigned captureTextureWidth,
|
|
VideoIOPixelFormat inputPixelFormat,
|
|
unsigned historyCap);
|
|
bool ReadOutputFrameRgba(unsigned width, unsigned height, std::vector<unsigned char>& bottomUpPixels);
|
|
bool CaptureOutputFrameRgbaTopDown(unsigned width, unsigned height, std::vector<unsigned char>& topDownPixels);
|
|
|
|
private:
|
|
OpenGLRenderer mRenderer;
|
|
OpenGLRenderPass mRenderPass;
|
|
OpenGLRenderPipeline mRenderPipeline;
|
|
OpenGLShaderPrograms mShaderPrograms;
|
|
RuntimeSnapshotProvider& mRuntimeSnapshotProvider;
|
|
CRITICAL_SECTION& mMutex;
|
|
HDC mHdc;
|
|
HGLRC mHglrc;
|
|
|
|
std::vector<RuntimeRenderState> ComposeRenderLayerStates(
|
|
const std::vector<RuntimeRenderState>& baseStates,
|
|
bool allowCommit,
|
|
double smoothing,
|
|
std::vector<OscOverlayCommitRequest>* commitRequests);
|
|
|
|
std::vector<RuntimeRenderState> mCachedLayerRenderStates;
|
|
uint64_t mCachedRenderStateVersion = 0;
|
|
uint64_t mCachedParameterStateVersion = 0;
|
|
unsigned mCachedRenderStateWidth = 0;
|
|
unsigned mCachedRenderStateHeight = 0;
|
|
std::chrono::steady_clock::time_point mLastPreviewPresentTime;
|
|
RenderStateComposer mRenderStateComposer;
|
|
RuntimeLiveState mRuntimeLiveState;
|
|
};
|