10# error "GHOST_XrGraphcisBindingD3D can only be compiled on Windows platforms."
21 bool expects_srgb_buffer,
22 DXGI_FORMAT &r_dx_format)
24 r_dx_format = DXGI_FORMAT_UNKNOWN;
26 switch (ghost_format) {
27 case GHOST_kXrSwapchainFormatRGBA8:
28 r_dx_format = expects_srgb_buffer ? DXGI_FORMAT_R8G8B8A8_UNORM_SRGB :
29 DXGI_FORMAT_R8G8B8A8_UNORM;
31 case GHOST_kXrSwapchainFormatRGBA16:
32 r_dx_format = DXGI_FORMAT_R16G16B16A16_UNORM;
34 case GHOST_kXrSwapchainFormatRGBA16F:
35 r_dx_format = DXGI_FORMAT_R16G16B16A16_FLOAT;
37 case GHOST_kXrSwapchainFormatRGB10_A2:
38 r_dx_format = DXGI_FORMAT_R10G10B10A2_UNORM;
42 if (r_dx_format == DXGI_FORMAT_UNKNOWN) {
48 const std::vector<int64_t> &gpu_binding_formats,
const std::vector<int64_t> &runtime_formats)
50 if (gpu_binding_formats.empty()) {
54 auto res = std::find_first_of(gpu_binding_formats.begin(),
55 gpu_binding_formats.end(),
56 runtime_formats.begin(),
57 runtime_formats.end());
58 if (res == gpu_binding_formats.end()) {
84 std::string *r_requirement_info)
const
86 static PFN_xrGetD3D11GraphicsRequirementsKHR s_xrGetD3D11GraphicsRequirementsKHR_fn =
nullptr;
88 XrGraphicsRequirementsD3D11KHR gpu_requirements = {XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR};
96 s_xrGetD3D11GraphicsRequirementsKHR_fn =
nullptr;
98 if (!s_xrGetD3D11GraphicsRequirementsKHR_fn &&
100 xrGetInstanceProcAddr(instance,
101 "xrGetD3D11GraphicsRequirementsKHR",
102 (PFN_xrVoidFunction *)&s_xrGetD3D11GraphicsRequirementsKHR_fn)))
104 s_xrGetD3D11GraphicsRequirementsKHR_fn =
nullptr;
108 s_xrGetD3D11GraphicsRequirementsKHR_fn(instance, system_id, &gpu_requirements);
110 if (r_requirement_info) {
111 std::ostringstream strstream;
112 strstream <<
"Minimum DirectX 11 Feature Level " << gpu_requirements.minFeatureLevel
115 *r_requirement_info = strstream.str();
118 return ghost_d3d_ctx_->device_->GetFeatureLevel() >= gpu_requirements.minFeatureLevel;
127 oxr_binding.d3d11.type = XR_TYPE_GRAPHICS_BINDING_D3D11_KHR;
132 const std::vector<int64_t> &runtime_formats,
133 GHOST_TXrSwapchainFormat &r_format,
134 bool &r_is_srgb_format)
const
136 std::vector<int64_t> gpu_binding_formats = {
139 DXGI_FORMAT_R10G10B10A2_UNORM,
140 DXGI_FORMAT_R16G16B16A16_UNORM,
142 DXGI_FORMAT_R16G16B16A16_FLOAT,
144 DXGI_FORMAT_R10G10B10A2_UNORM,
145 DXGI_FORMAT_R16G16B16A16_UNORM,
147 DXGI_FORMAT_R8G8B8A8_UNORM,
148 DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
155 case DXGI_FORMAT_R10G10B10A2_UNORM:
156 r_format = GHOST_kXrSwapchainFormatRGB10_A2;
158 case DXGI_FORMAT_R16G16B16A16_UNORM:
159 r_format = GHOST_kXrSwapchainFormatRGBA16;
161 case DXGI_FORMAT_R16G16B16A16_FLOAT:
162 r_format = GHOST_kXrSwapchainFormatRGBA16F;
164 case DXGI_FORMAT_R8G8B8A8_UNORM:
165 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
166 r_format = GHOST_kXrSwapchainFormatRGBA8;
169 r_is_srgb_format = (*
result == DXGI_FORMAT_R8G8B8A8_UNORM_SRGB);
172 r_format = GHOST_kXrSwapchainFormatRGBA8;
173 r_is_srgb_format =
false;
180 uint32_t image_count)
182 std::vector<XrSwapchainImageD3D11KHR> d3d_images(image_count);
183 std::vector<XrSwapchainImageBaseHeader *> base_images;
187 for (XrSwapchainImageD3D11KHR &image : d3d_images) {
188 image.type = XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR;
189 base_images.push_back(
reinterpret_cast<XrSwapchainImageBaseHeader *
>(&image));
217 if (shared_resource_) {
219 shared_resource_ =
nullptr;
224 XrSwapchainImageBaseHeader &swapchain_image,
const GHOST_XrDrawViewInfo &draw_info)
226 XrSwapchainImageD3D11KHR &d3d_swapchain_image =
reinterpret_cast<XrSwapchainImageD3D11KHR &
>(
236 ID3D11RenderTargetView *rtv;
237 CD3D11_RENDER_TARGET_VIEW_DESC rtv_desc(D3D11_RTV_DIMENSION_TEXTURE2D,
238 DXGI_FORMAT_R8G8B8A8_UNORM);
240 ghost_ctx_->device_->CreateRenderTargetView(d3d_swapchain_image.texture, &rtv_desc, &rtv);
241 if (!shared_resource_) {
244 shared_resource_ = ghost_ctx_->createSharedOpenGLResource(
245 draw_info.width, draw_info.height,
format, rtv);
247 ghost_ctx_->blitFromOpenGLContext(shared_resource_, draw_info.width, draw_info.height);
249 if (!shared_resource_) {
253 draw_info.width, draw_info.height,
format);
255 ghost_d3d_ctx_->blitFromOpenGLContext(shared_resource_, draw_info.width, draw_info.height);
257 ghost_d3d_ctx_->device_ctx_->OMSetRenderTargets(0,
nullptr,
nullptr);
258 ghost_d3d_ctx_->device_ctx_->CopyResource(d3d_swapchain_image.texture,
265#ifdef WITH_VULKAN_BACKEND
271GHOST_XrGraphicsBindingVulkanD3D::GHOST_XrGraphicsBindingVulkanD3D(
GHOST_Context &ghost_ctx)
277GHOST_XrGraphicsBindingVulkanD3D::~GHOST_XrGraphicsBindingVulkanD3D() {}
279void GHOST_XrGraphicsBindingVulkanD3D::submitToSwapchainImage(
280 XrSwapchainImageBaseHeader &swapchain_image,
const GHOST_XrDrawViewInfo &draw_info)
282 XrSwapchainImageD3D11KHR &d3d_swapchain_image =
reinterpret_cast<XrSwapchainImageD3D11KHR &
>(
285 VkDeviceSize component_size = 4 *
sizeof(
uint8_t);
286 if (draw_info.swapchain_format == GHOST_kXrSwapchainFormatRGBA16F ||
287 draw_info.swapchain_format == GHOST_kXrSwapchainFormatRGBA16)
289 component_size = 4 *
sizeof(
uint16_t);
292 ID3D11Device *d3d_device = ghost_d3d_ctx_->device_;
293 ID3D11DeviceContext *d3d_device_ctx = ghost_d3d_ctx_->device_ctx_;
298 GHOST_VulkanOpenXRData openxr_data = {GHOST_kVulkanXRModeCPU};
299 ghost_ctx_.openxr_acquire_framebuffer_image_callback_(&openxr_data);
302 D3D11_TEXTURE2D_DESC desc;
303 desc.Width = openxr_data.extent.width;
304 desc.Height = openxr_data.extent.height;
308 desc.SampleDesc.Count = 1;
309 desc.SampleDesc.Quality = 0;
310 desc.Usage = D3D11_USAGE_IMMUTABLE;
311 desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
312 desc.CPUAccessFlags = 0;
315 D3D11_SUBRESOURCE_DATA
data;
316 data.pSysMem = openxr_data.cpu.image_data;
317 data.SysMemPitch = component_size * openxr_data.extent.width;
318 data.SysMemSlicePitch = 0;
320 ID3D11Texture2D *
texture =
nullptr;
321 d3d_device->CreateTexture2D(&desc, &
data, &
texture);
324 d3d_device_ctx->CopySubresourceRegion(
325 d3d_swapchain_image.texture, 0, draw_info.ofsx, draw_info.ofsy, 0,
texture, 0,
nullptr);
331 ghost_ctx_.openxr_release_framebuffer_image_callback_(&openxr_data);
static std::optional< int64_t > choose_swapchain_format_from_candidates(const std::vector< int64_t > &gpu_binding_formats, const std::vector< int64_t > &runtime_formats)
static void ghost_format_to_dx_format(GHOST_TXrSwapchainFormat ghost_format, bool expects_srgb_buffer, DXGI_FORMAT &r_dx_format)
BMesh const char void * data
GHOST_IXrGraphicsBinding()=default
union GHOST_IXrGraphicsBinding::@316344103261324226161313226323037304250053225267 oxr_binding
static GHOST_ContextD3D * createOffscreenContextD3D()
static GHOST_TSuccess disposeContextD3D(GHOST_ContextD3D *context)
bool checkVersionRequirements(GHOST_Context &ghost_ctx, XrInstance instance, XrSystemId system_id, std::string *r_requirement_info) const override
std::list< std::vector< XrSwapchainImageD3D11KHR > > image_cache_
std::optional< int64_t > chooseSwapchainFormat(const std::vector< int64_t > &runtime_formats, GHOST_TXrSwapchainFormat &r_format, bool &r_is_srgb_format) const override
~GHOST_XrGraphicsBindingD3D() override
std::vector< XrSwapchainImageBaseHeader * > createSwapchainImages(uint32_t image_count) override
bool needsUpsideDownDrawing(GHOST_Context &ghost_ctx) const override
void initFromGhostContext(GHOST_Context &ghost_ctx, XrInstance instance, XrSystemId system_id) override
GHOST_ContextD3D * ghost_d3d_ctx_
GHOST_XrGraphicsBindingD3D()
~GHOST_XrGraphicsBindingOpenGLD3D()
GHOST_XrGraphicsBindingOpenGLD3D(GHOST_Context &ghost_ctx)
void submitToSwapchainImage(XrSwapchainImageBaseHeader &swapchain_image, const GHOST_XrDrawViewInfo &draw_info) override
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET