Commit Graph

1070 Commits

Author SHA1 Message Date
Connor Fitzgerald
1b2cf3cd22 Add Tracing and Instrument Entry Points 2020-06-20 14:26:50 -04:00
bors[bot]
c7be94047d Merge #739
739: Remove Peek-Poke r=cwfitzgerald a=kvark

**Connections**
Related to https://github.com/gfx-rs/wgpu/issues/738
Related to https://github.com/djg/peek-poke/issues/10

**Description**
As of #726 , the buffers have a minimum binding size that has to include the shader struct size. It, therefore, can't be zero.
We can remove the hacks we had previously and switch fully to the idiomatic `Option<NonZeroU64>`.

Peek-poke doesn't `NonZeroU64` and friends, so this made me reconsider the user of it entirely. Today, render bundles as well as the Player already represent command streams using a much rustier method. I tried to move everything to this method now, and I think this is going to work much better, and safer.

**Testing**
wgpu-rs works - https://github.com/gfx-rs/wgpu-rs/pull/396

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-20 17:52:29 +00:00
bors[bot]
75d2e47849 Merge #736
736: Validate sampler type in `create_bind_group` r=kvark a=GabrielMajeri

**Connections**
Fixes #588 

**Description**
* Makes `create_bind_group` return a `Result`, and adds a new `binding_model::BindGroupError` enum.
* Converts _some_ assertions from `create_bind_group` into `Err`s
* Validates that the type of sampler declared in the bind group layout (comparison or not) is the same as the one of the actual sampler.

**Testing**
Tested locally on the `shadow` example in `wgpu-rs`. ~Will follow up with a PR in that repo with the updated API.~ https://github.com/gfx-rs/wgpu-rs/pull/398

Co-authored-by: Gabriel Majeri <gabriel.majeri6@gmail.com>
2020-06-20 14:31:32 +00:00
Gabriel Majeri
69b41dc0d3 Validate sampler type in create_bind_group 2020-06-20 17:29:58 +03:00
Dzmitry Malyshau
365f4e8786 Remove peek-poke.
There was a lot of highly unsafe use of serialization based on peek-poke that we
weren't entirely happy with. It's replaced by just serializing the passes now.
Also, switch BufferSize to Option<NonZero>.
2020-06-20 00:39:11 -04:00
bors[bot]
c8a1734044 Merge #737
737: Naga update with offsets and strides r=kvark a=kvark

**Connections**
Successor to #692
Updates Naga for API in https://github.com/gfx-rs/naga/pull/77

**Description**
Building with rust nightly and latest Naga

**Testing**
Ran wgpu-rs examples

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-19 19:58:52 +00:00
Dzmitry Malyshau
0c0ecc3b09 Switch to latest nightly 2020-06-19 11:16:29 -04:00
Dzmitry Malyshau
ff5c9c9ffc Naga update with offsets and strides 2020-06-19 11:14:29 -04:00
bors[bot]
d7d0fd5dfe Merge #735
735: Set descriptor set name when creating bind group r=kvark a=GabrielMajeri

**Description**
There is a [`TODO` in the code](a02a566841/wgpu-core/src/device/mod.rs (L1428)) for setting the descriptor set name when creating a bind group. It was blocked on https://github.com/gfx-rs/gfx-extras/pull/5

**Testing**
Tested with examples from `wgpu-rs`.

Co-authored-by: Gabriel Majeri <gabriel.majeri6@gmail.com>
2020-06-19 13:33:32 +00:00
Gabriel Majeri
eba5c7e877 Set descriptor set name when creating bind group 2020-06-19 15:20:01 +03:00
bors[bot]
a02a566841 Merge #730
730: Move backend selection to `Instance::new()` r=kvark a=Kimundi

**Connections**
Addresses https://github.com/gfx-rs/wgpu-rs/issues/337
Corresponding wgpu-rs PR: https://github.com/gfx-rs/wgpu-rs/pull/385

**Description**
This makes early backend selection possible in `Instance::new`, by only attempting to instantiate requested backends. The actual selection in `pick_adapter()` (necessarily) remains unchanged, and can be used to further restrict the request.

**Testing**
Unsure what to do here
<!--
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: Marvin Löbel <loebel.marvin@gmail.com>
2020-06-18 20:39:52 +00:00
Marvin Löbel
e88e3517d6 Move backend selection to Instance::new()
Keep `inputs` parameter in `pick_adapter()`
2020-06-18 22:04:16 +02:00
bors[bot]
b4410c5d8a Merge #732
732: Dummy workspace crate r=cwfitzgerald a=kvark

Basically, it makes sure that doing `cargo check` locally in the workspace is all you need.

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-18 19:11:53 +00:00
Dzmitry Malyshau
0cd1ec2981 Dummy workspace crate 2020-06-18 14:16:04 -04:00
bors[bot]
584468e34b Merge #728
728: Documentation Pass r=kvark a=cwfitzgerald

## Connections

https://github.com/gfx-rs/wgpu-rs/issues/378.

## Description

The number one thing that people want to see in wgpu is better documentation, so this is a first step towards that goal. It unifies the documentation and fills it out so most things have documentation that is at least marginally helpful.

Notable changes to existing documentation:
- Removes "a" and "the" at the beginning of short descriptions.
- Always use the phrasing `Describes a...` for descriptors that create objects directly.
- Always use a period at the end of short descriptions.

## Testing

No code was changed, but constant monitoring of cargo doc output in wgpu-rs was used to keep everything completely consistent.

## TODO

- [x] wgpu-rs PR (https://github.com/gfx-rs/wgpu-rs/pull/380)


Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2020-06-18 13:04:42 +00:00
bors[bot]
6bca38feed Merge #729
729: Basic support for WGSL r=cwfitzgerald a=kvark

Connections:
- https://github.com/gfx-rs/wgpu-rs/pull/384

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-18 01:25:42 +00:00
Connor Fitzgerald
15d0db8828 wgpu-types documentation pass 2020-06-17 20:38:44 -04:00
Dzmitry Malyshau
35a1dc3076 Basic support for WGSL 2020-06-17 13:29:43 -04:00
bors[bot]
fc2dd481b2 Merge #726
726: Basic support for minBufferBindingSize r=cwfitzgerald a=kvark

**Connections**
Has basic (partial) implementation of https://github.com/gpuweb/gpuweb/pull/678
wgpu-rs update - https://github.com/gfx-rs/wgpu-rs/pull/377

**Description**
This change allows users to optionally specify the expected minimum binding size for buffers. We are then validating this against both the pipelines and bind groups.
If it's not provided, we'll need to validate at draw time - this PR doesn't do this (focus on API changes first).
It also moves out the `read_spirv`, since wgpu-types wasn't the right home for it ever.

**Testing**
Tested on wgpu-rs examples

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-17 03:25:27 +00:00
bors[bot]
9e699330a8 Merge #719
719: Implement debug marker support r=kvark a=krupitskas

**Connections**
Closes https://github.com/gfx-rs/wgpu/issues/697

**Description**
Looks like because I've once pushed forward reset branch to my master, previous pull request https://github.com/gfx-rs/wgpu/pull/713
show that there no commits and it automatically was closed :/

**Testing**
Not tested yet


Co-authored-by: Nikita Krupitskas <krupitskas@icloud.com>
2020-06-16 21:34:27 +00:00
Nikita Krupitskas
eaf2acb43a Implement debug marker support 2020-06-17 00:05:52 +03:00
bors[bot]
5853fb9557 Merge #727
727: Update gfx-memory to the latest commit r=kvark a=rukai

**Description**
In order to test potential fixes for https://github.com/gfx-rs/wgpu-rs/issues/363 we need wgpu master to be able to easily test changes to gfx-memory.

Assuming we dont have any large regressions I think it could be nice to release wgpu 0.6 before merging this. I dont mind either way though.

**Testing**
I ran some wgpu-rs examples.


Co-authored-by: Rukai <rubickent@gmail.com>
2020-06-16 14:11:28 +00:00
Rukai
71ee7d868a Update gfx-memory to the latest commit 2020-06-16 23:32:35 +10:00
Dzmitry Malyshau
a27341bd6d Basic support for minBufferBindingSize 2020-06-16 00:34:58 -04:00
bors[bot]
d1deae5747 Merge #723
723: Always use DepthStencilReadOnlyOptimal for sampled depth r=kvark a=kvark

**Connections**
This is a follow-up to #712  that reverts the API changes but also fixes our internal logic to work better.

**Description**
It solves the problem of image layouts by always using a RODS layout on depth images, when sampled.

**Testing**
Tested on https://github.com/gfx-rs/wgpu-rs/pull/375


Co-authored-by: Dzmitry Malyshau <dmalyshau@mozilla.com>
2020-06-15 21:45:51 +00:00
Dzmitry Malyshau
58de765961 Always use DepthStencilReadOnlyOptimal for sampled depth 2020-06-15 17:45:19 -04:00
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]
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
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]
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]
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]
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]
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