Commit Graph

1107 Commits

Author SHA1 Message Date
Gabriel Majeri
d4eeea8118 Remove pointers from pipelines API 2020-07-07 19:37:04 +03:00
bors[bot]
35481a5615
Merge #759
759: Bump the maximum bind groups to 8 r=kvark a=kvark

**Connections**
https://github.com/gfx-rs/wgpu-rs/issues/411#issuecomment-653756154

**Description**
This is the hard upper bound. It can be 4, technically, but it would make sense to raise it to at least 8.

**Testing**
Untested, should work still.

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-07-04 15:23:56 +00:00
Dzmitry Malyshau
15f3db7d83
Bump the maximum bind groups to 8 2020-07-04 11:17:51 -04:00
bors[bot]
349c021049
Merge #758
758: Require mapped buffers to be aligned r=cwfitzgerald a=kvark

**Connections**
Likely addresses https://github.com/gfx-rs/wgpu-rs/issues/420

**Description**
We require the size and offsets of mapping to be aligned to 4. This includes buffers mapped at creation.
It allows us to use buffer copy operations to sync the contents.

**Testing**
Not really tested


Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-07-01 14:56:03 +00:00
Dzmitry Malyshau
0929425477 Require mapped buffers to be aligned 2020-07-01 10:50:13 -04:00
bors[bot]
d90beda4e7
Merge #757
757: Validate Dynamic Bindings are In-Bounds r=kvark a=cwfitzgerald

**Connections**

Closes #756 

**Description**

Needed to store some basic info about all dynamic bindings in the bind group.

I wasn't exactly sure where to put the validation function, so I stuck it as an inherent function on the BindGroup. Can be moved if this isn't ideal.

I also moved offset alignment validation into the validation function to help reduce duplication between render/compute.

**Testing**

None of the examples use dynamic indexing, so it's hard to test this as is.

@FlorianUekermann could you possibly test this patch with your repro case?

Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2020-07-01 02:59:39 +00:00
Connor Fitzgerald
b4f2c02941 Validate dynamic bindings are in-bounds 2020-06-30 22:54:24 -04:00
bors[bot]
43c67ac59c
Merge #754
754: Implement MultiDrawIndirect Extensions r=kvark a=cwfitzgerald

**Connections**

Closes #742.

**Description**

These extensions, especially when combined with binding indexing, allow the creation of extremely cpu-efficient gpu powered pipelines.

Adds two extensions allowing various types of multi-draw-indirect
- MULTI_DRAW_INDIRECT (giving `multi_draw_indirect` and `multi_draw_indexed_indirect`)
- MULTI_DRAW_INDIRECT_COUNT (giving `multi_draw_indirect_count` and `multi_draw_indexed_indirect_count`)

This adds what I believe to be an extra restriction on the `*count` family of functions when compared to the underlying api. The buffer _must_ be large enough to draw `max_count` draws, even if that many draws are never drawn. This makes these operations no more unsafe than indirect would be, which is currently safe.

I did not implement these for renderbundles, but there's no reason they couldn't work, so those branches are marked with `unimplemented` as opposed to `unreachable`.

Additional Changes:
- Added some validation to the normal `draw_*_indirect` functions to prevent buffer overruns.
- The DX12 gfx-hal backend requires the strides to _always_ be non-zero, so I modified the normal indirect draws to use explicit strides.
- Made device limits and features `pub(crate)` as they need to be checked in random places in the code.

**Testing**

The change was tested using a modified version of wgpu-rs's texture-array example using a variety of permutations. I have not been able to test regular MULTI_DRAW_INDIRECT on mac, but I see no reason why that wouldn't work.

https://github.com/gfx-rs/wgpu-rs/pull/414

Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2020-06-28 04:47:13 +00:00
Connor Fitzgerald
441b6e0d04 Implement MultiDrawIndirect Extensions 2020-06-27 23:43:23 -04:00
bors[bot]
a79222d502
Merge #755
755: Added independent blending to the list of required device features r=kvark a=Wumpf

Currently, using different blend modes on multiple render targets on the vulkan backend results in this validation error:

```
[2020-06-27T19:51:47Z ERROR gfx_backend_vulkan] 
    VALIDATION [VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (-884533293)] : Validation Error: [ VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 ] Object 0: handle = 0x2ea18313250, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0xcb4717d3 | Invalid Pipeline CreateInfo: If independent blend feature not enabled, all elements of pAttachments must be identical. The Vulkan spec states: If the independent blending feature is not enabled, all elements of pAttachments must be identical (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605)
    object info: (type: DEVICE, hndl: 3204451480144)
```

This is caused by not requesting the independent blend feature from the device.

Given how the wgpu/webgpu API looks like (it makes it very easy to use independent blending) and that there is 100% coverage of this feature on the Vulkan [feature database](https://vulkan.gpuinfo.org/listfeatures.php), I suppose this is a bug, and here's the trivial fix for it 😃 

If this is not meant to be required I'd like to make it an optional feature.

Tested manually in my personal project via wgpu-rs, using Vulkan backend.
(on this [commit](69b660ac5a), uses locally changed gfx-rs/wgpu)

Co-authored-by: Andreas Reich <r_andreas2@web.de>
2020-06-27 22:38:18 +00:00
Andreas Reich
cd87f1e80f added independent blending to the list of required features 2020-06-27 22:33:47 +02:00
bors[bot]
2547c43307
Merge #753
753: Deduplicate BindGroupLayout by value r=cwfitzgerald a=kvark

**Connections**
Fixes #335 

**Description**
BGL now has distinct `MultiRefCount` type with a bit of a hacky logic to support deduplication.
Good review is needed!

**Testing**
Ran wgpu-rs examples.
The actual new logic is NOT tested enough!

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-27 17:01:20 +00:00
Dzmitry Malyshau
925010d117 Revise the atomic ordering on refcounts 2020-06-27 13:00:12 -04:00
Dzmitry Malyshau
e3280aa643 Deduplicate BindGroupLayout by value 2020-06-27 11:13:18 -04:00
bors[bot]
3b6e128877
Merge #752
752: gfx-memory update r=trivial a=kvark

**Connections**
Switches gfx-extras to https://github.com/gfx-rs/gfx-extras/pull/18
Fixes #750

**Description**
Includes important correctness fixes.

**Testing**
Tested on wgpu-rs examples on macOS.
Also, by @cwfitzgerald having the repro case of #750 

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-26 05:16:53 +00:00
Dzmitry Malyshau
448ecc1bb1 gfx-memory update 2020-06-26 01:12:58 -04:00
bors[bot]
b23b9eed16
Merge #751
751: Convert Extensions + Capabilities into Features r=kvark a=cwfitzgerald

**Connections**

Based on upcoming webgpu changes.

**Description**

Does what it says on the tin. The only notable change was classifying the AnisotropicFiltering extension as a WebGPU extension (per https://github.com/gpuweb/gpuweb/issues/696, but no idea if that's the correct interpretation)

**Testing**

Will be tested by upcoming wgpu-rs PR.

Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2020-06-26 05:11:16 +00:00
Connor Fitzgerald
ac62a11619 Convert Extensions + Capabilities into Features 2020-06-26 00:18:46 -04:00
bors[bot]
4164c6af6e
Merge #748
748: Allow intra doc link resolution failures, because they actually succeed when they need to but rust doesnt know r=kvark a=rukai

**Description**
cargo doc will create a lot of warnings due to the intra doc links pointing to wgpu.
The links work fine, but the warnings are no good because they show up when any any crate dependent on wgpu runs cargo doc.

**Testing**
Ran cargo doc from wgpu-types:
* before: warnings from this crate.
* after: no warnings from this crate.

Ran cargo doc from wgpu:
* before: warnings from this crate
* after: no warnings from this crate


Co-authored-by: Rukai <rubickent@gmail.com>
2020-06-24 15:39:04 +00:00
bors[bot]
177a0b39ac
Merge #747
747: Custom implement Debug for RenderCommand and ComputeCommand r=kvark a=kunalmohan

This would avoid unnecessarily long debug logs for Render and Compute passes to some extent. I am not sure if it would be helpful to print `dynamic_offsets` and `string_data` under `BasePass` without the content of related `Compute/Render Command`.
<!--**Connections**
_Link to the issues addressed by this PR, or dependent PRs in other repositories_

**Description**
_Describe what problem this is solving, and how it's solved._
This would avoid 
**Testing**
_Explain how this change is tested._

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: Kunal Mohan <kunalmohan99@gmail.com>
2020-06-24 14:39:00 +00:00
bors[bot]
2d5e032b62
Merge #749
749: Tweak the logging a bit to make debug level usable r=non-controversial a=kvark

**Connections**
Nothing

**Description**
We should have somewhat stricter guidelines on what is ok in Debug level and what not. Previously, we printed all the tracking state on each command buffer and each submit. Since these happen every frame, and the amount of stuff used by a command buffer is not really limited, this resulted in a ton of spam, hiding legitimate Debug messages.

This PR leaves the tracker state outputs for things that are one-time, such as bind groups and render bundles, but moves out the per-frame tracking to the Trace level.

**Testing**
Running wgpu-rs examples.

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-06-24 14:29:58 +00:00
Dzmitry Malyshau
0ed90d001b Tweak the logging a bit to make debug level usable 2020-06-24 10:26:43 -04:00
Rukai
8137934739 Allow intra doc link resolution failures, because they actually succeed when they need to but rust doesnt know 2020-06-24 22:20:22 +10:00
Kunal Mohan
421aa79364 Custom implement Debug for RenderPass and ComputePass 2020-06-24 10:55:46 +05:30
bors[bot]
29e286bdc1
Merge #744
744: Add `backends!` and `backends_map!` macros to code duplication r=kvark a=Kimundi

**Description**
The source code is doing a lot of things duplicated for each backend, which leads to code duplication and harder to read code.
This PR attempts to improve the situation by introducing a `backends!` and `backends_map!` for doing the code duplication automatically.

**Testing**
The macro have unit tests for checking that they work correctly.



Co-authored-by: Marvin Löbel <loebel.marvin@gmail.com>
2020-06-22 23:52:54 +00:00
Marvin Löbel
962f65ac27 Add backends! and backends_map! macros
to reduce code duplication in instance.rs
2020-06-23 00:41:01 +02:00
bors[bot]
285b31a6a1
Merge #740
740: First Phase of Tracing Transition r=kvark a=cwfitzgerald

## Connections

First step in the implementation of #491. https://github.com/gfx-rs/wgpu-rs/pull/395

## Description

This adds the tracing crate, implements a tracing "layer" for chrome tracing, and instruments every entrypoint into wgpu.

Tracing is added as a main dependency. A feature is added called `subscriber` which guards the tracing and default logger implementation, as that adds 3 dependencies. 

The main macro is there to make creating a span a simple one line process. This macro will come in useful in the next couple stages. Use of this macro is used unqualified with it imported into scope as that style allows IntelliJ ides to actually find the macro.

I also removed a really annoying warning that was driving me crazy.

This PR does not make sure the logging output from tracing is up to snuff, that will be done when logging output and conversion is the priority.

Both commits should compile individually, so shouldn't need to be squashed.

## Testing

This PR was tested with the wgpu-rs PR on various examples, as well as my personal project.


Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2020-06-22 18:25:13 +00:00
bors[bot]
63a5f9974e
Merge #743
743: Derive Serialize and Deserialize for HostMap r=kvark a=kunalmohan

**Connections**
_Link to the issues addressed by this PR, or dependent PRs in other repositories_

**Description**
_Describe what problem this is solving, and how it's solved._
Also a switch from `f32::MAX` to `std::f32::MAX`

**Testing**
_Explain how this change is tested._
<!--
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: Kunal Mohan <kunalmohan99@gmail.com>
2020-06-22 13:25:25 +00:00
Kunal Mohan
73b079f226 Derive Serialize and Deserialize for HostMap 2020-06-22 13:08:17 +05:30
Connor Fitzgerald
62a870280f Refine Logging Levels 2020-06-22 02:13:04 -04:00
bors[bot]
6b3863af62
Merge #745
745: Update to latest gfx-extras commit r=kvark a=rukai

Brings the fix for https://github.com/gfx-rs/wgpu-rs/issues/363 into wgpu

Co-authored-by: Lucas Kent <rubickent@gmail.com>
2020-06-22 03:17:28 +00:00
bors[bot]
e47f734e67
Merge #746
746: Fix RODS layout r=trivial a=kvark

**Connections**
Fixes a validation error on the water example:
> VALIDATION [UNASSIGNED-CoreValidation-DrawState-InvalidImageLayout (1303270965)] : Validation Error: [ UNASSIGNED-CoreValidation-DrawState-InvalidImageLayout ] Object 0: handle = 0x5626e376bc90, name = Main Command Encoder, type = VK_OBJECT_TYPE_COMMAND_BUFFER; | MessageID = 0x4dae5635 | Submitted command buffer expects VkImage 0x390000000039[Depth Buffer] (subresource: aspectMask 0x2 array layer 0, mip level 0) to be in layout VK_IMAGE_LAYOUT_GENERAL--instead, current layout is VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL.
    object info: (type: COMMAND_BUFFER, hndl: 94725024955536, name: Main Command Encoder)

**Description**
The problem came from the fact that I totally refactored the part that figures out how attachments I used *after* I thought about the relevant layouts, and somehow let this bug slip in.

**Testing**
Tested on the water example.

Co-authored-by: Dzmitry Malyshau <dmalyshau@mozilla.com>
2020-06-22 03:10:47 +00:00
Dzmitry Malyshau
5860649dd0 Fix RODS layout 2020-06-21 23:08:32 -04:00
Lucas Kent
0fa11e7024 Update to latest gfx-extras commit 2020-06-22 10:38:45 +10:00
Connor Fitzgerald
c1f0021a05 Add Chrome Backend 2020-06-20 20:55:59 -04:00
bors[bot]
93a34b538d
Merge #741
741: Fix the default lod_max_clamp value for the SamplerDescriptor r=kvark a=hasenbanck

**Connections**
As suggested in https://github.com/gfx-rs/wgpu-rs/pull/397

**Description**
The current default value for the ```lod_max_clamp``` of a sampler is 0.
This would deactivate mipmapping alltogether. Setting the default to ```f32::MAX``` makes sure to always enable it. It's the default value apple uses in Metal, it seems to be valid usage in Vulkan (```maxLod``` in ```VkSamplerCreateInfo```) and in DX12 (```MaxLOD``` in ```D3D12_SAMPLER_DESC```).

Co-authored-by: Nils Hasenbanck <nils@hasenbanck.de>
2020-06-21 00:49:09 +00:00
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
Nils Hasenbanck
1f5a55ea13 Fix the default lod_max_clamp value for the SamplerDescriptor
The current default value for the lod_max_clamp of a sampler is 0.
This would deactivate mipmapping alltogether. Setting it to
f32::MAX makes sure to always enable it. It's the default value apple
uses in Metal, it seems to be valid usage in Vulkan (maxLod in
VkSamplerCreateInfo) and in DX12 (MaxLOD in D3D12_SAMPLER_DESC).
2020-06-20 18:03:51 +02: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