1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2024 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // SurfaceWgpu.cpp:
7*8975f5c5SAndroid Build Coastguard Worker // Implements the class methods for SurfaceWgpu.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/SurfaceWgpu.h"
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Display.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Surface.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/DisplayWgpu.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/FramebufferWgpu.h"
18*8975f5c5SAndroid Build Coastguard Worker
19*8975f5c5SAndroid Build Coastguard Worker namespace rx
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker
22*8975f5c5SAndroid Build Coastguard Worker constexpr wgpu::TextureUsage kSurfaceTextureUsage =
23*8975f5c5SAndroid Build Coastguard Worker wgpu::TextureUsage::TextureBinding | wgpu::TextureUsage::RenderAttachment |
24*8975f5c5SAndroid Build Coastguard Worker wgpu::TextureUsage::CopySrc | wgpu::TextureUsage::CopyDst;
25*8975f5c5SAndroid Build Coastguard Worker
SurfaceWgpu(const egl::SurfaceState & surfaceState)26*8975f5c5SAndroid Build Coastguard Worker SurfaceWgpu::SurfaceWgpu(const egl::SurfaceState &surfaceState) : SurfaceImpl(surfaceState) {}
27*8975f5c5SAndroid Build Coastguard Worker
~SurfaceWgpu()28*8975f5c5SAndroid Build Coastguard Worker SurfaceWgpu::~SurfaceWgpu() {}
29*8975f5c5SAndroid Build Coastguard Worker
createDepthStencilAttachment(uint32_t width,uint32_t height,const webgpu::Format & webgpuFormat,wgpu::Device & device,AttachmentImage * outDepthStencilAttachment)30*8975f5c5SAndroid Build Coastguard Worker angle::Result SurfaceWgpu::createDepthStencilAttachment(uint32_t width,
31*8975f5c5SAndroid Build Coastguard Worker uint32_t height,
32*8975f5c5SAndroid Build Coastguard Worker const webgpu::Format &webgpuFormat,
33*8975f5c5SAndroid Build Coastguard Worker wgpu::Device &device,
34*8975f5c5SAndroid Build Coastguard Worker AttachmentImage *outDepthStencilAttachment)
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker wgpu::TextureDescriptor desc = outDepthStencilAttachment->texture.createTextureDescriptor(
37*8975f5c5SAndroid Build Coastguard Worker kSurfaceTextureUsage, wgpu::TextureDimension::e2D, {width, height, 1},
38*8975f5c5SAndroid Build Coastguard Worker webgpuFormat.getActualWgpuTextureFormat(), 1, 1);
39*8975f5c5SAndroid Build Coastguard Worker
40*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t level = 0;
41*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t layer = 0;
42*8975f5c5SAndroid Build Coastguard Worker
43*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(outDepthStencilAttachment->texture.initImage(webgpuFormat.getIntendedFormatID(),
44*8975f5c5SAndroid Build Coastguard Worker webgpuFormat.getActualImageFormatID(),
45*8975f5c5SAndroid Build Coastguard Worker device, gl::LevelIndex(level), desc));
46*8975f5c5SAndroid Build Coastguard Worker
47*8975f5c5SAndroid Build Coastguard Worker wgpu::TextureView view;
48*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(
49*8975f5c5SAndroid Build Coastguard Worker outDepthStencilAttachment->texture.createTextureView(gl::LevelIndex(level), layer, view));
50*8975f5c5SAndroid Build Coastguard Worker outDepthStencilAttachment->renderTarget.set(
51*8975f5c5SAndroid Build Coastguard Worker &outDepthStencilAttachment->texture, view, webgpu::LevelIndex(level), layer,
52*8975f5c5SAndroid Build Coastguard Worker outDepthStencilAttachment->texture.toWgpuTextureFormat());
53*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
54*8975f5c5SAndroid Build Coastguard Worker }
55*8975f5c5SAndroid Build Coastguard Worker
OffscreenSurfaceWgpu(const egl::SurfaceState & surfaceState)56*8975f5c5SAndroid Build Coastguard Worker OffscreenSurfaceWgpu::OffscreenSurfaceWgpu(const egl::SurfaceState &surfaceState)
57*8975f5c5SAndroid Build Coastguard Worker : SurfaceWgpu(surfaceState),
58*8975f5c5SAndroid Build Coastguard Worker mWidth(surfaceState.attributes.getAsInt(EGL_WIDTH, 0)),
59*8975f5c5SAndroid Build Coastguard Worker mHeight(surfaceState.attributes.getAsInt(EGL_HEIGHT, 0))
60*8975f5c5SAndroid Build Coastguard Worker {}
61*8975f5c5SAndroid Build Coastguard Worker
~OffscreenSurfaceWgpu()62*8975f5c5SAndroid Build Coastguard Worker OffscreenSurfaceWgpu::~OffscreenSurfaceWgpu() {}
63*8975f5c5SAndroid Build Coastguard Worker
initialize(const egl::Display * display)64*8975f5c5SAndroid Build Coastguard Worker egl::Error OffscreenSurfaceWgpu::initialize(const egl::Display *display)
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker return angle::ResultToEGL(initializeImpl(display));
67*8975f5c5SAndroid Build Coastguard Worker }
68*8975f5c5SAndroid Build Coastguard Worker
swap(const gl::Context * context)69*8975f5c5SAndroid Build Coastguard Worker egl::Error OffscreenSurfaceWgpu::swap(const gl::Context *context)
70*8975f5c5SAndroid Build Coastguard Worker {
71*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
72*8975f5c5SAndroid Build Coastguard Worker return egl::NoError();
73*8975f5c5SAndroid Build Coastguard Worker }
74*8975f5c5SAndroid Build Coastguard Worker
bindTexImage(const gl::Context * context,gl::Texture * texture,EGLint buffer)75*8975f5c5SAndroid Build Coastguard Worker egl::Error OffscreenSurfaceWgpu::bindTexImage(const gl::Context *context,
76*8975f5c5SAndroid Build Coastguard Worker gl::Texture *texture,
77*8975f5c5SAndroid Build Coastguard Worker EGLint buffer)
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker UNIMPLEMENTED();
80*8975f5c5SAndroid Build Coastguard Worker return egl::NoError();
81*8975f5c5SAndroid Build Coastguard Worker }
82*8975f5c5SAndroid Build Coastguard Worker
releaseTexImage(const gl::Context * context,EGLint buffer)83*8975f5c5SAndroid Build Coastguard Worker egl::Error OffscreenSurfaceWgpu::releaseTexImage(const gl::Context *context, EGLint buffer)
84*8975f5c5SAndroid Build Coastguard Worker {
85*8975f5c5SAndroid Build Coastguard Worker UNIMPLEMENTED();
86*8975f5c5SAndroid Build Coastguard Worker return egl::NoError();
87*8975f5c5SAndroid Build Coastguard Worker }
88*8975f5c5SAndroid Build Coastguard Worker
setSwapInterval(const egl::Display * display,EGLint interval)89*8975f5c5SAndroid Build Coastguard Worker void OffscreenSurfaceWgpu::setSwapInterval(const egl::Display *display, EGLint interval) {}
90*8975f5c5SAndroid Build Coastguard Worker
getWidth() const91*8975f5c5SAndroid Build Coastguard Worker EGLint OffscreenSurfaceWgpu::getWidth() const
92*8975f5c5SAndroid Build Coastguard Worker {
93*8975f5c5SAndroid Build Coastguard Worker return mWidth;
94*8975f5c5SAndroid Build Coastguard Worker }
95*8975f5c5SAndroid Build Coastguard Worker
getHeight() const96*8975f5c5SAndroid Build Coastguard Worker EGLint OffscreenSurfaceWgpu::getHeight() const
97*8975f5c5SAndroid Build Coastguard Worker {
98*8975f5c5SAndroid Build Coastguard Worker return mHeight;
99*8975f5c5SAndroid Build Coastguard Worker }
100*8975f5c5SAndroid Build Coastguard Worker
getSwapBehavior() const101*8975f5c5SAndroid Build Coastguard Worker EGLint OffscreenSurfaceWgpu::getSwapBehavior() const
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker return EGL_BUFFER_DESTROYED;
104*8975f5c5SAndroid Build Coastguard Worker }
105*8975f5c5SAndroid Build Coastguard Worker
initializeContents(const gl::Context * context,GLenum binding,const gl::ImageIndex & imageIndex)106*8975f5c5SAndroid Build Coastguard Worker angle::Result OffscreenSurfaceWgpu::initializeContents(const gl::Context *context,
107*8975f5c5SAndroid Build Coastguard Worker GLenum binding,
108*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &imageIndex)
109*8975f5c5SAndroid Build Coastguard Worker {
110*8975f5c5SAndroid Build Coastguard Worker UNIMPLEMENTED();
111*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
112*8975f5c5SAndroid Build Coastguard Worker }
113*8975f5c5SAndroid Build Coastguard Worker
attachToFramebuffer(const gl::Context * context,gl::Framebuffer * framebuffer)114*8975f5c5SAndroid Build Coastguard Worker egl::Error OffscreenSurfaceWgpu::attachToFramebuffer(const gl::Context *context,
115*8975f5c5SAndroid Build Coastguard Worker gl::Framebuffer *framebuffer)
116*8975f5c5SAndroid Build Coastguard Worker {
117*8975f5c5SAndroid Build Coastguard Worker UNIMPLEMENTED();
118*8975f5c5SAndroid Build Coastguard Worker return egl::NoError();
119*8975f5c5SAndroid Build Coastguard Worker }
120*8975f5c5SAndroid Build Coastguard Worker
detachFromFramebuffer(const gl::Context * context,gl::Framebuffer * framebuffer)121*8975f5c5SAndroid Build Coastguard Worker egl::Error OffscreenSurfaceWgpu::detachFromFramebuffer(const gl::Context *context,
122*8975f5c5SAndroid Build Coastguard Worker gl::Framebuffer *framebuffer)
123*8975f5c5SAndroid Build Coastguard Worker {
124*8975f5c5SAndroid Build Coastguard Worker UNIMPLEMENTED();
125*8975f5c5SAndroid Build Coastguard Worker return egl::NoError();
126*8975f5c5SAndroid Build Coastguard Worker }
127*8975f5c5SAndroid Build Coastguard Worker
getAttachmentRenderTarget(const gl::Context * context,GLenum binding,const gl::ImageIndex & imageIndex,GLsizei samples,FramebufferAttachmentRenderTarget ** rtOut)128*8975f5c5SAndroid Build Coastguard Worker angle::Result OffscreenSurfaceWgpu::getAttachmentRenderTarget(
129*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context,
130*8975f5c5SAndroid Build Coastguard Worker GLenum binding,
131*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &imageIndex,
132*8975f5c5SAndroid Build Coastguard Worker GLsizei samples,
133*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachmentRenderTarget **rtOut)
134*8975f5c5SAndroid Build Coastguard Worker {
135*8975f5c5SAndroid Build Coastguard Worker if (binding == GL_BACK)
136*8975f5c5SAndroid Build Coastguard Worker {
137*8975f5c5SAndroid Build Coastguard Worker *rtOut = &mColorAttachment.renderTarget;
138*8975f5c5SAndroid Build Coastguard Worker }
139*8975f5c5SAndroid Build Coastguard Worker else
140*8975f5c5SAndroid Build Coastguard Worker {
141*8975f5c5SAndroid Build Coastguard Worker ASSERT(binding == GL_DEPTH || binding == GL_STENCIL || binding == GL_DEPTH_STENCIL);
142*8975f5c5SAndroid Build Coastguard Worker *rtOut = &mDepthStencilAttachment.renderTarget;
143*8975f5c5SAndroid Build Coastguard Worker }
144*8975f5c5SAndroid Build Coastguard Worker
145*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
146*8975f5c5SAndroid Build Coastguard Worker }
147*8975f5c5SAndroid Build Coastguard Worker
initializeImpl(const egl::Display * display)148*8975f5c5SAndroid Build Coastguard Worker angle::Result OffscreenSurfaceWgpu::initializeImpl(const egl::Display *display)
149*8975f5c5SAndroid Build Coastguard Worker {
150*8975f5c5SAndroid Build Coastguard Worker DisplayWgpu *displayWgpu = webgpu::GetImpl(display);
151*8975f5c5SAndroid Build Coastguard Worker wgpu::Device &device = displayWgpu->getDevice();
152*8975f5c5SAndroid Build Coastguard Worker
153*8975f5c5SAndroid Build Coastguard Worker const egl::Config *config = mState.config;
154*8975f5c5SAndroid Build Coastguard Worker
155*8975f5c5SAndroid Build Coastguard Worker if (config->renderTargetFormat != GL_NONE)
156*8975f5c5SAndroid Build Coastguard Worker {
157*8975f5c5SAndroid Build Coastguard Worker const webgpu::Format &webgpuFormat = displayWgpu->getFormat(config->renderTargetFormat);
158*8975f5c5SAndroid Build Coastguard Worker wgpu::TextureDescriptor desc = mColorAttachment.texture.createTextureDescriptor(
159*8975f5c5SAndroid Build Coastguard Worker kSurfaceTextureUsage, wgpu::TextureDimension::e2D,
160*8975f5c5SAndroid Build Coastguard Worker {static_cast<uint32_t>(mWidth), static_cast<uint32_t>(mHeight), 1},
161*8975f5c5SAndroid Build Coastguard Worker webgpuFormat.getActualWgpuTextureFormat(), 1, 1);
162*8975f5c5SAndroid Build Coastguard Worker
163*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t level = 0;
164*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t layer = 0;
165*8975f5c5SAndroid Build Coastguard Worker
166*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(mColorAttachment.texture.initImage(webgpuFormat.getIntendedFormatID(),
167*8975f5c5SAndroid Build Coastguard Worker webgpuFormat.getActualImageFormatID(), device,
168*8975f5c5SAndroid Build Coastguard Worker gl::LevelIndex(level), desc));
169*8975f5c5SAndroid Build Coastguard Worker
170*8975f5c5SAndroid Build Coastguard Worker wgpu::TextureView view;
171*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(mColorAttachment.texture.createTextureView(gl::LevelIndex(level), layer, view));
172*8975f5c5SAndroid Build Coastguard Worker mColorAttachment.renderTarget.set(&mColorAttachment.texture, view,
173*8975f5c5SAndroid Build Coastguard Worker webgpu::LevelIndex(level), layer,
174*8975f5c5SAndroid Build Coastguard Worker mColorAttachment.texture.toWgpuTextureFormat());
175*8975f5c5SAndroid Build Coastguard Worker }
176*8975f5c5SAndroid Build Coastguard Worker
177*8975f5c5SAndroid Build Coastguard Worker if (config->depthStencilFormat != GL_NONE)
178*8975f5c5SAndroid Build Coastguard Worker {
179*8975f5c5SAndroid Build Coastguard Worker const webgpu::Format &webgpuFormat = displayWgpu->getFormat(config->depthStencilFormat);
180*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(createDepthStencilAttachment(static_cast<uint32_t>(mWidth),
181*8975f5c5SAndroid Build Coastguard Worker static_cast<uint32_t>(mHeight), webgpuFormat, device,
182*8975f5c5SAndroid Build Coastguard Worker &mDepthStencilAttachment));
183*8975f5c5SAndroid Build Coastguard Worker }
184*8975f5c5SAndroid Build Coastguard Worker
185*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
186*8975f5c5SAndroid Build Coastguard Worker }
187*8975f5c5SAndroid Build Coastguard Worker
WindowSurfaceWgpu(const egl::SurfaceState & surfaceState,EGLNativeWindowType window)188*8975f5c5SAndroid Build Coastguard Worker WindowSurfaceWgpu::WindowSurfaceWgpu(const egl::SurfaceState &surfaceState,
189*8975f5c5SAndroid Build Coastguard Worker EGLNativeWindowType window)
190*8975f5c5SAndroid Build Coastguard Worker : SurfaceWgpu(surfaceState), mNativeWindow(window)
191*8975f5c5SAndroid Build Coastguard Worker {}
192*8975f5c5SAndroid Build Coastguard Worker
~WindowSurfaceWgpu()193*8975f5c5SAndroid Build Coastguard Worker WindowSurfaceWgpu::~WindowSurfaceWgpu() {}
194*8975f5c5SAndroid Build Coastguard Worker
initialize(const egl::Display * display)195*8975f5c5SAndroid Build Coastguard Worker egl::Error WindowSurfaceWgpu::initialize(const egl::Display *display)
196*8975f5c5SAndroid Build Coastguard Worker {
197*8975f5c5SAndroid Build Coastguard Worker return angle::ResultToEGL(initializeImpl(display));
198*8975f5c5SAndroid Build Coastguard Worker }
199*8975f5c5SAndroid Build Coastguard Worker
destroy(const egl::Display * display)200*8975f5c5SAndroid Build Coastguard Worker void WindowSurfaceWgpu::destroy(const egl::Display *display)
201*8975f5c5SAndroid Build Coastguard Worker {
202*8975f5c5SAndroid Build Coastguard Worker mSurface = nullptr;
203*8975f5c5SAndroid Build Coastguard Worker mColorAttachment.renderTarget.reset();
204*8975f5c5SAndroid Build Coastguard Worker mColorAttachment.texture.resetImage();
205*8975f5c5SAndroid Build Coastguard Worker mDepthStencilAttachment.renderTarget.reset();
206*8975f5c5SAndroid Build Coastguard Worker mDepthStencilAttachment.texture.resetImage();
207*8975f5c5SAndroid Build Coastguard Worker }
208*8975f5c5SAndroid Build Coastguard Worker
swap(const gl::Context * context)209*8975f5c5SAndroid Build Coastguard Worker egl::Error WindowSurfaceWgpu::swap(const gl::Context *context)
210*8975f5c5SAndroid Build Coastguard Worker {
211*8975f5c5SAndroid Build Coastguard Worker return angle::ResultToEGL(swapImpl(context));
212*8975f5c5SAndroid Build Coastguard Worker }
213*8975f5c5SAndroid Build Coastguard Worker
bindTexImage(const gl::Context * context,gl::Texture * texture,EGLint buffer)214*8975f5c5SAndroid Build Coastguard Worker egl::Error WindowSurfaceWgpu::bindTexImage(const gl::Context *context,
215*8975f5c5SAndroid Build Coastguard Worker gl::Texture *texture,
216*8975f5c5SAndroid Build Coastguard Worker EGLint buffer)
217*8975f5c5SAndroid Build Coastguard Worker {
218*8975f5c5SAndroid Build Coastguard Worker UNIMPLEMENTED();
219*8975f5c5SAndroid Build Coastguard Worker return egl::NoError();
220*8975f5c5SAndroid Build Coastguard Worker }
221*8975f5c5SAndroid Build Coastguard Worker
releaseTexImage(const gl::Context * context,EGLint buffer)222*8975f5c5SAndroid Build Coastguard Worker egl::Error WindowSurfaceWgpu::releaseTexImage(const gl::Context *context, EGLint buffer)
223*8975f5c5SAndroid Build Coastguard Worker {
224*8975f5c5SAndroid Build Coastguard Worker UNIMPLEMENTED();
225*8975f5c5SAndroid Build Coastguard Worker return egl::NoError();
226*8975f5c5SAndroid Build Coastguard Worker }
227*8975f5c5SAndroid Build Coastguard Worker
setSwapInterval(const egl::Display * display,EGLint interval)228*8975f5c5SAndroid Build Coastguard Worker void WindowSurfaceWgpu::setSwapInterval(const egl::Display *display, EGLint interval)
229*8975f5c5SAndroid Build Coastguard Worker {
230*8975f5c5SAndroid Build Coastguard Worker UNIMPLEMENTED();
231*8975f5c5SAndroid Build Coastguard Worker }
232*8975f5c5SAndroid Build Coastguard Worker
getWidth() const233*8975f5c5SAndroid Build Coastguard Worker EGLint WindowSurfaceWgpu::getWidth() const
234*8975f5c5SAndroid Build Coastguard Worker {
235*8975f5c5SAndroid Build Coastguard Worker return mCurrentSurfaceSize.width;
236*8975f5c5SAndroid Build Coastguard Worker }
237*8975f5c5SAndroid Build Coastguard Worker
getHeight() const238*8975f5c5SAndroid Build Coastguard Worker EGLint WindowSurfaceWgpu::getHeight() const
239*8975f5c5SAndroid Build Coastguard Worker {
240*8975f5c5SAndroid Build Coastguard Worker return mCurrentSurfaceSize.height;
241*8975f5c5SAndroid Build Coastguard Worker }
242*8975f5c5SAndroid Build Coastguard Worker
getSwapBehavior() const243*8975f5c5SAndroid Build Coastguard Worker EGLint WindowSurfaceWgpu::getSwapBehavior() const
244*8975f5c5SAndroid Build Coastguard Worker {
245*8975f5c5SAndroid Build Coastguard Worker UNIMPLEMENTED();
246*8975f5c5SAndroid Build Coastguard Worker return 0;
247*8975f5c5SAndroid Build Coastguard Worker }
248*8975f5c5SAndroid Build Coastguard Worker
initializeContents(const gl::Context * context,GLenum binding,const gl::ImageIndex & imageIndex)249*8975f5c5SAndroid Build Coastguard Worker angle::Result WindowSurfaceWgpu::initializeContents(const gl::Context *context,
250*8975f5c5SAndroid Build Coastguard Worker GLenum binding,
251*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &imageIndex)
252*8975f5c5SAndroid Build Coastguard Worker {
253*8975f5c5SAndroid Build Coastguard Worker UNIMPLEMENTED();
254*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
255*8975f5c5SAndroid Build Coastguard Worker }
256*8975f5c5SAndroid Build Coastguard Worker
attachToFramebuffer(const gl::Context * context,gl::Framebuffer * framebuffer)257*8975f5c5SAndroid Build Coastguard Worker egl::Error WindowSurfaceWgpu::attachToFramebuffer(const gl::Context *context,
258*8975f5c5SAndroid Build Coastguard Worker gl::Framebuffer *framebuffer)
259*8975f5c5SAndroid Build Coastguard Worker {
260*8975f5c5SAndroid Build Coastguard Worker return egl::NoError();
261*8975f5c5SAndroid Build Coastguard Worker }
262*8975f5c5SAndroid Build Coastguard Worker
detachFromFramebuffer(const gl::Context * context,gl::Framebuffer * framebuffer)263*8975f5c5SAndroid Build Coastguard Worker egl::Error WindowSurfaceWgpu::detachFromFramebuffer(const gl::Context *context,
264*8975f5c5SAndroid Build Coastguard Worker gl::Framebuffer *framebuffer)
265*8975f5c5SAndroid Build Coastguard Worker {
266*8975f5c5SAndroid Build Coastguard Worker return egl::NoError();
267*8975f5c5SAndroid Build Coastguard Worker }
268*8975f5c5SAndroid Build Coastguard Worker
getAttachmentRenderTarget(const gl::Context * context,GLenum binding,const gl::ImageIndex & imageIndex,GLsizei samples,FramebufferAttachmentRenderTarget ** rtOut)269*8975f5c5SAndroid Build Coastguard Worker angle::Result WindowSurfaceWgpu::getAttachmentRenderTarget(
270*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context,
271*8975f5c5SAndroid Build Coastguard Worker GLenum binding,
272*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &imageIndex,
273*8975f5c5SAndroid Build Coastguard Worker GLsizei samples,
274*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachmentRenderTarget **rtOut)
275*8975f5c5SAndroid Build Coastguard Worker {
276*8975f5c5SAndroid Build Coastguard Worker if (binding == GL_BACK)
277*8975f5c5SAndroid Build Coastguard Worker {
278*8975f5c5SAndroid Build Coastguard Worker *rtOut = &mColorAttachment.renderTarget;
279*8975f5c5SAndroid Build Coastguard Worker }
280*8975f5c5SAndroid Build Coastguard Worker else
281*8975f5c5SAndroid Build Coastguard Worker {
282*8975f5c5SAndroid Build Coastguard Worker ASSERT(binding == GL_DEPTH || binding == GL_STENCIL || binding == GL_DEPTH_STENCIL);
283*8975f5c5SAndroid Build Coastguard Worker *rtOut = &mDepthStencilAttachment.renderTarget;
284*8975f5c5SAndroid Build Coastguard Worker }
285*8975f5c5SAndroid Build Coastguard Worker
286*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
287*8975f5c5SAndroid Build Coastguard Worker }
288*8975f5c5SAndroid Build Coastguard Worker
initializeImpl(const egl::Display * display)289*8975f5c5SAndroid Build Coastguard Worker angle::Result WindowSurfaceWgpu::initializeImpl(const egl::Display *display)
290*8975f5c5SAndroid Build Coastguard Worker {
291*8975f5c5SAndroid Build Coastguard Worker DisplayWgpu *displayWgpu = webgpu::GetImpl(display);
292*8975f5c5SAndroid Build Coastguard Worker wgpu::Adapter &adapter = displayWgpu->getAdapter();
293*8975f5c5SAndroid Build Coastguard Worker
294*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(createWgpuSurface(display, &mSurface));
295*8975f5c5SAndroid Build Coastguard Worker
296*8975f5c5SAndroid Build Coastguard Worker gl::Extents size;
297*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(getCurrentWindowSize(display, &size));
298*8975f5c5SAndroid Build Coastguard Worker
299*8975f5c5SAndroid Build Coastguard Worker wgpu::SurfaceCapabilities surfaceCapabilities;
300*8975f5c5SAndroid Build Coastguard Worker wgpu::Status getCapabilitiesStatus = mSurface.GetCapabilities(adapter, &surfaceCapabilities);
301*8975f5c5SAndroid Build Coastguard Worker if (getCapabilitiesStatus != wgpu::Status::Success)
302*8975f5c5SAndroid Build Coastguard Worker {
303*8975f5c5SAndroid Build Coastguard Worker ERR() << "wgpu::Surface::GetCapabilities failed: "
304*8975f5c5SAndroid Build Coastguard Worker << gl::FmtHex(static_cast<uint32_t>(getCapabilitiesStatus));
305*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Stop;
306*8975f5c5SAndroid Build Coastguard Worker }
307*8975f5c5SAndroid Build Coastguard Worker
308*8975f5c5SAndroid Build Coastguard Worker const egl::Config *config = mState.config;
309*8975f5c5SAndroid Build Coastguard Worker ASSERT(config->renderTargetFormat != GL_NONE);
310*8975f5c5SAndroid Build Coastguard Worker mSurfaceTextureFormat = &displayWgpu->getFormat(config->renderTargetFormat);
311*8975f5c5SAndroid Build Coastguard Worker ASSERT(std::find(surfaceCapabilities.formats,
312*8975f5c5SAndroid Build Coastguard Worker surfaceCapabilities.formats + surfaceCapabilities.formatCount,
313*8975f5c5SAndroid Build Coastguard Worker mSurfaceTextureFormat->getActualWgpuTextureFormat()) !=
314*8975f5c5SAndroid Build Coastguard Worker (surfaceCapabilities.formats + surfaceCapabilities.formatCount));
315*8975f5c5SAndroid Build Coastguard Worker
316*8975f5c5SAndroid Build Coastguard Worker mSurfaceTextureUsage = wgpu::TextureUsage::RenderAttachment | wgpu::TextureUsage::CopySrc |
317*8975f5c5SAndroid Build Coastguard Worker wgpu::TextureUsage::CopyDst;
318*8975f5c5SAndroid Build Coastguard Worker ASSERT((surfaceCapabilities.usages & mSurfaceTextureUsage) == mSurfaceTextureUsage);
319*8975f5c5SAndroid Build Coastguard Worker
320*8975f5c5SAndroid Build Coastguard Worker // Default to the always supported Fifo present mode. Use Mailbox if it's available.
321*8975f5c5SAndroid Build Coastguard Worker mPresentMode = wgpu::PresentMode::Fifo;
322*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < surfaceCapabilities.presentModeCount; i++)
323*8975f5c5SAndroid Build Coastguard Worker {
324*8975f5c5SAndroid Build Coastguard Worker if (surfaceCapabilities.presentModes[i] == wgpu::PresentMode::Mailbox)
325*8975f5c5SAndroid Build Coastguard Worker {
326*8975f5c5SAndroid Build Coastguard Worker mPresentMode = wgpu::PresentMode::Mailbox;
327*8975f5c5SAndroid Build Coastguard Worker }
328*8975f5c5SAndroid Build Coastguard Worker }
329*8975f5c5SAndroid Build Coastguard Worker
330*8975f5c5SAndroid Build Coastguard Worker if (config->depthStencilFormat != GL_NONE)
331*8975f5c5SAndroid Build Coastguard Worker {
332*8975f5c5SAndroid Build Coastguard Worker mDepthStencilFormat = &displayWgpu->getFormat(config->depthStencilFormat);
333*8975f5c5SAndroid Build Coastguard Worker }
334*8975f5c5SAndroid Build Coastguard Worker else
335*8975f5c5SAndroid Build Coastguard Worker {
336*8975f5c5SAndroid Build Coastguard Worker mDepthStencilFormat = nullptr;
337*8975f5c5SAndroid Build Coastguard Worker }
338*8975f5c5SAndroid Build Coastguard Worker
339*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(configureSurface(display, size));
340*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(updateCurrentTexture(display));
341*8975f5c5SAndroid Build Coastguard Worker
342*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
343*8975f5c5SAndroid Build Coastguard Worker }
344*8975f5c5SAndroid Build Coastguard Worker
swapImpl(const gl::Context * context)345*8975f5c5SAndroid Build Coastguard Worker angle::Result WindowSurfaceWgpu::swapImpl(const gl::Context *context)
346*8975f5c5SAndroid Build Coastguard Worker {
347*8975f5c5SAndroid Build Coastguard Worker const egl::Display *display = context->getDisplay();
348*8975f5c5SAndroid Build Coastguard Worker ContextWgpu *contextWgpu = webgpu::GetImpl(context);
349*8975f5c5SAndroid Build Coastguard Worker
350*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(contextWgpu->flush(webgpu::RenderPassClosureReason::EGLSwapBuffers));
351*8975f5c5SAndroid Build Coastguard Worker
352*8975f5c5SAndroid Build Coastguard Worker mSurface.Present();
353*8975f5c5SAndroid Build Coastguard Worker
354*8975f5c5SAndroid Build Coastguard Worker gl::Extents size;
355*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(getCurrentWindowSize(display, &size));
356*8975f5c5SAndroid Build Coastguard Worker if (size != mCurrentSurfaceSize)
357*8975f5c5SAndroid Build Coastguard Worker {
358*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(configureSurface(display, size));
359*8975f5c5SAndroid Build Coastguard Worker }
360*8975f5c5SAndroid Build Coastguard Worker
361*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(updateCurrentTexture(display));
362*8975f5c5SAndroid Build Coastguard Worker
363*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
364*8975f5c5SAndroid Build Coastguard Worker }
365*8975f5c5SAndroid Build Coastguard Worker
configureSurface(const egl::Display * display,const gl::Extents & size)366*8975f5c5SAndroid Build Coastguard Worker angle::Result WindowSurfaceWgpu::configureSurface(const egl::Display *display,
367*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &size)
368*8975f5c5SAndroid Build Coastguard Worker {
369*8975f5c5SAndroid Build Coastguard Worker DisplayWgpu *displayWgpu = webgpu::GetImpl(display);
370*8975f5c5SAndroid Build Coastguard Worker wgpu::Device &device = displayWgpu->getDevice();
371*8975f5c5SAndroid Build Coastguard Worker
372*8975f5c5SAndroid Build Coastguard Worker ASSERT(mSurfaceTextureFormat != nullptr);
373*8975f5c5SAndroid Build Coastguard Worker
374*8975f5c5SAndroid Build Coastguard Worker wgpu::SurfaceConfiguration surfaceConfig = {};
375*8975f5c5SAndroid Build Coastguard Worker surfaceConfig.device = device;
376*8975f5c5SAndroid Build Coastguard Worker surfaceConfig.format = mSurfaceTextureFormat->getActualWgpuTextureFormat();
377*8975f5c5SAndroid Build Coastguard Worker surfaceConfig.usage = mSurfaceTextureUsage;
378*8975f5c5SAndroid Build Coastguard Worker surfaceConfig.width = size.width;
379*8975f5c5SAndroid Build Coastguard Worker surfaceConfig.height = size.height;
380*8975f5c5SAndroid Build Coastguard Worker surfaceConfig.presentMode = mPresentMode;
381*8975f5c5SAndroid Build Coastguard Worker
382*8975f5c5SAndroid Build Coastguard Worker mSurface.Configure(&surfaceConfig);
383*8975f5c5SAndroid Build Coastguard Worker
384*8975f5c5SAndroid Build Coastguard Worker if (mDepthStencilFormat)
385*8975f5c5SAndroid Build Coastguard Worker {
386*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(createDepthStencilAttachment(
387*8975f5c5SAndroid Build Coastguard Worker static_cast<uint32_t>(size.width), static_cast<uint32_t>(size.height),
388*8975f5c5SAndroid Build Coastguard Worker *mDepthStencilFormat, device, &mDepthStencilAttachment));
389*8975f5c5SAndroid Build Coastguard Worker }
390*8975f5c5SAndroid Build Coastguard Worker
391*8975f5c5SAndroid Build Coastguard Worker mCurrentSurfaceSize = size;
392*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
393*8975f5c5SAndroid Build Coastguard Worker }
394*8975f5c5SAndroid Build Coastguard Worker
updateCurrentTexture(const egl::Display * display)395*8975f5c5SAndroid Build Coastguard Worker angle::Result WindowSurfaceWgpu::updateCurrentTexture(const egl::Display *display)
396*8975f5c5SAndroid Build Coastguard Worker {
397*8975f5c5SAndroid Build Coastguard Worker wgpu::SurfaceTexture texture;
398*8975f5c5SAndroid Build Coastguard Worker mSurface.GetCurrentTexture(&texture);
399*8975f5c5SAndroid Build Coastguard Worker if (texture.status != wgpu::SurfaceGetCurrentTextureStatus::Success)
400*8975f5c5SAndroid Build Coastguard Worker {
401*8975f5c5SAndroid Build Coastguard Worker ERR() << "wgpu::Surface::GetCurrentTexture failed: "
402*8975f5c5SAndroid Build Coastguard Worker << gl::FmtHex(static_cast<uint32_t>(texture.status));
403*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Stop;
404*8975f5c5SAndroid Build Coastguard Worker }
405*8975f5c5SAndroid Build Coastguard Worker
406*8975f5c5SAndroid Build Coastguard Worker wgpu::TextureFormat wgpuFormat = texture.texture.GetFormat();
407*8975f5c5SAndroid Build Coastguard Worker angle::FormatID angleFormat = webgpu::GetFormatIDFromWgpuTextureFormat(wgpuFormat);
408*8975f5c5SAndroid Build Coastguard Worker
409*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(mColorAttachment.texture.initExternal(angleFormat, angleFormat, texture.texture));
410*8975f5c5SAndroid Build Coastguard Worker
411*8975f5c5SAndroid Build Coastguard Worker wgpu::TextureView view;
412*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(mColorAttachment.texture.createTextureView(gl::LevelIndex(0), 0, view));
413*8975f5c5SAndroid Build Coastguard Worker
414*8975f5c5SAndroid Build Coastguard Worker mColorAttachment.renderTarget.set(&mColorAttachment.texture, view, webgpu::LevelIndex(0), 0,
415*8975f5c5SAndroid Build Coastguard Worker wgpuFormat);
416*8975f5c5SAndroid Build Coastguard Worker
417*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
418*8975f5c5SAndroid Build Coastguard Worker }
419*8975f5c5SAndroid Build Coastguard Worker
420*8975f5c5SAndroid Build Coastguard Worker } // namespace rx
421