| /* | |
| * Copyright 2025 Rive | |
| */ | |
| #include "offscreen_render_target.hpp" | |
| #if !defined(RIVE_WEBGPU) && !defined(RIVE_DAWN) | |
| namespace rive_tests | |
| { | |
| rive::rcp<OffscreenRenderTarget> OffscreenRenderTarget::MakeWebGPU( | |
| rive::gpu::RenderContextWebGPUImpl*, | |
| uint32_t width, | |
| uint32_t height) | |
| { | |
| return nullptr; | |
| } | |
| } // namespace rive_tests | |
| #else | |
| #include "rive/renderer/rive_render_image.hpp" | |
| #include "rive/renderer/webgpu/render_context_webgpu_impl.hpp" | |
| #ifdef RIVE_WAGYU | |
| #include <webgpu/webgpu_wagyu.h> | |
| #endif | |
| namespace rive_tests | |
| { | |
| class OffscreenRenderTargetWebGPU : public rive_tests::OffscreenRenderTarget | |
| { | |
| public: | |
| OffscreenRenderTargetWebGPU(rive::gpu::RenderContextWebGPUImpl* impl, | |
| wgpu::TextureFormat format, | |
| uint32_t width, | |
| uint32_t height) : | |
| m_textureTarget( | |
| rive::make_rcp<TextureTarget>(impl, format, width, height)) | |
| {} | |
| rive::RenderImage* asRenderImage() override | |
| { | |
| return m_textureTarget->renderImage(); | |
| } | |
| rive::gpu::RenderTarget* asRenderTarget() override | |
| { | |
| return m_textureTarget.get(); | |
| } | |
| private: | |
| class TextureTarget : public rive::gpu::RenderTargetWebGPU | |
| { | |
| public: | |
| TextureTarget(rive::gpu::RenderContextWebGPUImpl* impl, | |
| wgpu::TextureFormat format, | |
| uint32_t width, | |
| uint32_t height) : | |
| RenderTargetWebGPU(impl->device(), | |
| impl->platformFeatures(), | |
| impl->capabilities(), | |
| format, | |
| width, | |
| height) | |
| { | |
| wgpu::TextureDescriptor textureDesc = { | |
| .usage = wgpu::TextureUsage::TextureBinding | | |
| wgpu::TextureUsage::RenderAttachment | | |
| wgpu::TextureUsage::CopySrc, | |
| .dimension = wgpu::TextureDimension::e2D, | |
| .size = {width, height}, | |
| .format = format, | |
| }; | |
| #ifdef RIVE_WAGYU | |
| if (impl->capabilities().plsType == | |
| rive::gpu::RenderContextWebGPUImpl::PixelLocalStorageType:: | |
| VK_EXT_rasterization_order_attachment_access) | |
| { | |
| textureDesc.usage |= static_cast<wgpu::TextureUsage>( | |
| WGPUTextureUsage_WagyuInputAttachment); | |
| } | |
| #endif | |
| auto texture = rive::make_rcp<rive::gpu::TextureWebGPUImpl>( | |
| width, | |
| height, | |
| impl->device().CreateTexture(&textureDesc)); | |
| setTargetTextureView(texture->textureView(), texture->texture()); | |
| m_renderImage = | |
| rive::make_rcp<rive::RiveRenderImage>(std::move(texture)); | |
| } | |
| rive::RiveRenderImage* renderImage() const | |
| { | |
| return m_renderImage.get(); | |
| } | |
| private: | |
| rive::rcp<rive::RiveRenderImage> m_renderImage; | |
| }; | |
| rive::rcp<TextureTarget> m_textureTarget; | |
| }; | |
| rive::rcp<OffscreenRenderTarget> OffscreenRenderTarget::MakeWebGPU( | |
| rive::gpu::RenderContextWebGPUImpl* impl, | |
| uint32_t width, | |
| uint32_t height) | |
| { | |
| return rive::make_rcp<OffscreenRenderTargetWebGPU>( | |
| impl, | |
| wgpu::TextureFormat::RGBA8Unorm, | |
| width, | |
| height); | |
| } | |
| }; // namespace rive_tests | |
| #endif |