Header: rive/renderer/d3d12/render_context_d3d12_impl.hpp#include "rive/renderer/d3d12/render_context_d3d12_impl.hpp"
using namespace rive::gpu;
ComPtr<ID3D12Device> device;
ComPtr<ID3D12GraphicsCommandList> initList; // recording state
D3DContextOptions options;
std::unique_ptr<RenderContext> rc =
RenderContextD3D12Impl::MakeContext(device, initList.Get(), options);
auto* impl = rc->static_impl_cast<RenderContextD3D12Impl>();
rcp<RenderTargetD3D12> target = impl->makeRenderTarget(width, height);
Each frame, populate RenderContext::FlushResources::externalCommandBuffer
with the ID3D12GraphicsCommandList that should record Rive’s draws, and
bump currentFrameNumber / safeFrameNumber so the renderer can recycle
buffers safely against your fence values.The init command list passed to MakeContext must be in the recording
state. The renderer uses it to upload static buffers. Submit it (and wait
for the GPU to finish) before issuing any frames.
Header: rive/renderer/vulkan/render_context_vulkan_impl.hpp#include "rive/renderer/vulkan/render_context_vulkan_impl.hpp"
using namespace rive::gpu;
VulkanFeatures features;
features.independentBlend = true; // detected from device features
// ... fill out from VkPhysicalDeviceFeatures ...
std::unique_ptr<RenderContext> rc =
RenderContextVulkanImpl::MakeContext(
instance,
physicalDevice,
device,
features,
vkGetInstanceProcAddr);
Each frame:
- Set
FlushResources::externalCommandBuffer to a recording
VkCommandBuffer.
- Set
FlushResources::currentFrameNumber to the frame index you’ll signal,
and safeFrameNumber to the most recent frame whose fence you’ve waited on.
Vulkan is the only backend that supports FrameDescriptor::virtualTileWidth
/ virtualTileHeight (frame splitting), useful for letting other
workloads pre-empt Rive on tiled GPUs.