Commit Graph

2761 Commits

Author SHA1 Message Date
bors[bot]
3d9d82dc77 Merge #722
722: Refactor tracking of device last completed submission r=kvark a=kvark

**Connections**
Fixes https://github.com/gfx-rs/wgpu-rs/issues/358

**Description**
We used to track the next submission index in `device.life_guard.submission_index` atomic. This PR changes that to point to the last *done* submission, and also introduces a non-atomic field to keep track of the current/next submission.
This allows us to avoid waiting on the frame semaphore on presentation if the relevant submission is done by then.

**Testing**
Not tested!

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-15 20:58:15 +00:00
bors[bot]
f340882712 [rs] Merge #369
369: Implement SAMPLED_TEXTURE_ARRAY_NON_UNIFORM_INDEXING r=kvark a=cwfitzgerald

This implements https://github.com/gfx-rs/wgpu/pull/715 in wgpu-rs. I haven't changed the example, as I want to actually think up a better example to use and didn't want that to block this. It will change in the future however.

Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2020-06-15 20:44:20 +00:00
Connor Fitzgerald
8b60da572f [rs] Implement SAMPLED_TEXTURE_ARRAY_NON_UNIFORM_INDEXING 2020-06-15 15:09:06 -04:00
bors[bot]
4804fe496b [rs] Merge #373
373: add test case for empty buffer r=kvark a=rukai

Depends on https://github.com/gfx-rs/wgpu/pull/720

Co-authored-by: Rukai <rubickent@gmail.com>
2020-06-15 02:26:27 +00:00
Rukai
4b0534949b [rs] add test case for empty buffer 2020-06-15 12:18:58 +10:00
bors[bot]
2dd3439475 Merge #717
717: Implement Capability/Extension Split r=kvark a=cwfitzgerald

## Connections

Follow up to a discussion we had on #wgpu:matrix.org. 

## Description

Splits capabilities and extensions so that extensions are things you ask for and possibly change behavior and capabilities are passively enabled when their extension (if any) are enabled.

Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2020-06-15 01:46:14 +00:00
bors[bot]
bb3e179d53 Merge #720
720: Fix validation errors + panics on empty buffers r=kvark a=rukai

**Description**
My previous PR left a vulkan validation error when creating an empty buffer.
This PR fixes that and also fixes a panic preventing the compute-example from running with no elements.

**Testing**
Unit test added in wgpu-rs PR. https://github.com/gfx-rs/wgpu-rs/pull/373
<!--
Non-trivial functional changes would need to be tested through:
  - [wgpu-rs](https://github.com/gfx-rs/wgpu-rs) - test the examples.
  - [wgpu-native](https://github.com/gfx-rs/wgpu-native/) - check the generated C header for sanity.

Ideally, a PR needs to link to the draft PRs in these projects with relevant modifications.
See https://github.com/gfx-rs/wgpu/pull/666 for an example.
If you can add a unit/integration test here in `wgpu`, that would be best.
-->


Co-authored-by: Rukai <rubickent@gmail.com>
2020-06-15 01:06:46 +00:00
Rukai
b0475520fa Fix validation errors + panics on empty buffers 2020-06-15 11:04:36 +10:00
Dzmitry Malyshau
835d28b37c Refactor tracking of device last completed submission 2020-06-14 20:19:40 -04:00
bors[bot]
ee7e1c7705 [rs] Merge #370
370: API update for RODS2 r=cwfitzgerald a=kvark

Reflects upstream changes in https://github.com/gfx-rs/wgpu/pull/716
I'm not too happy about the API just yet, has another idea that I'm going to discuss with the group on Monday, hopefully. But we need to get going and not block other wgpu-rs changes, so this should land in some way.

Co-authored-by: Dzmitry Malyshau <dmalyshau@mozilla.com>
2020-06-14 13:25:59 +00:00
Dzmitry Malyshau
6cf328f326 [rs] API update for RODS2 2020-06-14 09:25:13 -04:00
Connor Fitzgerald
5a7fb4c1e5 Implement Capability/Extension Split 2020-06-14 02:32:54 -04:00
bors[bot]
ad34c37127 Merge #716
716: Add RODS texture binding property r=cwfitzgerald a=kvark

This is a follow-up to #712, which I screwed up right before it got in. Fortunately, we still need the code that went in, we just need a little bit more :)

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-13 02:19:35 +00:00
Dzmitry Malyshau
c038c206e7 Add RODS texture binding property 2020-06-12 21:26:19 -04:00
bors[bot]
0357dd80af Merge #712
712: RODS part 2 r=cwfitzgerald a=kvark

**Connections**
Unblocks https://github.com/gfx-rs/wgpu-rs/issues/359
Is a follow-up to RODS part 1 - #685

**Description**
There is a few things in here.

Thing 1: Stronger assertions on the load/store ops of the depth & stencil.

### Thing 2: rewritten tracking of render attachments
Background: from the usage tracker point of view, each subresource can be in either "extend" mode, where it accumulates a single combined usage, or in the "replace" mode, where it goes from one usage to another, producing the relevant transitions on the way.

The problem turned out to come from the fact that the render pass attachments were always tracked in "replace" mode. This is needed because their track don't have a single state: render pass itself encodes a transition of attachments. However, it also means that there was no way to "extend" the usage in RODS scenarios...

So I could see two ways to address this:
  - re-achitecture the tracking a bit more in general, representing it as a sequence of merges.
  - introduce the "prepend()" tracking operator that's *only* used for render pass attachments

I opted for the latter as it seems much less intrusive. The render pass attachments accumulate their usage like everything else in the "extend mode". But right before we are inserting the transitions (between the active command buffer and the pass), we turn the tracking of the attachments from "extend" into "replace" mode by installing the "first" usage according to what we expect it to be.

### Thing 3: missing API for RODS bind groups
The original RODS design missed a problem with Vulkan image layouts. When creating a bind group, one has to specify what layout the image will be in. We always used `ShaderReadOnlyOptimal` until now for texture views. However, in RODS scenarios this has to be `DepthStencilReadOnlyOptimal`. Luckily, it's compatible with sampling from the shader, but we still need to know about this when creating the bind group.

**Testing**
Tested on the modified water example provided in https://github.com/gfx-rs/wgpu-rs/issues/359#issuecomment-642167269 

Added a few tests to the buffer implementation of the new `prepend()` operator.

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-12 23:58:36 +00:00
Dzmitry Malyshau
8ebfdb0c34 Rewrite the render attachment tracking using the new prepend() operation. 2020-06-12 19:54:50 -04:00
bors[bot]
373a1c2bf0 Merge #715
715: Implement SAMPLED_TEXTURE_ARRAY_NON_UNIFORM_INDEXING r=kvark a=cwfitzgerald

## Connections

Closes #483. Extends support for #106.

## Description

This forwards the descriptor indexing features gfx-hal up to wgpu. 

Note this PR also changes the name of the `TEXTURE_BINDING_ARRAY` to `SAMPLED_TEXTURE_BINDING_ARRAY` to be more consistent with extensions.

## Testing

Texture-array example was simply extended to use descriptor indexing. This works on all platforms that the feature is supported. (thanks @stararawn)



Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2020-06-12 23:53:37 +00:00
Connor Fitzgerald
bfcc369bc7 Implement SAMPLED_TEXTURE_ARRAY_NON_UNIFORM_INDEXING 2020-06-12 19:52:10 -04:00
bors[bot]
91c4849be9 [rs] Merge #357
357: Render bundle support, use in msaa-line example r=cwfitzgerald a=kvark



Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-12 23:07:36 +00:00
Dzmitry Malyshau
5e2d0d7680 [rs] Render bundle support, use in msaa-line example 2020-06-11 22:59:40 -04:00
bors[bot]
b0b99d89b7 Merge #714
714: Track buffers and textures in the future submissions r=cwfitzgerald a=kvark

**Connections**
Fixes https://github.com/gfx-rs/wgpu-rs/issues/362

**Description**
When we do `write_buffer` or have it mapped on creation, we record the copy command in a "pending command buffer", which is only actually executed on the next submission. We adjust the submission index on the buffer accordingly.
If the buffer is dropped *before* the next submission, and there happens to be a `maintain()` step, there is code that checks if the buffer-associated submission is one of the currently executing ones. If it doesn't fine an active one, it considers the last-used submission to already be done with, which is precisely what is not happening here, since the submission hasn't been scheduled yet.

The solution here is to always defer suspecting buffers and textures for deletion till the next submission. The buffers and textures are the only objects that may have "future" submission index, due to `write_buffer` and `write_texture`.

**Testing**
Confirmed on Linux.

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-12 02:15:11 +00:00
Dzmitry Malyshau
e843067018 Track buffers and textures in the future submissions 2020-06-11 20:45:53 -04:00
bors[bot]
55eec80920 [rs] Merge #360
360: Implement TEXTURE_BINDING_ARRAY extension r=kvark a=cwfitzgerald

This extends https://github.com/gfx-rs/wgpu/pull/711 into wgpu-rs.

Notable changes: 
- Added an example showing off both this extension and the future descriptor indexing extension.
- Changed the framework so there is a static function showing what extensions you need. This is provided by the trait,, which defaults to no extensions, so existing examples and new ones don't have to care about extensions.

Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2020-06-11 20:37:46 +00:00
Connor Fitzgerald
200025e3cc [rs] Implement TEXTURE_BINDING_ARRAY extension 2020-06-11 16:36:53 -04:00
bors[bot]
475696af59 Merge #286
286: RenderBundle support r=cwfitzgerald a=kvark

Implements the API of https://github.com/gpuweb/gpuweb/pull/301

The general concept here is having re-usable command streams, which seems much desired given that our command buffers are not reusable.

Currently, only "software" render bundles are supported. That means, they are just smaller chunks of render pass commands, not backed by any driver object.

TODO:
- [x] https://github.com/gfx-rs/wgpu-rs/pull/357
- [x] https://github.com/gfx-rs/wgpu-native/pull/37
- [x] figure out the lifetime solution

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-11 19:46:31 +00:00
Dzmitry Malyshau
7aa5753701 Re-architecture the bundles using normalized command streams.
This is a major change in how the bundles are implemented. Instead of
transparently injecting them into the pass command stream, we are now
treating bundles as first-class API objects and API tracing them
accordingly. The bundle contains a normalized command stream that is
very easy to inject into a native command buffer multiple times.
2020-06-11 15:34:45 -04:00
Dzmitry Malyshau
afc4517db1 Render bundle reset states, updated descriptors 2020-06-11 15:28:55 -04:00
Dzmitry Malyshau
fbf35e43a6 Render bundles 2020-06-11 15:28:55 -04:00
bors[bot]
9842d2065f [rs] Merge #366
366: Fix buffer mapping examples r=cwfitzgerald a=lachlansneff

Fixes #364 

Co-authored-by: Lachlan Sneff <lachlan.sneff@gmail.com>
2020-06-11 16:09:55 +00:00
Lachlan Sneff
5216fd3285 [rs] Fix buffer mapping examples 2020-06-11 12:07:47 -04:00
bors[bot]
64ae59072d Merge #711
711: Implement Descriptor Array Extension r=kvark a=cwfitzgerald

## Connections

Blocked on https://github.com/gfx-rs/gfx/pull/3269 and does some funky git overrides to get CI to return meaningful results what will be removed once that PR lands and is published.

## Description

This PR implements the `TEXTURE_BINDING_ARRAY` native extension. This allows users to specify a uniform sized array of textures for use in shaders.

As a corollary, this PR rustifies the Bind Group and Bind Group Layout interface. Two main actions were taken when doing this:
 - Types that were able to be shared among wgt, wgc, and wgpu-rs were moved into wgt.
 - Types that had references to other wgpu-rs specific structures were duplicated into wgc with wgpu-rs structures replaced with the appropriate ID. Notes were added to the wgc types that they were duplicated directly from wgpu-rs.

From what I can tell, this resulted in a significant reduction in code complexity when dealing with bind groups, favoring strong types over runtime assertions.

Naga validation of arrays of textures was not implemented.

Documentation was added to extensions to help users understand what underlying tech was being relied on as well as the platforms it should be expected to work on. I think this pattern should be implemented across the board for extensions as it makes them much more user friendly to use.

## Testing

There is an example included in the wgpu-rs PR which was used for testing this feature. It worked on DX12, Vulkan, and Metal (MSL > 2.0), as was expected.

Additionally the other examples were run and are still verified to run.


Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2020-06-11 03:36:36 +00:00
Connor Fitzgerald
57b3b72571 Implement TEXTURE_BINDING_ARRAY extension 2020-06-10 22:35:25 -04:00
bors[bot]
031f6f58c5 [rs] Merge #356
356: Add generic ranges to buffer mapping api and make it safe. r=kvark a=lachlansneff

[Rendered](https://charted.space/notes/wgpu-rs/wgpu/struct.Buffer.html)

The safety issues with the current api (being able to unmap while still holding a slice to mapped data) are fixed by having `get_mapped_range` and `get_mapped_range_mut` return `BufferView` and `BufferViewMut`, which notify the buffer that those ranges are no longer being used when they're dropped. `Buffer.unmap` asserts that the list of mapped ranges is empty, therefore it is safe.

Co-authored-by: Lachlan Sneff <lachlan.sneff@gmail.com>
2020-06-10 17:46:36 +00:00
Lachlan Sneff
785f26bab3 [rs] Add BufferView and BufferViewMut and fix safety issues with mapped range. 2020-06-09 20:03:28 -04:00
bors[bot]
847d9748f5 Merge #710
710: Empty buffers are created internally with a size of 1 r=cwfitzgerald a=rukai

**Connections**
closes https://github.com/gfx-rs/wgpu/issues/709

**Description**
Empty buffers can be succesfully created.

**Testing**
Tested on my project and it resolves the above issue.


Co-authored-by: Rukai <rubickent@gmail.com>
2020-06-09 15:05:56 +00:00
Rukai
2e65615663 Empty buffers are created internally with a size of 1 2020-06-09 23:43:49 +10:00
bors[bot]
f8a68cd987 Merge #708
708: Implement Mappable Primary Buffers Extension r=kvark a=cwfitzgerald

**Connections**

#675 made `MAP_WRITE | STORAGE` on buffers not possible. This extension re-enables it. 

**Description**

UMA systems rejoice everywhere.

**Testing**

Hopefully it didn't break since it was usable a week or so ago, so this shouldn't need testing...

**Review Notes**

The name could be changed, particularly if primary has a certain meaning wrt buffers. It just seemed a reasonable description.

Knowing my luck, I got the bitflags call wrong...

Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2020-06-09 02:35:26 +00:00
Connor Fitzgerald
4258c60f46 Implement mappable primary buffers extension 2020-06-08 22:33:47 -04:00
bors[bot]
72eb0c7450 [rs] Merge #354
354: Update to wgpu with shader validation r=cwfitzgerald a=kvark

Depends on https://github.com/gfx-rs/wgpu/pull/705

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-09 01:04:24 +00:00
Dzmitry Malyshau
30c8b64883 [rs] Update to wgpu with shader validation 2020-06-08 20:54:39 -04:00
bors[bot]
eaf8f4af87 Merge #707
707: Implement Bounds Checking on Buffers to Buffer and Texture Copies r=kvark a=cwfitzgerald

**Connections**
Closes #362, closes #554
This addresses issues found by @gretchenfrage when accidentally writing off the end of a texture causing a DEVICE_LOST error.

**Description**

Adds bounds checks to write_texture and write_buffer, and copy_texture_to_texture and friends. The bounds checking functions themselves follow guidance from the webgpu standard. 

This doesn't make wgpu 100% to all the checks required by the standard, but takes care of the ones related to bounds and buffer overruns.

**Testing**

I tested this against all the examples, including intentionally making mistakes in texture copies, with this successfully catching those errors.

**Review Notes**

This code should be picked through fairly closely, as it's very likely there's some typos due to the close-but-not-quite repetition that these tests require. There's a bunch of LOC, but they are fairly boring and should be easy to understand.

I have tried to give assert messages that are as descriptive as possible, but if there is a message that could be changed to be more clear, let me know.

One thing that could change is the location of the functions. I left them where I originally wrote them, before I realized that the functions on queue also needed bounds checking, but they could have a better home elsewhere, maybe even their own file.

Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2020-06-08 15:29:51 +00:00
Connor Fitzgerald
27ffe5026b Implement buffer to any copy bounds checking 2020-06-08 11:24:33 -04:00
bors[bot]
5f567e227a [rs] Merge #350
350: Implement Extensions Interface r=kvark a=cwfitzgerald

This implements https://github.com/gfx-rs/wgpu/pull/703 in wgpu-rs. Notable changes include the removal of the anisotropic field from the examples, in favor of the now mandatory `..Default::default()` syntax.

Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2020-06-08 05:21:23 +00:00
Connor Fitzgerald
28c0b8f3a3 [rs] Implement extensions interface as described in wgpu#691 2020-06-08 01:20:00 -04:00
bors[bot]
bbd28889e0 Merge #706
706: Return errors on create_render_pipeline r=cwfitzgerald a=kvark

This is a follow-up to #705 that switches `create_render_pipeline` to return `Result`.

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-08 05:05:09 +00:00
Dzmitry Malyshau
cdbf23813a Return errors on create_render_pipeline 2020-06-08 01:04:26 -04:00
bors[bot]
b76c8481f8 Merge #705
705: Shader input/output validation r=cwfitzgerald a=kvark

**Connections**
Fixes #269
It still has a few gaps (like the `storage_texture_format` matching, bugs, optional validation), but the main logic is there. Anything else should come in smaller issues as a follow-up.

**Description**
The main goal of this PR is to validate:
  - vertex input stage against VS inputs
  - VS outputs against FS inputs
  - FS outputs against the pipeline attachment formats

I figured that `WGPU_SHADER_VALIDATION` environment is not a great path forward. It doesn't help engine authors, for example. So I'm switching it to just a boolean field in `DeviceDescriptor`. Hopefully, we'll remove it soon :)

**Testing**
Just running wgpu-rs examples - https://github.com/gfx-rs/wgpu-rs/pull/354

Review notes: the commit in the middle just moves stuff around. I think it's easier to just review the first and the last commit, ignoring the middle.

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-07 14:41:25 +00:00
Dzmitry Malyshau
16424bfac1 Add shader validation bool to DeviceDescriptor 2020-06-06 23:34:04 -04:00
Dzmitry Malyshau
5f57c9eae2 Move the shader validation logic into a module 2020-06-06 23:21:42 -04:00
Dzmitry Malyshau
6e1e2e037e Validate stage inputs/outputs 2020-06-06 23:21:42 -04:00