Closed
Bug 1249361
Opened 9 years ago
Closed 8 years ago
Compositor glitches out the final rendering of an image.
Categories
(Core :: Graphics: CanvasWebGL, defect)
Core
Graphics: CanvasWebGL
Tracking
()
RESOLVED
FIXED
People
(Reporter: jujjyl, Unassigned)
References
Details
(Whiteboard: gfx-noted)
Attachments
(1 file)
905.39 KB,
image/png
|
Details |
Debugging an asm.js WebGL page, on certain Windows NVidia configurations, the final page rendered output comes out glitched. This only occurs on this one engine demo, not on all WebGL content.
The application renders the contents to an offscreen render target (1280x720 RGBA8), and as a final step, blits that out to the WebGL canvas screen buffer.
The final image produced onto the offscreen render target is ok, and that is blitted onto the canvas using the vertex shader
#version 300 es
layout ( location = 0 ) in vec4 in_pos ;
layout ( location = 8 ) in vec2 in_uv0 ;
uniform mat4 world_view_proj ;
out vec2 v_uv0 ;
void main ()
{
v_uv0 = vec2 ( in_uv0 . x , 1.0 - in_uv0 . y ) ;
gl_Position = vec4((in_pos * world_view_proj).xy, 0.5, 1.0) ;
}
and the fragment shader
#version 300 es
in vec2 v_uv0 ;
layout ( location = 0 ) out vec4 out_color ;
uniform sampler2D input_texture0 ;
void main ( )
{
vec4 c = texture ( input_texture0 , v_uv0 ) ;
out_color = c ;
}
but for some reason, this blit produces completely incorrectly textured result. Using GLcontext.readPixels() to obtain the image of the offscreen render target before blitting, it looks ok. See the attached screenshot. The above canvas is the WebGL 2 canvas, where the rendering is done. The canvas below is a clone of that, which displays a manually .readPixel()ed copy of the final rendering before it is blitted to screen.
Jeff Gilbert asked for STR in games meeting, sending it to him directly (closed source).
Reporter | ||
Comment 1•9 years ago
|
||
Seeing this occur on my HASWELL Windows 10 system with about:graphics
Adapter Description NVIDIA GeForce GTX 980 Ti
Adapter Drivers nvd3dumx,nvwgf2umx,nvwgf2umx,nvwgf2umx nvd3dum,nvwgf2um,nvwgf2um,nvwgf2um
Adapter RAM 4095
Asynchronous Pan/Zoom wheel input enabled; touch input enabled
Device ID 0x17c8
Direct2D Enabled true
DirectWrite Enabled true (10.0.10586.0)
Driver Date 2-8-2016
Driver Version 10.18.13.6191
GPU #2 Active false
GPU Accelerated Windows 1/1 Direct3D 11 (OMTC)
Subsys ID 00000000
Supports Hardware H264 Decoding Yes
Vendor ID 0x10de
WebGL Renderer Google Inc. -- ANGLE (NVIDIA GeForce GTX 980 Ti Direct3D11 vs_5_0 ps_5_0)
windowLayerManagerRemote true
AzureCanvasBackend direct2d 1.1
AzureContentBackend direct2d 1.1
AzureFallbackCanvasBackend cairo
AzureSkiaAccelerated 0
Reporter | ||
Comment 2•9 years ago
|
||
Also on Anthony's Windows 10 system with
Graphics
Adapter Description NVIDIA GeForce GTX 970
Adapter Drivers nvd3dumx,nvwgf2umx,nvwgf2umx,nvwgf2umx nvd3dum,nvwgf2um,nvwgf2um,nvwgf2um
Adapter RAM 4095
Asynchronous Pan/Zoom wheel input enabled; touch input enabled
Device ID 0x13c2
Direct2D Enabled true
DirectWrite Enabled true (10.0.10586.0)
Driver Date 1-22-2016
Driver Version 10.18.13.6175
GPU #2 Active false
GPU Accelerated Windows 1/1 Direct3D 11 (OMTC)
Subsys ID 29723842
Supports Hardware H264 Decoding Yes
Vendor ID 0x10de
WebGL Renderer Google Inc. -- ANGLE (NVIDIA GeForce GTX 970 Direct3D11 vs_5_0 ps_5_0)
windowLayerManagerRemote true
AzureCanvasBackend direct2d 1.1
AzureContentBackend direct2d 1.1
AzureFallbackCanvasBackend cairo
AzureSkiaAccelerated 0
Reporter | ||
Comment 3•9 years ago
|
||
Does not occur on Macbook Pro running Windows 8.1 Pro in bootcamp which has about:support with
Adapter Description NVIDIA GeForce GT 650M
Adapter Drivers nvd3dumx,nvwgf2umx,nvwgf2umx nvd3dum,nvwgf2um,nvwgf2um
Adapter RAM 1024
Asynchronous Pan/Zoom wheel input enabled; touch input enabled
Device ID 0x0fd5
Direct2D Enabled true
DirectWrite Enabled true (6.3.9600.18123)
Driver Date 6-17-2015
Driver Version 10.18.13.5330
GPU #2 Active false
GPU Accelerated Windows 1/1 Direct3D 11 (OMTC)
Subsys ID 00f2106b
Supports Hardware H264 Decoding Yes
Vendor ID 0x10de
WebGL Renderer Google Inc. -- ANGLE (NVIDIA GeForce GT 650M Direct3D11 vs_5_0 ps_5_0)
windowLayerManagerRemote true
AzureCanvasBackend direct2d 1.1
AzureContentBackend direct2d 1.1
AzureFallbackCanvasBackend cairo
AzureSkiaAccelerated 0
Reporter | ||
Comment 4•9 years ago
|
||
Also does not occur on a desktop Windows 8.1 Pro PC with about:support
Adapter Description NVIDIA GeForce 9600 GT
Adapter Drivers nvd3dumx,nvwgf2umx,nvwgf2umx nvd3dum,nvwgf2um,nvwgf2um
Adapter RAM 512
Asynchronous Pan/Zoom wheel input enabled; touch input enabled
Device ID 0x0622
Direct2D Enabled true
DirectWrite Enabled true (6.3.9600.18123)
Driver Date 7-2-2014
Driver Version 9.18.13.4052
GPU #2 Active false
GPU Accelerated Windows 1/1 Direct3D 11 (OMTC)
Subsys ID 34a01458
Supports Hardware H264 Decoding Yes
Vendor ID 0x10de
WebGL Renderer Google Inc. -- ANGLE (NVIDIA GeForce 9600 GT Direct3D11 vs_4_0 ps_4_0)
windowLayerManagerRemote true
AzureCanvasBackend direct2d 1.1
AzureContentBackend direct2d 1.1
AzureFallbackCanvasBackend cairo
AzureSkiaAccelerated 0
Reporter | ||
Comment 5•9 years ago
|
||
Also the bug does not occur on a Hewlett Packard Windows 10 laptop with about:support
Adapter Description Intel(R) HD Graphics 4600
Adapter Description (GPU #2) NVIDIA Quadro K1100M
Adapter Drivers igdumdim64 igd10iumd64 igd10iumd64 igd12umd64 igdumdim32 igd10iumd32 igd10iumd32 igd12umd32
Adapter Drivers (GPU #2) nvd3dumx,nvwgf2umx,nvwgf2umx,nvwgf2umx nvd3dum,nvwgf2um,nvwgf2um,nvwgf2um
Adapter RAM Unknown
Adapter RAM (GPU #2) 2048
Asynchronous Pan/Zoom none
Device ID 0x0416
Device ID (GPU #2) 0x0ff6
Direct2D Enabled true
DirectWrite Enabled true (10.0.10240.16430)
Driver Date 12-15-2015
Driver Date (GPU #2) 7-22-2015
Driver Version 20.19.15.4352
Driver Version (GPU #2) 10.18.13.5362
GPU #2 Active false
GPU Accelerated Windows 1/1 Direct3D 11 (OMTC)
Subsys ID 00000000
Subsys ID (GPU #2) 00000000
Supports Hardware H264 Decoding Yes
Vendor ID 0x8086
Vendor ID (GPU #2) 0x10de
WebGL Renderer Google Inc. -- ANGLE (Intel(R) HD Graphics 4600 Direct3D11 vs_5_0 ps_5_0)
windowLayerManagerRemote true
AzureCanvasBackend direct2d 1.1
AzureContentBackend direct2d 1.1
AzureFallbackCanvasBackend cairo
AzureSkiaAccelerated 0
Looks like this laptop is a dual GPU one, and according to "WebGL Renderer" field, the Intel one is used instead of the Quadro one. Jeff, is there a way to force Firefox use the NVIDIA GPU on this for WebGL?
Flags: needinfo?(jgilbert)
Reporter | ||
Comment 6•9 years ago
|
||
Also the bug does not occur on the same Macbook Pro laptop from comment 3, after its GPU driver is updated to latest version:
Adapter Description NVIDIA GeForce GT 650M
Adapter Drivers nvd3dumx,nvwgf2umx,nvwgf2umx nvd3dum,nvwgf2um,nvwgf2um
Adapter RAM 1024
Asynchronous Pan/Zoom wheel input enabled; touch input enabled
Device ID 0x0fd5
Direct2D Enabled true
DirectWrite Enabled true (6.3.9600.18123)
Driver Date 2-8-2016
Driver Version 10.18.13.6191
GPU #2 Active false
GPU Accelerated Windows 1/1 Direct3D 11 (OMTC)
Subsys ID 00f2106b
Supports Hardware H264 Decoding Yes
Vendor ID 0x10de
WebGL Renderer Google Inc. -- ANGLE (NVIDIA GeForce GT 650M Direct3D11 vs_5_0 ps_5_0)
windowLayerManagerRemote true
AzureCanvasBackend direct2d 1.1
AzureContentBackend direct2d 1.1
AzureFallbackCanvasBackend cairo
AzureSkiaAccelerated 0
so not a GPU-card independent NVidia driver regression at least.
Reporter | ||
Comment 7•9 years ago
|
||
Also the bug does not occur on Microsoft Surface 2 Pro tablet/laptop with Windows 10, about:support
Adapter Description Intel(R) HD Graphics Family
Adapter Drivers igdumdim64 igd10iumd64 igd10iumd64 igd12umd64 igdumdim32 igd10iumd32 igd10iumd32 igd12umd32
Adapter RAM Unknown
Asynchronous Pan/Zoom wheel input enabled; touch input enabled
Device ID 0x0a16
Direct2D Enabled true
DirectWrite Enabled true (10.0.10586.0)
Driver Date 7-17-2015
Driver Version 10.18.15.4256
GPU #2 Active false
GPU Accelerated Windows 1/1 Direct3D 11 (OMTC)
Subsys ID 0a161414
Supports Hardware H264 Decoding Yes
Vendor ID 0x8086
WebGL Renderer Google Inc. -- ANGLE (Intel(R) HD Graphics Family Direct3D11 vs_5_0 ps_5_0)
windowLayerManagerRemote true
AzureCanvasBackend direct2d 1.1
AzureContentBackend direct2d 1.1
AzureFallbackCanvasBackend cairo
AzureSkiaAccelerated 0
For some reason, the exact graphics card is not listed, Wikipedia says this one is an Intel HD Graphics 4400.
Comment 8•9 years ago
|
||
(In reply to Jukka Jylänki from comment #5)
> Also the bug does not occur on a Hewlett Packard Windows 10 laptop with
> about:support
>
> Adapter Description Intel(R) HD Graphics 4600
> Adapter Description (GPU #2) NVIDIA Quadro K1100M
> Adapter Drivers igdumdim64 igd10iumd64 igd10iumd64 igd12umd64 igdumdim32
> igd10iumd32 igd10iumd32 igd12umd32
> Adapter Drivers (GPU #2) nvd3dumx,nvwgf2umx,nvwgf2umx,nvwgf2umx
> nvd3dum,nvwgf2um,nvwgf2um,nvwgf2um
> Adapter RAM Unknown
> Adapter RAM (GPU #2) 2048
> Asynchronous Pan/Zoom none
> Device ID 0x0416
> Device ID (GPU #2) 0x0ff6
> Direct2D Enabled true
> DirectWrite Enabled true (10.0.10240.16430)
> Driver Date 12-15-2015
> Driver Date (GPU #2) 7-22-2015
> Driver Version 20.19.15.4352
> Driver Version (GPU #2) 10.18.13.5362
> GPU #2 Active false
> GPU Accelerated Windows 1/1 Direct3D 11 (OMTC)
> Subsys ID 00000000
> Subsys ID (GPU #2) 00000000
> Supports Hardware H264 Decoding Yes
> Vendor ID 0x8086
> Vendor ID (GPU #2) 0x10de
> WebGL Renderer Google Inc. -- ANGLE (Intel(R) HD Graphics 4600 Direct3D11
> vs_5_0 ps_5_0)
> windowLayerManagerRemote true
> AzureCanvasBackend direct2d 1.1
> AzureContentBackend direct2d 1.1
> AzureFallbackCanvasBackend cairo
> AzureSkiaAccelerated 0
>
> Looks like this laptop is a dual GPU one, and according to "WebGL Renderer"
> field, the Intel one is used instead of the Quadro one. Jeff, is there a way
> to force Firefox use the NVIDIA GPU on this for WebGL?
Generally messing with the driver's UI for app-specific settings, I think. Some machines can disable one or the other of the GPUs from the BOIS. :bas might know if there's a way to pick in software, though.
Flags: needinfo?(jgilbert) → needinfo?(bas)
Comment 9•9 years ago
|
||
It looks like it might be a NV Maxwell-specific bug?
GTX 980ti and GTX 970 only, so far.
Reporter | ||
Comment 10•9 years ago
|
||
It does suggest so.
The first party developer hitting this issue reports that they get the bug with an Asus G751JY – NVidia GeForce GTX 980m – Windows 8.1 Enterprise 64bit, with about:support
Graphics
Adapter Description NVIDIA GeForce GTX 980M
Adapter Drivers nvd3dumx,nvwgf2umx,nvwgf2umx nvd3dum,nvwgf2um,nvwgf2um
Adapter RAM 4095
Asynchronous Pan/Zoom wheel input enabled; touch input enabled
Device ID 0x1617
Direct2D Enabled true
DirectWrite Enabled true (6.3.9600.18123)
Driver Date 1-22-2016
Driver Version 10.18.13.6175
GPU #2 Active false
GPU Accelerated Windows 1/1 Direct3D 11 (OMTC)
Subsys ID 22da1043
Supports Hardware H264 Decoding Yes
Vendor ID 0x10de
WebGL Renderer Google Inc. -- ANGLE (NVIDIA GeForce GTX 980M Direct3D11 vs_5_0 ps_5_0)
windowLayerManagerRemote true
AzureCanvasBackend direct2d 1.1
AzureContentBackend direct2d 1.1
AzureFallbackCanvasBackend cairo
AzureSkiaAccelerated 0
which suggests Maxwell, and rules out that it might have been only a Windows 10 thing, since this is a Windows 8.1 one.
Reporter | ||
Comment 11•9 years ago
|
||
Also occurs on developer's Dell Precision T5610 – NVidia GeForce GTX 980 – Windows 10 Enterprise 64bit, with
Graphics
Adapter Description NVIDIA GeForce GTX 980
Adapter Drivers nvd3dumx,nvwgf2umx,nvwgf2umx,nvwgf2umx nvd3dum,nvwgf2um,nvwgf2um,nvwgf2um
Adapter RAM 4095
Asynchronous Pan/Zoom wheel input enabled; touch input enabled
Device ID 0x13c0
Direct2D Enabled true
DirectWrite Enabled true (10.0.10240.16430)
Driver Date 11-24-2015
Driver Version 10.18.13.5906
GPU #2 Active false
GPU Accelerated Windows 3/3 Direct3D 11 (OMTC)
Subsys ID 36851458
Supports Hardware H264 Decoding Yes
Vendor ID 0x10de
WebGL Renderer NVIDIA Corporation -- GeForce GTX 980/PCIe/SSE2
windowLayerManagerRemote true
AzureCanvasBackend direct2d 1.1
AzureContentBackend direct2d 1.1
AzureFallbackCanvasBackend cairo
AzureSkiaAccelerated 0
which is a Maxwell again.
Comment 12•9 years ago
|
||
No corruption on one of last year's GDC machines:
Graphics
Adapter Description NVIDIA GeForce GTX 760 Ti OEM
Adapter Description (GPU #2) Intel(R) HD Graphics 4600
Adapter Drivers nvd3dumx,nvwgf2umx,nvwgf2umx nvd3dum,nvwgf2um,nvwgf2um
Adapter Drivers (GPU #2) igdumdim64 igd10iumd64 igd10iumd64 igdumdim32 igd10iumd32 igd10iumd32
Adapter RAM 2048
Adapter RAM (GPU #2) Unknown
Asynchronous Pan/Zoom wheel input enabled; touch input enabled
Device ID 0x1189
Device ID (GPU #2) 0x0412
Direct2D Enabled true
DirectWrite Enabled true (6.3.9600.18123)
Driver Date 2-5-2015
Driver Date (GPU #2) 9-29-2014
Driver Version 9.18.13.4752
Driver Version (GPU #2) 10.18.10.3960
GPU #2 Active false
GPU Accelerated Windows 1/1 Direct3D 11 (OMTC)
Subsys ID 107410de
Subsys ID (GPU #2) 0000000c
Supports Hardware H264 Decoding Yes
Vendor ID 0x10de
Vendor ID (GPU #2) 0x8086
WebGL Renderer Google Inc. -- ANGLE (NVIDIA GeForce GTX 760 Ti OEM Direct3D11 vs_5_0 ps_5_0)
windowLayerManagerRemote true
AzureCanvasBackend direct2d 1.1
AzureContentBackend direct2d 1.1
AzureFallbackCanvasBackend cairo
AzureSkiaAccelerated 0
Comment 13•9 years ago
|
||
(In reply to Jeff Gilbert [:jgilbert] from comment #8)
> (In reply to Jukka Jylänki from comment #5)
> > Also the bug does not occur on a Hewlett Packard Windows 10 laptop with
> > about:support
> >
> > Adapter Description Intel(R) HD Graphics 4600
> > Adapter Description (GPU #2) NVIDIA Quadro K1100M
> > Adapter Drivers igdumdim64 igd10iumd64 igd10iumd64 igd12umd64 igdumdim32
> > igd10iumd32 igd10iumd32 igd12umd32
> > Adapter Drivers (GPU #2) nvd3dumx,nvwgf2umx,nvwgf2umx,nvwgf2umx
> > nvd3dum,nvwgf2um,nvwgf2um,nvwgf2um
> > Adapter RAM Unknown
> > Adapter RAM (GPU #2) 2048
> > Asynchronous Pan/Zoom none
> > Device ID 0x0416
> > Device ID (GPU #2) 0x0ff6
> > Direct2D Enabled true
> > DirectWrite Enabled true (10.0.10240.16430)
> > Driver Date 12-15-2015
> > Driver Date (GPU #2) 7-22-2015
> > Driver Version 20.19.15.4352
> > Driver Version (GPU #2) 10.18.13.5362
> > GPU #2 Active false
> > GPU Accelerated Windows 1/1 Direct3D 11 (OMTC)
> > Subsys ID 00000000
> > Subsys ID (GPU #2) 00000000
> > Supports Hardware H264 Decoding Yes
> > Vendor ID 0x8086
> > Vendor ID (GPU #2) 0x10de
> > WebGL Renderer Google Inc. -- ANGLE (Intel(R) HD Graphics 4600 Direct3D11
> > vs_5_0 ps_5_0)
> > windowLayerManagerRemote true
> > AzureCanvasBackend direct2d 1.1
> > AzureContentBackend direct2d 1.1
> > AzureFallbackCanvasBackend cairo
> > AzureSkiaAccelerated 0
> >
> > Looks like this laptop is a dual GPU one, and according to "WebGL Renderer"
> > field, the Intel one is used instead of the Quadro one. Jeff, is there a way
> > to force Firefox use the NVIDIA GPU on this for WebGL?
>
> Generally messing with the driver's UI for app-specific settings, I think.
> Some machines can disable one or the other of the GPUs from the BOIS. :bas
> might know if there's a way to pick in software, though.
You'd have to start all of firefox on the Nvidia GPU. It's not a well rested scenario but it should be possibly by rightclicking and selecting the GPU from the context menu.
Flags: needinfo?(bas)
Reporter | ||
Comment 14•9 years ago
|
||
Jeff, have you been able to get your hands on a Maxwell GPU to reproduce this?
Comment 15•9 years ago
|
||
(In reply to Jukka Jylänki from comment #14)
> Jeff, have you been able to get your hands on a Maxwell GPU to reproduce
> this?
Yep, I'm borrowing a machine that reproduces this.
Comment 16•9 years ago
|
||
(980ti)
Updated•9 years ago
|
Whiteboard: gfx-noted
Comment 17•8 years ago
|
||
Any updates on this? We're still able to reproduce this issue with latest Firefox builds. Same GPUs.
Comment 18•8 years ago
|
||
Talked with Gfx team, they will be investigating in a few weeks when they bottom out on some WebGL2 work under way.
Reporter | ||
Comment 19•8 years ago
|
||
For a public test case, visit
http://clb.demon.fi/bugs/stingray-webgl-basic-2016-10-14/stingray_webgl_release.html
The test case is also downloadable for local execution at
http://clb.demon.fi/bugs/stingray-webgl-basic-2016-10-14/stingray-webgl-basic-2016-10-14.zip
If someone has a GTX 10x0 GPU, it would be interesting to know if that is affected.
Reporter | ||
Comment 20•8 years ago
|
||
The graphics glitch occurs on Linux Mint 18 as well: (running on ASUS GTX 980 TI DC3OC Gaming)
Name Firefox
Version 52.0a1
Build ID 20161017030209
Update History
Update Channel nightly
User Agent Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
OS Linux 4.4.0-36-generic
GPU #1
Active Yes
Description NVIDIA Corporation -- GeForce GTX 980 Ti/PCIe/SSE2
Vendor ID NVIDIA Corporation
Device ID GeForce GTX 980 Ti/PCIe/SSE2
Driver Version 4.5.0 NVIDIA 370.28
so not Windows specific.
Reporter | ||
Comment 21•8 years ago
|
||
Anthony, would you have any NVidia GTX 10x0 GPUs (the new Pascal architecture from this year around that you could check the test case in comment 19? (and compare to screenshot in comment 0)
Flags: needinfo?(anthony.s.hughes)
Comment 22•8 years ago
|
||
(In reply to Jukka Jylänki from comment #21)
> Anthony, would you have any NVidia GTX 10x0 GPUs (the new Pascal architecture from this year around
> that you could check the test case in comment 19?
No I do not.
Flags: needinfo?(anthony.s.hughes)
Reporter | ||
Comment 23•8 years ago
|
||
Ok, I now see what the root problem is.
I think when GLctx.invalidateFramebuffer() is called, it ends up invalidating wrong render target textures.
STR:
a. Visit http://clb.demon.fi/bugs/glinvalidateframebuffer/stingray_webgl_release.html
or
b. Download http://clb.demon.fi/bugs/glinvalidateframebuffer.zip and run stingray_webgl_release.html locally.
Observed:
When running on a Maxwell or Pascal NVidia GPU (GTX 960+ series or GTX 1060+ series), the rendered output is corrupted.
Commenting out the line 7342 in stingray_webgl_release.js that says
GLctx["invalidateFramebuffer"](target, list)
sidesteps the corruption altogether.
However, tracing through the GL code on the page (the test case above has tracing logs for this), it looks like the page's usage of invalidateFramebuffer() should be correct. The final output of the page consists of the contents of the render target texture with ID 884, and before that, the application calls to invalidate FBOs, which refer to textures with IDs 889, 890, 891, 886, 892, 897 and 893. The texture with ID 884 should not be affected, but somehow that texture does incorrectly get invalidated as well.
This suggests that the bug is that the FBO invalidation code somehow invalidates the contents of a texture that is not part of that FBO.
The reason why this occurs only on Maxwell and Pascal GPUs is then clear, it looks like glInvalidateFramebuffer() is a no-op on older GPUs, as in Maxwell, NVidia switched over to a tile based architecture where glInvalidateFramebuffer() actually has an effect.
Dan, any chance you could take a look at this bug when you come back?
Flags: needinfo?(dglastonbury)
Comment 25•8 years ago
|
||
It's been reported that bug 1321450 may have fixed this. IIRC Jukka can no longer reproduce this issue on Nightly.
Jukka, if so, can you mark this as fixed?
Flags: needinfo?(dglastonbury) → needinfo?(jujjyl)
Reporter | ||
Comment 26•8 years ago
|
||
Yeah, verified as fixed. Great great!
Status: NEW → RESOLVED
Closed: 8 years ago
Flags: needinfo?(jujjyl)
Resolution: --- → FIXED
You need to log in
before you can comment on or make changes to this bug.
Description
•