782: Add check while trying to remove uninserted Ids r=kvark a=kunalmohan
**Connections**
_Link to the issues addressed by this PR, or dependent PRs in other repositories_
An attempt to fix#781
regression from #776
**Description**
_Describe what problem this is solving, and how it's solved._
When we used `VecMap`, it simply returned `None` for even out of bounds access to the map (We depended on it returning `None`). After #776 , we get a panic. So adding a simple index check before accessing it fixes this issue.
**Testing**
_Explain how this change is tested._
Tested on wgpu-rs examples with the changes in https://github.com/gfx-rs/wgpu-rs/pull/430. All examples run fine except the `cube` which segfaults.
<!--
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>
779: Fix hub insertion r=kvark a=kvark
**Connections**
Fixes#778
Follow-up to #776
**Description**
Problem was `resize_with` takes new length, not a difference.
**Testing**
Untested
Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
434: recreate swapchain on framework.rs examples on resize, ref #352 r=kvark,cwfitzgerald a=m4b
There still seem to be residual race condition like errors w.r.t. resizing on at least x11, but this does fix the panic on x11.
Co-authored-by: m4b <m4b.github.io@gmail.com>
773: Error handling for data transfer API r=kvark a=GabrielMajeri
**Connections**
Work on the error model described in #376
**Description**
Removes assertions from the transfer functions, instead returning a custom error type.
**Testing**
Checked with `player` and `wgpu-rs`: https://github.com/gfx-rs/wgpu-rs/pull/430
Co-authored-by: Gabriel Majeri <gabriel.majeri6@gmail.com>
433: make env_logger a dev dependency r=kvark a=cart
env_logger is only used in examples and adds a good number of dependencies to the build tree that arent needed
Co-authored-by: Carter Anderson <mcanders1@gmail.com>
769: Implement and Validate all WebGPU Limits r=kvark a=cwfitzgerald
**Connections**
None?
**Description**
This adds all the limits that webgpu has currently. It also validates the values.
The main piece of code here is `BindingTypeMaxCountValidator` and `PerStageBindingTypeCounter` which provides the interface for figuring out the maximum per-stage counts in the pipeline. For each `BindGroupLayout` a `BindingTypeMaxCountValidator`is put together during creation using all of the bindings. Then the `BindingTypeMaxCountValidator`s are combined into a single max. This is then validated against the max limits.
Each commit should be independently testable and are grouped by responsibility.
**Testing**
I modified the wgpu-rs example framework to ask for extremely reduced limits and then tested various examples to verify it properly accepted/rejected based on the actual limit.
Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
766: Validate set_bind_group is within bounds of limit r=kvark a=cwfitzgerald
**Connections**
~~Don't think there are any.~~ Would provide a nicer error message for https://github.com/gfx-rs/wgpu-rs/issues/411.
**Description**
Implements checks related to our only limit.
**Testing**
Untested
Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
763: Remove raw pointers from the render pipelines API r=kvark a=GabrielMajeri
**Connections**
Rust-ification of API, as part of #689
**Description**
The objective is to get rid of raw pointers in the render pipeline descriptor and associated structures.
**Testing**
Checked with `player` and the `trace` feature, and with `wgpu-rs` with the changes in https://github.com/gfx-rs/wgpu-rs/pull/425
Co-authored-by: Gabriel Majeri <gabriel.majeri6@gmail.com>
764: Remove UnsafeFeatures as we decided the top level guard is not useful r=cwfitzgerald a=kvark
**Connections**
Reverts part of #691 about unsafe extensions
**Description**
Top-level unsafe is not sound. We still need unsafety close to the spot where it's triggered.
**Testing**
untested
Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
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>
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>
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>
414: Implement MultiDrawIndirect Extensions r=kvark a=cwfitzgerald
The wgpu-rs component of https://github.com/gfx-rs/wgpu/pull/754.
I didn't include the modifications to the example as they are particularly awful and ugly. One of my next steps following this is to make an example of both binding indexing and these multi-draw extensions.
Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
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>
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>