|
9601a548
|
2019-11-23T23:44:52
|
|
Vulkan: implement external semaphore barriers
glWaitSemaphoreEXT and glSignalSemaphoreEXT functions optionally request
buffer and image barriers to be performed by the implementation.
If any barriers are present, a single global memory barrier is inserted
to take care of memory accesses.
In both functions, buffer and image memory barriers are used to perform
queue ownership transfers to ANGLE's queue (glWaitSemaphoreEXT) or the
EXTERNAL queue (glSignalSemaphoreEXT).
In glWaitSemaphoreEXT, the given layouts are information regarding how
the external entity (the caller) has modified the images' layouts, and
is used to update ANGLE's internal state tracking.
Bug: angleproject:3289
Bug: 1026673
Change-Id: Ic478a8813df727c89413c8ae2adf42b5c1d06069
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1933016
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Michael Spang <spang@chromium.org>
|
|
745999a9
|
2019-11-19T12:59:02
|
|
Add test for multithreaded shared-context resource
The test does this:
1. Context 1: Read Texture 1 and draw into Framebuffer 1
2. Context 2: Read Texture 1 and draw into Framebuffer 2
3. Context 1: Delete Framebuffer 1
4. Context 1: Flush
5. Context 2: Modify Texture 1
Issue is Texture 1's mCurrentReadingNodes contains one node from each
context's command graph, one of which is deleted at step 4. At step 5, a
dependency is added from both nodes (one already deleted) to a new node,
causing use-after-free.
Bug: angleproject:4130
Change-Id: I06720aec20d0b49114937f1cd9b193a4f1df9d8d
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1924790
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
|
|
88752889
|
2019-11-20T14:09:52
|
|
Vulkan: Fix barriers w.r.t sampled->storage image update
df415528411f97454e765ff6a83ed1cbc90a7d13 implemented a feature where
images are not created with the storage flag until needed. This is a
necessary optimization.
There were a few misuses of the BufferHelper::onRead/Write helpers that
set up the appropriate barriers that this change fixes.
Bug: angleproject:3816
Change-Id: I7e62d98b7325f938152a1972f4ebee083ed319c2
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1924989
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Xinyi He <xinyi.he@arm.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Sunny Sun <sunny.sun@arm.com>
|
|
68591eff
|
2019-10-13T15:05:23
|
|
Vulkan: Store ImageView access in the graph.
This will ensure we don't destroy the image views when they are still
in use by other Contexts.
Bug: angleproject:2464
Change-Id: I1d3ba2ad241250e31ea32873446c4cb23971750d
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1843236
Reviewed-by: Tim Van Patten <timvp@google.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
f10bf6bf
|
2019-09-26T10:27:18
|
|
Vulkan: Implement multi-threaded GL.
The main component of this change is to make vk::BufferHelper,
vk::ImageHelper and vk::SyncHelper use a common path. We introduce a
new "vk::SharedGarbage" helper class that stores small lists of garbage
from individual objects like an ImageHelper or BufferHelper. The
SharedGarbage is stored in the RendererVk with the ResourceUse of the
helper object. The ResourceUse tells RendererVk when it is safe to
destroy the GarbageObjects.
New "onGraphAccess" commands are added in a few places to enable the
common garbage collection path. A couple Context-only resources like
default attributes now are referenced where they were not before.
Also reorganizes some functions so we can add a few helpful ASSERTs
to our graph dependencies. Added "updateCurrentAccessNodes" for this.
Also adds a "RendererScoped" helper to replace many uses of
"ContextScoped".
The multithreading EGL tests mostly pass but have some remaining
flakiness so cannot yet be enabled.
Bug: angleproject:2464
Change-Id: Ia3e3ae8848d731abf3f21ebe04c33e381e130be0
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1808444
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
29f7916f
|
2019-09-25T14:37:35
|
|
Vulkan: Store current Serial in RendererVk.
This gives a stronger ordering on serials than if they're acquired by
the ContextVk. Part of the steps of implementing multithreaded GL on
Vulkan.
Implements a "globalFinish" method in RendererVk that is triggered on
ContextVk destruction. This helped fixed some racy object deletion
situations where the ContextVk could have queued work that uses deleted
objects. Flush all the Contexts before destruction to avoid these
hanging deleted objects.
Bug: angleproject:2464
Change-Id: I244e9bbf6cd47b272c7cbca45b0fb1eb46d626fc
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1791268
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
b540da89
|
2019-09-19T14:19:12
|
|
Vulkan: Use ResourceUse to track object lifetime.
With the new resource tracking scheme the CommandGraph, tracking a
"Context serial" aka "current" serial is no longer necessary for
CommandGraphResources. Serial tracking has been moved to the shared
ResourceUse struct that gets updated on a command submission. Thus
we don't need to store the serial as a current separate piece of info
in BufferHelper/ImageHelper.
Will lead to further redesign for the multi-threading support for
Vulkan.
Bug: angleproject:2464
Change-Id: I1ae4bcc27fcfb93422b4ab4c9682a458e482f295
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1785990
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
01f7e545
|
2019-09-23T13:40:59
|
|
Vulkan: Make SharedResourceUse a custom type.
Gives us better performance when using the command graph. Performance
regressed significantly in "Vulkan: Track resource usage via counter."
Perf test scores:
before CL: 1060
after CL: 1245
this CL: 1085
The small remaining regression can be investigated more fully in the
future. It's possible there is some small acceptable regression when
switching the command graph design for multithreading.
Test: angle_perftests (DrawCall*vulkan_null*manyvbos*)
Bug: angleproject:2464
Change-Id: I5e625999a8e8b3e1a045908c51e549f472cd4209
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1817102
Reviewed-by: Tim Van Patten <timvp@google.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
dd4a00a0
|
2019-09-19T14:19:11
|
|
Vulkan: Track resource usage via counter.
This adds a small shared piece of memory that counts the number of
times a resource is used in a command graph. This will enable more
multi-threaded uses. The shared pointer is updated in the command
graph during a submit and during graph construction.
Bug: angleproject:2464
Change-Id: Id9d0319a6814825d02e865ba527c97b5f535ff31
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1785989
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
d7f28aae
|
2019-09-19T14:19:10
|
|
Vulkan: Pass CommandGraph when updating serials.
This is in preparation for storing a pointer to a shared resource use
structure.
Bug: angleproject:2464
Change-Id: I8f4ba1c71de6ad6a27ac06fc8012a0e94267cc16
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1785988
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Tim Van Patten <timvp@google.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
050b124d
|
2019-06-30T03:26:18
|
|
Reland "Vulkan: Debug overlay"
This is a reland of e54d0f90d1a165404236fd7abd1b05ddd041a686
This was reverted due to a build failure as a result of a missing
virtual destructor in the widget base class.
Original change's description:
> Vulkan: Debug overlay
>
> A debug overlay system for the Vulkan backend designed with efficiency
> and runtime configurability in mind. Overlay widgets are of two
> fundamental types:
>
> - Text widgets: A single line of text with small, medium or large font.
> - Graph widgets: A bar graph of data.
>
> Built on these, various overlay widget types are defined that gather
> statistics. Five such types are defined with one widget per type as
> example:
>
> - Count: A widget that counts something. VulkanValidationMessageCount
> is an overlay widget of this type that shows the number of validation
> messages received from the validation layers.
> - Text: A generic text. VulkanLastValidationMessage is an overlay
> widget of this type that shows the last validation message.
> - PerSecond: A value that gets reset every second automatically. FPS is
> an overlay widget of this type that simply gets incremented on every
> swap().
> - RunningGraph: A graph of last N values. VulkanCommandGraphSize is an
> overlay of this type. On every vkQueueSubmit, the number of nodes in
> the command graph is accumulated. On every present(), the value is
> taken as the number of nodes for the whole duration of the frame.
> - RunningHistogram: A histogram of last N values. Input values are in
> the [0, 1] range and they are ranked to N buckets for histogram
> calculation. VulkanSecondaryCommandBufferPoolWaste is an overlay
> widget of this type. On vkQueueSubmit, the memory waste from command
> buffer pool allocations is recorded in the histogram.
>
> Overlay font is placed in libANGLE/overlay/ which gen_overlay_fonts.py
> processes to create an array of bits, which is processed at runtime to
> create the actual font image (an image with 3 layers).
>
> The overlay widget layout is defined in overlay_widgets.json which
> gen_overlay_widgets.py processes to generate an array of widgetss, each
> of its respective type, and sets their properties, such as color and
> bounding box. The json file allows widgets to align against other
> widgets as well as against the framebuffer edges.
>
> Two compute shaders are implemented to efficiently render the UI:
>
> - OverlayCull: This shader creates a bitset of Text and Graph widgets
> whose bounding boxes intersect a corresponding subgroup processed by
> OverlayDraw. This is done only when the enabled overlay widgets are
> changed (a feature that is not yet implemented) or the surface is
> resized.
> - OverlayDraw: Using the bitsets generated by OverlayCull, values that
> are uniform for each workgroup (set to be equal to hardware subgroup
> size), this shader loops over enabled widgets that can possibly
> intersect the pixel being processed and renders and blends in texts
> and graphs. This is done once per frame on present().
>
> Currently, to enable overlay widgets an environment variable is used.
> For example:
>
> $ export ANGLE_OVERLAY=FPS:VulkanSecondaryCommandBufferPoolWaste
> $ ./hello_triangle --use-angle=vulkan
>
> Possible future work:
>
> - On Android, add settings in developer options and enable widgets based
> on those.
> - Spawn a small server in ANGLE and write an application that sends
> enable/disable commands remotely.
> - Implement overlay for other backends.
>
> Bug: angleproject:3757
> Change-Id: If9c6974d1935c18f460ec569e79b41188bd7afcc
> Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1729440
> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
> Reviewed-by: Jamie Madill <jmadill@chromium.org>
Bug: angleproject:3757
Change-Id: I47915d88b37b6f882c686c2de13fca309a10b572
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1780897
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
|
|
fc58af47
|
2019-09-02T07:46:44
|
|
Revert "Vulkan: Debug overlay"
This reverts commit e54d0f90d1a165404236fd7abd1b05ddd041a686.
Reason for revert: causes compile failure on Linux CFI bot.
Sample build: https://ci.chromium.org/p/chromium/builders/ci/Linux%20CFI/14810
Sample log: https://logs.chromium.org/logs/chromium/buildbucket/cr-buildbucket.appspot.com/8903575125463586160/+/steps/compile/0/stdout?format=raw
Original change's description:
> Vulkan: Debug overlay
>
> A debug overlay system for the Vulkan backend designed with efficiency
> and runtime configurability in mind. Overlay widgets are of two
> fundamental types:
>
> - Text widgets: A single line of text with small, medium or large font.
> - Graph widgets: A bar graph of data.
>
> Built on these, various overlay widget types are defined that gather
> statistics. Five such types are defined with one widget per type as
> example:
>
> - Count: A widget that counts something. VulkanValidationMessageCount
> is an overlay widget of this type that shows the number of validation
> messages received from the validation layers.
> - Text: A generic text. VulkanLastValidationMessage is an overlay
> widget of this type that shows the last validation message.
> - PerSecond: A value that gets reset every second automatically. FPS is
> an overlay widget of this type that simply gets incremented on every
> swap().
> - RunningGraph: A graph of last N values. VulkanCommandGraphSize is an
> overlay of this type. On every vkQueueSubmit, the number of nodes in
> the command graph is accumulated. On every present(), the value is
> taken as the number of nodes for the whole duration of the frame.
> - RunningHistogram: A histogram of last N values. Input values are in
> the [0, 1] range and they are ranked to N buckets for histogram
> calculation. VulkanSecondaryCommandBufferPoolWaste is an overlay
> widget of this type. On vkQueueSubmit, the memory waste from command
> buffer pool allocations is recorded in the histogram.
>
> Overlay font is placed in libANGLE/overlay/ which gen_overlay_fonts.py
> processes to create an array of bits, which is processed at runtime to
> create the actual font image (an image with 3 layers).
>
> The overlay widget layout is defined in overlay_widgets.json which
> gen_overlay_widgets.py processes to generate an array of widgetss, each
> of its respective type, and sets their properties, such as color and
> bounding box. The json file allows widgets to align against other
> widgets as well as against the framebuffer edges.
>
> Two compute shaders are implemented to efficiently render the UI:
>
> - OverlayCull: This shader creates a bitset of Text and Graph widgets
> whose bounding boxes intersect a corresponding subgroup processed by
> OverlayDraw. This is done only when the enabled overlay widgets are
> changed (a feature that is not yet implemented) or the surface is
> resized.
> - OverlayDraw: Using the bitsets generated by OverlayCull, values that
> are uniform for each workgroup (set to be equal to hardware subgroup
> size), this shader loops over enabled widgets that can possibly
> intersect the pixel being processed and renders and blends in texts
> and graphs. This is done once per frame on present().
>
> Currently, to enable overlay widgets an environment variable is used.
> For example:
>
> $ export ANGLE_OVERLAY=FPS:VulkanSecondaryCommandBufferPoolWaste
> $ ./hello_triangle --use-angle=vulkan
>
> Possible future work:
>
> - On Android, add settings in developer options and enable widgets based
> on those.
> - Spawn a small server in ANGLE and write an application that sends
> enable/disable commands remotely.
> - Implement overlay for other backends.
>
> Bug: angleproject:3757
> Change-Id: If9c6974d1935c18f460ec569e79b41188bd7afcc
> Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1729440
> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
> Reviewed-by: Jamie Madill <jmadill@chromium.org>
TBR=geofflang@chromium.org,syoussefi@chromium.org,jmadill@chromium.org
Bug: angleproject:3757
Change-Id: Ib08e2e7b1a9449ca097673acb11655df5d2bbf31
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1778862
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
|
|
e54d0f90
|
2019-06-30T03:26:18
|
|
Vulkan: Debug overlay
A debug overlay system for the Vulkan backend designed with efficiency
and runtime configurability in mind. Overlay widgets are of two
fundamental types:
- Text widgets: A single line of text with small, medium or large font.
- Graph widgets: A bar graph of data.
Built on these, various overlay widget types are defined that gather
statistics. Five such types are defined with one widget per type as
example:
- Count: A widget that counts something. VulkanValidationMessageCount
is an overlay widget of this type that shows the number of validation
messages received from the validation layers.
- Text: A generic text. VulkanLastValidationMessage is an overlay
widget of this type that shows the last validation message.
- PerSecond: A value that gets reset every second automatically. FPS is
an overlay widget of this type that simply gets incremented on every
swap().
- RunningGraph: A graph of last N values. VulkanCommandGraphSize is an
overlay of this type. On every vkQueueSubmit, the number of nodes in
the command graph is accumulated. On every present(), the value is
taken as the number of nodes for the whole duration of the frame.
- RunningHistogram: A histogram of last N values. Input values are in
the [0, 1] range and they are ranked to N buckets for histogram
calculation. VulkanSecondaryCommandBufferPoolWaste is an overlay
widget of this type. On vkQueueSubmit, the memory waste from command
buffer pool allocations is recorded in the histogram.
Overlay font is placed in libANGLE/overlay/ which gen_overlay_fonts.py
processes to create an array of bits, which is processed at runtime to
create the actual font image (an image with 3 layers).
The overlay widget layout is defined in overlay_widgets.json which
gen_overlay_widgets.py processes to generate an array of widgetss, each
of its respective type, and sets their properties, such as color and
bounding box. The json file allows widgets to align against other
widgets as well as against the framebuffer edges.
Two compute shaders are implemented to efficiently render the UI:
- OverlayCull: This shader creates a bitset of Text and Graph widgets
whose bounding boxes intersect a corresponding subgroup processed by
OverlayDraw. This is done only when the enabled overlay widgets are
changed (a feature that is not yet implemented) or the surface is
resized.
- OverlayDraw: Using the bitsets generated by OverlayCull, values that
are uniform for each workgroup (set to be equal to hardware subgroup
size), this shader loops over enabled widgets that can possibly
intersect the pixel being processed and renders and blends in texts
and graphs. This is done once per frame on present().
Currently, to enable overlay widgets an environment variable is used.
For example:
$ export ANGLE_OVERLAY=FPS:VulkanSecondaryCommandBufferPoolWaste
$ ./hello_triangle --use-angle=vulkan
Possible future work:
- On Android, add settings in developer options and enable widgets based
on those.
- Spawn a small server in ANGLE and write an application that sends
enable/disable commands remotely.
- Implement overlay for other backends.
Bug: angleproject:3757
Change-Id: If9c6974d1935c18f460ec569e79b41188bd7afcc
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1729440
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
ed5f7e4d
|
2019-06-07T15:54:00
|
|
Vulkan: Use a persistent CommandPool
Previously transient CommandPool is used for CommandBuffer allocation,
it is created and destroyed per frame. However, profiling found that
CommandPool destroy is very inefficient. So this commit removed the
previous logic and use two preallocated resetable CommandPools (One for
Primary and One for Secondary)
Bug: angleproject:3508
Change-Id: I8b36f2738b082811c3177935c61b10e01acb6947
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1648667
Commit-Queue: Tobin Ehlis <tobine@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
2e43b0f5
|
2019-07-11T17:09:54
|
|
Vulkan: Implement memory barriers
Bug: angleproject:3574
Change-Id: I13d8f4fcd6f1bf9bf3496c91c2c697076e2491bd
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1699005
Reviewed-by: Tobin Ehlis <tobine@google.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
|
|
f92fc916
|
2019-07-15T22:39:23
|
|
Vulkan: Compute shader support
A DispatchHelper class is created as the equivalent of FramebufferHelper
as a command graph resource. There's currently a single dispatcher and
all dispatch calls are recorded on that. Context dirty bits are set up
in such a way that graphics and compute workloads are independently
handled, so that issuing a dispatch call wouldn't cause a framebuffer's
render pass to rebind resources.
Bug: angleproject:3562
Change-Id: Ib96db48297074d99b04324e44b067cfbfd43e333
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1688504
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
6f0780f8
|
2019-07-15T22:04:46
|
|
Vulkan: Rename CommandBufferOwner to RenderPassOwner
It's really only used to track the render pass command buffer. The
change is made in preparation for compute, where the dispatcher command
buffer can change without affecting the render pass.
Bug: angleproject:3562
Change-Id: Ia8246de731d5c6a272fa17d6f8952dc981eca36e
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1703523
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
|
|
da904484
|
2019-07-02T10:49:14
|
|
Vulkan: Implement glInvalidate[Sub]Framebuffer
Additionally, fixes an issue where the read framebuffer was affecting
the render pass desc given to the pipeline. This fix is included with
this CL as its test depends on glInvalidateFramebuffer.
This issue was revealed by 071d2a44 changing the order in which read and
draw framebuffers were synced. Previously, read was synced first,
dirtying the pipeline and then draw was synced fixing it. With the
order reversed, the read framebuffer is the last to changes the
pipeline, leaving it in an invalid state.
Bug: angleproject:3201
Bug: angleproject:3202
Change-Id: Ibebf732a3e3cc081e4865f79dcbaedb467fd9038
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1682468
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Tim Van Patten <timvp@google.com>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
|
|
0bfa5504
|
2019-06-03T10:40:10
|
|
Vulkan: Emulate Transform Feedback with vertex shader output
In ES 3.0 and 3.1, only non-indexed GL_POINTS, GL_LINES and GL_TRIANGLES
is supported for transform feedback. Without tessellation and geometry
shaders, we can calculate the exact location where each vertex transform
output should be written on the CPU, and have each vertex shader
invocation write its data separately to the appropriate location in the
buffer.
This depends on the vertexPipelineStoresAndAtomics Vulkan feature.
Bug: angleproject:3205
Change-Id: I68ccbb80aece597cf20c557a0aee842360fea593
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1645678
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
b1c8dbf3
|
2019-06-14T23:57:26
|
|
Vulkan: Correct synchronization for buffer readback
When mapping buffer memory, a flush is performed if the buffer has
pending operations followed by a finishToSerial to make sure the buffer
is no longer in use by the GPU.
This also implements GLES 3.0 buffer mapping flags:
GL_MAP_INVALIDATE_RANGE_BIT: No-op. Vulkan's vkMapMemory doesn't have
such a feature.
GL_MAP_INVALIDATE_BUFFER_BIT: Same
GL_MAP_FLUSH_EXPLICIT_BIT: Vulkan automatically flushes host memory
writes on vkQueueSubmit, so this is no-op as well.
GL_MAP_UNSYNCHRONIZED_BIT: The flush+finishToSerial call is skipped in
this case.
Bug: angleproject:3213
Change-Id: I6bdb460dffbb57170649f4c9678afbfae331926c
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1661252
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Tim Van Patten <timvp@google.com>
|
|
169ef353
|
2019-06-12T14:42:13
|
|
Vulkan: Fix build with custom secondaries disabled.
We should also add a compile-only target that verifies the build works
as expected.
Bug: angleproject:3117
Change-Id: Ib55969cdd0e670c123cdbe98bd0decf2204e7267
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1650789
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
|
|
ee244c77
|
2019-05-06T10:30:18
|
|
Vulkan: Move command graph and garbage to ContextVk.
To support multithreading, contexts should manage their own command graphs
and garbage. This allows safe access to vulkan resources such as command pools
without thread synchronization.
BUG=angleproject:2464
Change-Id: I930149bc9f0793028761ee05ab50b8c0a4dec98a
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1516515
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
|
|
be394bad
|
2019-05-02T13:41:19
|
|
Vulkan: Reset swap chain image dependency information when aquiring.
If an image was used by a different context previously, it's stored serial
is not relevent. We always know that any work involving the swap chain image
has been completed by the time we aquire a new one.
BUG=angleproject:2464
Change-Id: I0b12b9ff4b9a68593d661344d2d1e2c9d94e4755
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1592043
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
|
|
127990f9
|
2019-04-04T13:52:04
|
|
Vulkan: Use render pass loadOp for scissored clears
At this point, every clear is done through render pass loadOp, except
masked color or stencil clears. The only fallback is clearWithDraw,
that can clear both color and stencil at the same time.
Bug: angleproject:2361
Change-Id: I805fc12475e832ad2f573f665cdfeb766e61a6d0
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1553740
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Tobin Ehlis <tobine@google.com>
|
|
db4ed317
|
2019-03-29T00:32:45
|
|
Vulkan: glClearBuffer* implementation
Refactors FramebufferVk::clear such that specific render targets could
be cleared, with clear values not necessarily set through glClearColor
etc.
FramebufferVk::clearWithRenderPassOp is modified so that loadOp and
clear values are set after the render pass has been registered in the
graph. This allows multiple glClearBuffer calls to coalesce into the
same render pass.
glClearBuffer calls are then implemented simply as calls to the
refactored clear function with the appropriate parameters.
Bug: angleproject:3187
Change-Id: I2fdfcbea5bf244f63ec981b91caca47f5ee3cd3a
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1545204
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Tim Van Patten <timvp@google.com>
|
|
0c128e15
|
2019-03-25T23:50:14
|
|
Vulkan: Use render pass ops to clear images when possible
On tiling GPUs, render pass loadOp and stencilLoadOp can be used to very
cheaply clear an image as it is being render to. This change uses this
feature to clear render targets when possible.
Bug: angleproject:2361
Change-Id: Ic4bdc908873f4802760d549f4893f84a47beac0f
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1500576
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
e810ad90
|
2019-03-26T16:19:17
|
|
Vulkan: dump summary of commands in digraph
This is possible thanks to SecondaryCommandBuffer. Makes life easier
when debugging by not just showing resource type in the nodes, but
actual stream of commands recorded in each.
Bug: angleproject:3136
Change-Id: I125a32ec2966a55330e60930ca088d1a3673a8ba
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1538832
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
|
|
2660b503
|
2019-03-21T12:08:40
|
|
Vulkan: Restore CommandBuffer to namespace vk
Moved vk::CommandBuffer and vk::SecondaryCommandBuffer to vk::priv:: and
aliased vk::CommandBuffer to one or the other. This allows the rest of
the classes to continue seeing vk::CommandBuffer as they used to do.
Used a special alias for the primary command buffer that gets submitted
(vk::PrimaryCommandBuffer).
Bug: angleproject:3136
Change-Id: I61236fd182230991db7395d05e3da3be5e3f45be
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1534456
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
|
|
a8ff8814
|
2019-03-05T07:06:32
|
|
Vulkan:Optimize SecondaryCommandBuffers
RELAND of this commit. Had to fix fuzzer build errors.
Optimize performance of SecondaryCommandBuffers and enable them as the
default build option.
To disable this set angle_enable_custom_vulkan_cmd_buffers=false in
your build args.
This CL enhances the PoolAllocator to have a "fast" mode that can
be enabled at class creation. This mode uses an alignment of 1 byte and
enables a fastAllocation() call that avoids some bookkeeping overhead.
The SecondaryCommandBuffer uses this fastAllocation() function.
Furthermore the fast path of fast allocate, using the current page,
is inlined for maximum speed.
Jamie Madill also updated the SecondaryCommandBuffers to pre-allocate
blocks so that the commands occur linearly in memory. This speeds up
processing with improved cache coherency and minimizes overhead when
recording commands.
Also the core Draw functions and their state updates are all inlined
as well as the common functions to initialize commands and to copy
command pointer data.
This change also includes some new, custom commands. One is
imageBarrier that is a specialized version of pipelineBarrier that only
performs a single image layout transition.
There are customized versions of various Draw commands to minimize
copying of parameters.
There are also specialized commands to bind[Graphics|Compute]Pipeline
that have the pipeline type built in to the command.
More custom commands and command data size optimizations will be made
in follow-on commits.
Bug: angleproject:3136
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1497418
Commit-Queue: Tobin Ehlis <tobine@google.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Change-Id: I621d8f8893308fca240b32390928e8ba0036cf06
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1535385
Reviewed-by: Tobin Ehlis <tobine@google.com>
|
|
896e7811
|
2019-03-22T14:56:33
|
|
Revert "Vulkan:Optimize SecondaryCommandBuffers"
This reverts commit 2219b18c984ed69251f3db3c7b5fd69a2fa68c77.
Reason for revert: Failing to compile on ASAN builders:
https://ci.chromium.org/p/chromium/builders/try/linux-libfuzzer-asan-rel/134782
Currently blocking roll.
Original change's description:
> Vulkan:Optimize SecondaryCommandBuffers
>
> Optimize performance of SecondaryCommandBuffers and enable them as the
> default build option.
> To disable this set angle_enable_custom_vulkan_cmd_buffers=false in
> your build args.
>
> This CL enhances the PoolAllocator to have a "fast" mode that can
> be enabled at class creation. This mode uses an alignment of 1 byte and
> enables a fastAllocation() call that avoids some bookkeeping overhead.
> The SecondaryCommandBuffer uses this fastAllocation() function.
> Furthermore the fast path of fast allocate, using the current page,
> is inlined for maximum speed.
> Jamie Madill also updated the SecondaryCommandBuffers to pre-allocate
> blocks so that the commands occur linearly in memory. This speeds up
> processing with improved cache coherency and minimizes overhead when
> recording commands.
> Also the core Draw functions and their state updates are all inlined
> as well as the common functions to initialize commands and to copy
> command pointer data.
>
> This change also includes some new, custom commands. One is
> imageBarrier that is a specialized version of pipelineBarrier that only
> performs a single image layout transition.
> There are customized versions of various Draw commands to minimize
> copying of parameters.
> There are also specialized commands to bind[Graphics|Compute]Pipeline
> that have the pipeline type built in to the command.
> More custom commands and command data size optimizations will be made
> in follow-on commits.
>
> Bug: angleproject:3136
> Change-Id: I35453cc2656bc8c51f0d84d1adef106900aca9a5
> Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1497418
> Commit-Queue: Tobin Ehlis <tobine@google.com>
> Reviewed-by: Jamie Madill <jmadill@chromium.org>
TBR=tobine@google.com,syoussefi@chromium.org,jmadill@chromium.org
Change-Id: I1c0bfe864ff343eb8ea6c88556523f8715c981d5
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: angleproject:3136
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1535998
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
2219b18c
|
2019-03-05T07:06:32
|
|
Vulkan:Optimize SecondaryCommandBuffers
Optimize performance of SecondaryCommandBuffers and enable them as the
default build option.
To disable this set angle_enable_custom_vulkan_cmd_buffers=false in
your build args.
This CL enhances the PoolAllocator to have a "fast" mode that can
be enabled at class creation. This mode uses an alignment of 1 byte and
enables a fastAllocation() call that avoids some bookkeeping overhead.
The SecondaryCommandBuffer uses this fastAllocation() function.
Furthermore the fast path of fast allocate, using the current page,
is inlined for maximum speed.
Jamie Madill also updated the SecondaryCommandBuffers to pre-allocate
blocks so that the commands occur linearly in memory. This speeds up
processing with improved cache coherency and minimizes overhead when
recording commands.
Also the core Draw functions and their state updates are all inlined
as well as the common functions to initialize commands and to copy
command pointer data.
This change also includes some new, custom commands. One is
imageBarrier that is a specialized version of pipelineBarrier that only
performs a single image layout transition.
There are customized versions of various Draw commands to minimize
copying of parameters.
There are also specialized commands to bind[Graphics|Compute]Pipeline
that have the pipeline type built in to the command.
More custom commands and command data size optimizations will be made
in follow-on commits.
Bug: angleproject:3136
Change-Id: I35453cc2656bc8c51f0d84d1adef106900aca9a5
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1497418
Commit-Queue: Tobin Ehlis <tobine@google.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
134425c7
|
2019-03-15T17:02:17
|
|
Vulkan:Integrate SecondaryCommandBuffers
Integrate the custom SecondaryCommandBuffer type into the CommandGraph
nodes by adding new ANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS define that can
be set in the BUILD gn args with angle_enable_custom_vulkan_cmd_buffers
set to "true."
Initially the custom cmd buffers are disabled by default.
This adds some support functions to SecondaryCommandBuffer to make the
integration easier by matching the wrapped cmd buffer interface:
initialize(), end(), valid().
Bug: angleproject:3136
Change-Id: Ib910554583192550757bb8ce89914e3ea8737988
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1526556
Commit-Queue: Tobin Ehlis <tobine@google.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
de52ca37
|
2019-03-13T14:23:30
|
|
Vulkan: Fix GraphViz dump in presence of queries and fences
A previous refactor made queries no longer a graph resource. This in
turn meant that the query nodes no longer had an ID, which tripped up
the ID assignment when dumping the graph.
This affected fences as well.
Bug: angleproject:2853
Change-Id: I359f8145dca068edaa5fcd5bcb0a231ee050ab76
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1520990
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
4d153383
|
2019-02-26T15:08:11
|
|
Reland "Vulkan: Implement debug markers"
This reverts commit 0c01e36783b20a0177c653490cb4f8ea4a896075.
Reason for revert: Its dependency that was reverted has now relanded:
https://chromium-review.googlesource.com/c/angle/angle/+/1489153
Original change's description:
> Revert "Vulkan: Implement debug markers"
>
> This reverts commit 983e446921946734fe47217c345a8fe2f079319d.
>
> Reason for revert: Depends on a CL that's reverted: https://chromium-review.googlesource.com/c/angle/angle/+/1470605
>
> Original change's description:
> > Vulkan: Implement debug markers
> >
> > Covers both GL_KHR_debug and GL_EXT_debug_marker.
> >
> > Debug markers are used to specify events or hierarchically categorize a
> > set of commands within the command buffer. When debugging, this allows
> > for quicker navigation to the draw calls of interest, and otherwise
> > provides context to debug output.
> >
> > Bug: angleproject:2853
> > Change-Id: Id65e11fc877d9e70b6fd0fae7f0bbbcb1164bf10
> > Reviewed-on: https://chromium-review.googlesource.com/c/1403956
> > Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
> > Reviewed-by: Jamie Madill <jmadill@chromium.org>
> > Reviewed-by: Geoff Lang <geofflang@chromium.org>
>
> TBR=geofflang@chromium.org,jmadill@chromium.org,syoussefi@chromium.org
>
> Change-Id: I7fcfc8683195d396aec61848719f52c0fa049ece
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Bug: angleproject:2853
> Reviewed-on: https://chromium-review.googlesource.com/c/1470606
> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
TBR=geofflang@chromium.org,jmadill@google.com,syoussefi@chromium.org
Bug: angleproject:2853
Change-Id: Ie19ae103244d54dcf7108d5f61c24e318fc44057
Reviewed-on: https://chromium-review.googlesource.com/c/1489154
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@google.com>
|
|
0c01e367
|
2019-02-13T21:27:23
|
|
Revert "Vulkan: Implement debug markers"
This reverts commit 983e446921946734fe47217c345a8fe2f079319d.
Reason for revert: Depends on a CL that's reverted: https://chromium-review.googlesource.com/c/angle/angle/+/1470605
Original change's description:
> Vulkan: Implement debug markers
>
> Covers both GL_KHR_debug and GL_EXT_debug_marker.
>
> Debug markers are used to specify events or hierarchically categorize a
> set of commands within the command buffer. When debugging, this allows
> for quicker navigation to the draw calls of interest, and otherwise
> provides context to debug output.
>
> Bug: angleproject:2853
> Change-Id: Id65e11fc877d9e70b6fd0fae7f0bbbcb1164bf10
> Reviewed-on: https://chromium-review.googlesource.com/c/1403956
> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
> Reviewed-by: Jamie Madill <jmadill@chromium.org>
> Reviewed-by: Geoff Lang <geofflang@chromium.org>
TBR=geofflang@chromium.org,jmadill@chromium.org,syoussefi@chromium.org
Change-Id: I7fcfc8683195d396aec61848719f52c0fa049ece
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: angleproject:2853
Reviewed-on: https://chromium-review.googlesource.com/c/1470606
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
|
|
983e4469
|
2019-01-18T16:04:50
|
|
Vulkan: Implement debug markers
Covers both GL_KHR_debug and GL_EXT_debug_marker.
Debug markers are used to specify events or hierarchically categorize a
set of commands within the command buffer. When debugging, this allows
for quicker navigation to the draw calls of interest, and otherwise
provides context to debug output.
Bug: angleproject:2853
Change-Id: Id65e11fc877d9e70b6fd0fae7f0bbbcb1164bf10
Reviewed-on: https://chromium-review.googlesource.com/c/1403956
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
82fddcb1
|
2019-01-18T14:27:43
|
|
Vulkan: Implement GLsync and EGLSync fence syncs
That is required in GLES 3 for GLsync and EGL_KHR_fence_sync and
EGL_KHR_wait_sync (or EGL 1.5) for EGLSync.
The two constructs (GLsync and EGLSync) have similar semantics and share
the implementation on the Vulkan backend.
The implementation of a fence sync object is achieved through the
combined use of a vkEvent and the implicit vkFence inserted at the end
of every submission. Imagine the following command buffer:
glDraw : Draw
glCreateSync: Set Event <-- insertion of fence sync
glDraw : Draw
: Signal Fence <-- implicit fence at the end of submission
glFlush : Submit
Assume the serial S is associated to this submission. The following
hold:
- If event is set, the fence sync is signaled
- If S is already finished, the fence sync is signaled
- If client is waiting on the sync and S is not yet flushed, there will
be a deadlock (unless multi-threaded and another thread performs the
flush).
The event is used to implement server waits (glWaitSync), as vkEvent is
the only entity the GPU can signal and wait on within the command
buffer. The wait is inserted in the command graph without incurring a
flush, i.e. the wait can be within the same command buffer as event set.
The event however does not support CPU waits (glClientWaitSync).
vkFence is the only entity the CPU can wait on. For client wait
therefore, the following algorithm is used:
- If the event is already set, there's no wait -> already signaled
- If timeout is zero, there's no wait -> timeout expired
- If S is not flushed, flush it to ensure forward progress.
- Wait until S is finished -> condition satisfied / timeout expired.
Bug: angleproject:2466
Change-Id: I678995a6139dd9533fa8ad361a3d292b202c52a4
Reviewed-on: https://chromium-review.googlesource.com/c/1422552
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
c81e7bfe
|
2019-01-18T15:35:55
|
|
Vulkan: refactor CommandGraphResource
Merged back RecordableGraphResource into CommandGraphResource. Queries
didn't really need to be a resource, as they always inserted separate
single-command nodes in the graph. The CommandGraph class is augmented
with a few functions that generate such nodes.
This is in preparation for debug markers, as they too require such
nodes.
Bug: angleproject:2853
Change-Id: I5251a0e0fdd42ed1126921b4acc13687a14af9cd
Reviewed-on: https://chromium-review.googlesource.com/c/1422549
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
85ca1895
|
2019-01-16T13:27:15
|
|
Vulkan: Store reference to context command buffer.
This frees us from checking the FB every draw. Slightly reduces time
spent in all draw methods. Improvement seen on the draw call overhead
tests. Scores went from 28.17 ns/draw to 26.76 ns/draw on my machine.
In a future improvement we could make this command buffer a dirty bit.
Currently it's a bit slower to call a handler function due to the
dispatch table. Likely we could optimize this by reverting back to a
dirty bit switch and inlining the handler functions. That is left for
future work.
Vulkan is happy enough to run multiple RenderPasses and bind different
Pipelines in the same command buffer. But ANGLE defers RenderPass init
until we submit our work. Thus we can only support one RenderPass per
secondary buffer.
Test: angle_perftests DrawCall*/vulkan_null
Bug: angleproject:3014
Change-Id: I89fd0d9e0822400a5c5a16acb5a9c400a0e71ab5
Reviewed-on: https://chromium-review.googlesource.com/c/1393905
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
c759b8b4
|
2019-01-03T15:16:50
|
|
Vulkan: More Vertex Array optimizations.
Inlines a number of Vulkan vertex array methods.
Also changes the way vertex buffers are bound. Note that Vulkan doesn't
support NULL buffer bindings. Thus we create an emulated NULL buffer
to work around the problem of having gaps in the bound vertex buffers.
This allows us to use a single bind call for ranges of vertex buffers
even when there are gaps.
Also changes how vertex array dirty bits are reset. Instead of calling
memset to clear the affected buffers we pass a mutable pointer to the
Vertex Array sync state. This allows us to only reset the dirty bits
that we sync. This saves on the memory clearing time.
Improves perf by about 10% in the Vulkan VBO state change test.
Bug: angleproject:3014
Change-Id: Ib7b742dff7897fc891606a652ea0b64255a24c86
Reviewed-on: https://chromium-review.googlesource.com/c/1390360
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
f83a28a6
|
2018-12-09T03:48:34
|
|
Vulkan: Shader path for framebuffer-to-texture copy
Part 1 in a series of changes to perform image copies on the GPU.
Bug: angleproject:2958
Change-Id: I6264a880865c4738c0866f2dc71af63425fc4118
Reviewed-on: https://chromium-review.googlesource.com/c/1370724
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
e321940c
|
2018-12-08T16:54:14
|
|
Vulkan: Move image clear functionality to UtilsVk
DispatchUtilsVk is renamed to UtilsVk and the functionality in
framebuffer's clearWithDraw() is moved to that class. Eventually, more
fragment-shader-based internal algorithms will be added to this class as
well.
Bug: angleproject:2958
Change-Id: I4753c9cb3288b59cd1ed60fe7a57b9f189704322
Reviewed-on: https://chromium-review.googlesource.com/c/1369284
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
254b32cb
|
2018-11-26T11:58:03
|
|
Vulkan: Make DynamicBuffer use BufferHelper
This is so that the resulting buffers can be written to by the GPU.
Additionally, the class is given the ability to create host-visible or
device-local buffers, making map()-on-init() optional.
This is in preparation for vertex/index transformations in compute.
Bug: angleproject:2958
Change-Id: Ib8f5829e33a1e49fa8f80c70dbde74f313ae49ec
Reviewed-on: https://chromium-review.googlesource.com/c/1351113
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
|
|
b56ddbb7
|
2018-11-02T16:53:18
|
|
Vulkan: Handle VK_ERROR_DEVICE_LOST
By notifying egl::Display that the device is lost,
which marks all gl::Context as lost,
turning all future GL commands to no-ops.
Also clear CommandGraph and destroy in flight resources,
making sure no more commands are executed on the lost device.
Bug: angleproject:2657
Change-Id: I3a1e3646c8ebb37faff507a3c5cec7582a7e05fc
Reviewed-on: https://chromium-review.googlesource.com/c/1323849
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Yuly Novikov <ynovikov@chromium.org>
|
|
03d1a5ed
|
2018-11-12T11:34:24
|
|
Vulkan: Use global buffer barriers.
This switches from using resource barriers for buffers to using global
barriers. This matches the general advised best practice. It also
allows us to combine multiple barriers into one. On a draw we might
combine all the vertex and index barriers into a single barrier call.
We implement this using a bit of extra state tracking in BufferHelper.
Bug: angleproject:2828
Change-Id: I196b368804ff50e60d085687a643e5566ba1c5b6
Reviewed-on: https://chromium-review.googlesource.com/c/1309977
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
|
|
193a284d
|
2018-10-30T17:28:41
|
|
Vulkan: Split vk::CommandGraphResource.
This adds two subclasses: RecordableGraphResource and
QueryGraphResource. Each specializes for Buffer/Image/Frambuffer use
cases and Query use cases respectively. No virtual functions are added
to keep best performance.
We also change the CommandGraph API slightly to optimize away the check
for a barrier resource. This requires exposing the set current barrier
API on the CommandGraph.
Bug: angleproject:2828
Change-Id: I1c23f52bfe04cc682a00b245d63c3ac9a651615d
Reviewed-on: https://chromium-review.googlesource.com/c/1305994
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
c2b576d9
|
2018-10-12T14:45:34
|
|
Vulkan: Implement GL_EXT_disjoint_timer_query
- QueryVk::queryCounter() and relevant utils are implemented for the
sake of Timestamp queries.
- TimeElapsed queries are implemented using two Timestamp queries.
Bug: angleproject:2885
Change-Id: Id181bd97f5a24e7e96b3ea1b819483227e64daf0
Reviewed-on: https://chromium-review.googlesource.com/c/1276806
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
c4765aa7
|
2018-10-12T14:40:29
|
|
Vulkan: fix glGetQueryObject not flushing
glGetQueryObject* requires forward progress in the queue regardless of
whether we are waiting on the result or busy-looping over whether the
results are available. This commit calls flush() if the query has
pending work.
Additionally, this fixes a race condition where glGetQueryObject* may be
accessing a query whose corresponding batch has been submitted but not
yet executed. In such a case, the GPU may not have already reset the
query, so we have to wait on the fence of that batch to make sure the
query results are reliably available.
Bug: angleproject:2855
Change-Id: I977909c6526c0778a13722a8b8b73e54ad0202f6
Reviewed-on: https://chromium-review.googlesource.com/c/1279125
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
563fbaa0
|
2018-10-02T11:22:01
|
|
Vulkan: Implement occlusion queries
Begin and end queries insert an execution barrier in the command graph
to ensure the commands around them are not reordered w.r.t to the query.
Also, these commands cannot be recorded in separate secondary command
buffers. Therefore, special-function nodes are created to perform the
begin and end query calls on the final primary command buffer.
Bug: angleproject:2855
Change-Id: Ie216dfdd6a2009deaaf744fd15d2db6899dd93e9
Reviewed-on: https://chromium-review.googlesource.com/c/1259762
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
|
|
0da73fed
|
2018-10-02T09:31:39
|
|
Vulkan: Add dumping of the command graph to GraphViz.
Dot files are a graph format that can be visualized with GraphViz.
Giving a small visualization output can help diagnose problems with
the graph. For example extra edges or incorrect dependencies.
Bug: angleproject:2379
Change-Id: I544cba11c5e33579b06fef2fb41bad60066a64e4
Reviewed-on: https://chromium-review.googlesource.com/1254383
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Tobin Ehlis <tobine@google.com>
|
|
2d03ff4a
|
2018-09-27T15:04:26
|
|
Vulkan: Make Buffer/Image be CommandGraphResources.
Don't make TextureVk/RenderbufferVk/SurfaceVk/BufferVk own the
manipulation of the command graph. Instead put the operations close to
the buffers and images used to render.
This will lead towards implementing implicit barriers on the command
graph resources.
Bug: angleproject:2828
Change-Id: I07b742b6792c60285b280d6454f90e963d667e0e
Reviewed-on: https://chromium-review.googlesource.com/1246983
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
e2d2270a
|
2018-09-19T08:11:48
|
|
Vulkan: Merge append/beginWriteResource.
The new API is named 'recordCommands'.
These two APIs were basically doing the same thing. We don't need to
have an understanding of creating a new graph node to know that we
want to record some Vulkan commands to a command buffer. The prior
design was actually masking a bug where we would allow appending
commands to a command graph node that had already started a render
pass. Fix this by adding a render pass check to recordCommands.
Also removes 'hasStartedWriteResource' since this method wasn't used
anywhere.
Also renames 'onResourceChanged' to 'finishCurrentCommands'.
Bug: angleproject:2828
Change-Id: I00bd5b893fcfc37172b6c1706cb2f5fc57e79f54
Reviewed-on: https://chromium-review.googlesource.com/1235654
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
|
|
3d61ac27
|
2018-08-28T16:58:55
|
|
Vulkan: More micro-optimizations.
Inlining more methods into headers.
In total the patch series improves performance by about 60-70% in the
Vulkan draw call overhead test.
Bug: angleproject:2786
Change-Id: I70913ac6b3d5836c17c13e249950987df362f203
Reviewed-on: https://chromium-review.googlesource.com/1194883
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
|
|
21061026
|
2018-07-12T23:56:30
|
|
Vulkan: Use angle::Result error handling.
Introduces a vk::Context class to contain an error handler and Renderer
pointer. This abtracts the common code path for ContextVk + DisplayVk.
Removes vk::Error in favor of the POD angle::Result class. There are a
few remaining usages of gl::Error that will have to be cleaned up when
we can change the front-end APIs.
Bug: angleproject:2713
Change-Id: I5e68f223d595c6c561b59d6a85759e5738ed43c6
Reviewed-on: https://chromium-review.googlesource.com/1128924
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
|
|
86ce210a
|
2018-05-22T11:54:42
|
|
Vulkan: Clean up onResourceChanged.
Merge this with the internal method to generate a new command graph
node. Call onResourceChanged internally in beginWriteResource.
Bug: angleproject:2539
Change-Id: Ie33f886c5df7e15ff0b5d690a63fa664b1e964d4
Reviewed-on: https://chromium-review.googlesource.com/1069292
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
|
|
c57ee259
|
2018-05-30T19:53:48
|
|
Vulkan: Clean up object releasing APIs.
This cleans up the confusing releaseResource/releaseObject pair in the
RendererVk class. It also makes getQueueSerial private in ResourceVk
but keeps a public isResourceInUse API for external use.
Bug: angleproject:2539
Change-Id: I6b4f24db16e36130a85ef03fc2c3b26d8d9e1fba
Reviewed-on: https://chromium-review.googlesource.com/1069291
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
|
|
d014c9e6
|
2018-05-18T15:15:59
|
|
Vulkan: Mark some Resource APIs are protected.
This clarifies what is supposed to be called from outside the class to
what should be called internally. The read/write dependency management
is accessible publically. The command buffer access however is private
and should be only used within the class.
Bug: angleproject:2539
Change-Id: Ic25b589d4009de62633d13546be596ecafd0b175
Reviewed-on: https://chromium-review.googlesource.com/1066555
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
|
|
5dca651f
|
2018-05-30T10:53:51
|
|
Vulkan: Make Resource's updateSerial private.
This simplifies the API from the calling resource classes. This method
is called internally instead. beginWriteResource and
appendWriteResource both call updateSerial internally.
Additionally this removes hasStartedRenderPass and instead returns a
boolean from appendToStartedRenderPass indicating success.
Bug: angleproject:2539
Change-Id: Idcf72e6a80dde90e83dabc64644051bb536c6b12
Reviewed-on: https://chromium-review.googlesource.com/1066554
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
8c361c7f
|
2018-05-18T14:36:06
|
|
Vulkan: Remove one API from CommandGraphResource.
'checkResourceInUseAndRefreshDeps' can be implemented using other
APIs. This simplifies the API surface in CommandGraphResource.
Bug: angleproject:2539
Change-Id: I55350ab352c50961736327a867e8403d3b38506b
Reviewed-on: https://chromium-review.googlesource.com/1052070
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
|
|
a5e06071
|
2018-05-18T14:36:05
|
|
Vulkan: Move the CommandGraphNode class to the cpp.
This totally hides the details of the CommandGraphNode implementation
from the rest of the back-end. This continues the simplification of
the graph/resource APIs.
Refactoring change only.
Bug: angleproject:2539
Change-Id: I7e0f286c387599624cfdff6c8972a8e082fe05d3
Reviewed-on: https://chromium-review.googlesource.com/1052069
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
|
|
316c6065
|
2018-05-29T10:49:45
|
|
Vulkan: Call GraphResource instead of GraphNode.
We don't need to use the CommandGraphNode class directly. This CL
consolidates our code so we never call the GraphNodes class directly.
Instead we call operations on GraphResource. This should simplify the
interaction with APIs from the various graph and dependency management
classes in the Vulkan back-end.
A new concept of 'starting' vs 'appending' commands is introduced.
Appending tries to avoid starting new command buffers when possible.
Should not change how the graphs are constructed, and mostly be a
refactoring change. There may be minor behaviour changes to some
commands.
Bug: angleproject:2539
Change-Id: Ia971e5cacb1164b9b3b22fa4a0a55b954d81f10e
Reviewed-on: https://chromium-review.googlesource.com/1052068
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
|
|
bcf467f2
|
2018-05-23T09:46:00
|
|
Vulkan: Encapsulate RenderTargetVk.
This makes the members private and adds more functionality. This moves
more responsibility out of vk::CommandGraphNode and also makes the
RenderPass init in the CommandGraphNode class better encapsulated.
Bug: angleproject:2539
Change-Id: Ia16f3f39cf011548c6473805b8b28e284808e856
Reviewed-on: https://chromium-review.googlesource.com/1040279
Reviewed-by: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|
|
14f4817c
|
2018-04-11T08:43:28
|
|
Vulkan: Simplify viewport / scissor updates
Stop tying the viewport and the scissor together. Instead, we simply
use a very large (0->maxInt) scissor when scissor isn't enabled
and we use the clipped scissor to the renderArea size when its
enabled.
Bug: angleproject:2443
Change-Id: If7454793a050b1833c7d3166ea6b380192085c8f
Reviewed-on: https://chromium-review.googlesource.com/1006996
Commit-Queue: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
|
|
9cceac42
|
2018-03-31T14:19:16
|
|
Vulkan: Update resource dependency semantics.
This removes passing the Serial around to several methods, so that
dependency management is a bit more automatic.
This makes life a bit easier when dealing with state updates when
resources are in use by Vulkan.
The FramebuffeVk no longer stores an extra serial of the last draw,
instead it will trigger creation of a new writing node on a state
change update.
Bug: angleproject:2318
Change-Id: Ie58ec66e6e8644ba4d402c509255c3795d363dd3
Reviewed-on: https://chromium-review.googlesource.com/985201
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
|
|
6c7ab7fe
|
2018-03-31T14:19:15
|
|
Vulkan: Reorganize helper classes.
This renames ResourceVk to vk::CommandGraphResource, which should help
clarify its usage. This also moves LineLoopHandler, ImageHelper, and
the DynamicBuffer and DynamicCommandPool classes into a new vk_helpers
module. This file contains helper classes that manage other resources.
Also this makes DynamicBuffer and DynamicDescriptorPool no longer
inherit from CommandGraphResource. In the future, only Impl objects
will be allowed to be graph resources.
Bug: angleproject:2318
Change-Id: I0fa23da2ac853d90f3c822547a4a314f247cc757
Reviewed-on: https://chromium-review.googlesource.com/985200
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
|
|
1f46bc12
|
2018-02-20T16:09:43
|
|
Vulkan: Add CommandGraph class.
This also renames CommandBufferNode to CommandGraphNode. It also
renames some of the intenal members to more closely represent the
tree relationships (parents/children). This should clean up the
command graph classes and make them a bit easier to understand.
Bug: angleproject:2361
Change-Id: I024bffcc7f4157c78072ef902a3c40a07a08b18a
Reviewed-on: https://chromium-review.googlesource.com/922121
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
|