Skip to content

Commit 08c783e

Browse files
jc3265AndyHovingh
authored andcommitted
Pass extent for non headless
1 parent ce5c6e3 commit 08c783e

File tree

3 files changed

+28
-29
lines changed

3 files changed

+28
-29
lines changed

filament/backend/src/webgpu/WebGPUDriver.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,11 +1154,11 @@ void WebGPUDriver::makeCurrent(Handle<HwSwapChain> drawSch, Handle<HwSwapChain>
11541154
auto swapChain = handleCast<WebGPUSwapChain>(drawSch);
11551155
mSwapChain = swapChain;
11561156
assert_invariant(mSwapChain);
1157-
if(!mSwapChain->isHeadless()){
1158-
wgpu::Extent2D extent = mPlatform.getSurfaceExtent(mNativeWindow);
1159-
mTextureView = mSwapChain->getCurrentTextureView(extent);
1157+
1158+
if (mSwapChain->isHeadless()) {
1159+
mTextureView = mSwapChain->getNextTextureView();
11601160
} else {
1161-
mTextureView = mSwapChain->getCurrentHeadlessTextureView();
1161+
mTextureView = mSwapChain->getNextTextureView(mPlatform.getSurfaceExtent(mNativeWindow));
11621162
}
11631163

11641164
assert_invariant(mTextureView);
@@ -1251,7 +1251,7 @@ void WebGPUDriver::readPixels(Handle<HwRenderTarget> sourceRenderTargetHandle, c
12511251
wgpu::Texture srcTexture = nullptr;
12521252
if (srcTarget->isDefaultRenderTarget()) {
12531253
assert_invariant(mSwapChain);
1254-
srcTexture = mSwapChain->getCurrentTexture(mPlatform.getSurfaceExtent(mNativeWindow));
1254+
srcTexture = mSwapChain->getCurrentTexture();
12551255
} else {
12561256
// Handle custom render targets. Read from the first color attachment.
12571257
const auto& colorAttachmentInfos = srcTarget->getColorAttachmentInfos();

filament/backend/src/webgpu/WebGPUSwapChain.cpp

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ void initConfig(wgpu::SurfaceConfiguration& config, wgpu::Device const& device,
187187
wgpu::SurfaceCapabilities const& capabilities, wgpu::Extent2D const& extent,
188188
bool useSRGBColorSpace) {
189189
config.device = device;
190-
config.usage = wgpu::TextureUsage::RenderAttachment;
190+
config.usage = wgpu::TextureUsage::RenderAttachment | wgpu::TextureUsage::CopySrc;
191191
config.width = extent.width;
192192
config.height = extent.height;
193193
config.format = selectColorFormat(capabilities.formatCount, capabilities.formats, useSRGBColorSpace);
@@ -352,47 +352,45 @@ void WebGPUSwapChain::setExtent(wgpu::Extent2D const& currentSurfaceSize) {
352352
}
353353
}
354354

355-
wgpu::TextureView WebGPUSwapChain::getCurrentTextureView( wgpu::Extent2D const& extent) {
355+
wgpu::TextureView WebGPUSwapChain::getNextTextureView() {
356+
assert_invariant(isHeadless());
357+
358+
mHeadlessBufferIndex = (mHeadlessBufferIndex + 1) % mHeadlessBufferCount;
359+
return mRenderTargetViews[mHeadlessBufferIndex];
360+
}
361+
362+
wgpu::TextureView WebGPUSwapChain::getNextTextureView( wgpu::Extent2D const& extent) {
356363
setExtent(extent);
357-
wgpu::SurfaceTexture surfaceTexture;
358-
mSurface.GetCurrentTexture(&surfaceTexture);
359-
if (surfaceTexture.status != wgpu::SurfaceGetCurrentTextureStatus::SuccessOptimal) {
364+
365+
mSurface.GetCurrentTexture(&mCurrentTexture);
366+
if (mCurrentTexture.status != wgpu::SurfaceGetCurrentTextureStatus::SuccessOptimal) {
360367
return nullptr;
361368
}
362369

363370
// TODO: review these initializations as webgpu pipeline gets mature
364371
wgpu::TextureViewDescriptor textureViewDescriptor = {
365372
.label = "surface_texture_view",
366-
.format = surfaceTexture.texture.GetFormat(),
373+
.format = mCurrentTexture.texture.GetFormat(),
367374
.dimension = wgpu::TextureViewDimension::e2D,
368375
.baseMipLevel = 0,
369376
.mipLevelCount = 1,
370377
.baseArrayLayer = 0,
371378
.arrayLayerCount = 1
372379
};
373-
return surfaceTexture.texture.CreateView(&textureViewDescriptor);
380+
return mCurrentTexture.texture.CreateView(&textureViewDescriptor);
374381
}
375382

376-
wgpu::Texture WebGPUSwapChain::getCurrentTexture(wgpu::Extent2D const& extent) {
383+
wgpu::Texture WebGPUSwapChain::getCurrentTexture() {
377384
if (isHeadless()) {
378385
return mRenderTargetTextures[mHeadlessBufferIndex];
379386
}
380-
// We should return the actual texture that was in use, but we don't keep a direct handle to it.
381-
// The non-headless case for this isn't currently relevant (Since this is only used by headless
382-
// rendering captured by readPixels), but if we need it this can be done in the future
383-
FILAMENT_CHECK_POSTCONDITION(false)
384-
<< "getCurrentTexture is not implemented for non-headless mode.";
385-
return nullptr;
386-
}
387+
// We return the texture that was in use
388+
return mCurrentTexture.texture;
387389

388-
wgpu::TextureView WebGPUSwapChain::getCurrentHeadlessTextureView() {
389-
return mRenderTargetViews[mHeadlessBufferIndex];
390390
}
391391

392392
void WebGPUSwapChain::present() {
393-
if (isHeadless()) {
394-
mHeadlessBufferIndex = (mHeadlessBufferIndex + 1) % mHeadlessBufferCount;
395-
} else {
393+
if (!isHeadless()) {
396394
mSurface.Present();
397395
}
398396
}

filament/backend/src/webgpu/WebGPUSwapChain.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,10 @@ class WebGPUSwapChain final : public Platform::SwapChain, HwSwapChain {
4040

4141
[[nodiscard]] wgpu::TextureFormat getDepthFormat() const { return mDepthFormat; }
4242

43-
[[nodiscard]] wgpu::TextureView getCurrentTextureView(wgpu::Extent2D const& extent);
44-
[[nodiscard]] wgpu::TextureView getCurrentHeadlessTextureView();
45-
[[nodiscard]] wgpu::Texture getCurrentTexture(wgpu::Extent2D const& extent);
43+
[[nodiscard]] wgpu::TextureView getNextTextureView();
44+
[[nodiscard]] wgpu::TextureView getNextTextureView(wgpu::Extent2D const& extent);
45+
46+
[[nodiscard]] wgpu::Texture getCurrentTexture();
4647

4748
[[nodiscard]] wgpu::TextureView getDepthTextureView() const { return mDepthTextureView; }
4849

@@ -69,7 +70,7 @@ class WebGPUSwapChain final : public Platform::SwapChain, HwSwapChain {
6970
const SwapChainType mType;
7071
const uint32_t mHeadlessWidth;
7172
const uint32_t mHeadlessHeight;
72-
73+
wgpu::SurfaceTexture mCurrentTexture;
7374
static constexpr uint32_t mHeadlessBufferCount = 3;
7475
uint8_t mHeadlessBufferIndex = 0;
7576
std::array<wgpu::Texture, mHeadlessBufferCount> mRenderTargetTextures;

0 commit comments

Comments
 (0)