mirror of
https://github.com/gfx-rs/wgpu.git
synced 2025-02-16 17:02:32 +00:00
hal/gles: fix the VB stride limit
This commit is contained in:
parent
c3de161dd2
commit
43872d4544
@ -202,11 +202,12 @@ impl super::Adapter {
|
||||
gl.get_parameter_i32(glow::MAX_VERTEX_SHADER_STORAGE_BLOCKS) as u32;
|
||||
let fragment_shader_storage_blocks =
|
||||
gl.get_parameter_i32(glow::MAX_FRAGMENT_SHADER_STORAGE_BLOCKS) as u32;
|
||||
|
||||
let vertex_shader_storage_textures =
|
||||
gl.get_parameter_i32(glow::MAX_VERTEX_IMAGE_UNIFORMS) as u32;
|
||||
let fragment_shader_storage_textures =
|
||||
gl.get_parameter_i32(glow::MAX_FRAGMENT_IMAGE_UNIFORMS) as u32;
|
||||
let max_storage_block_size =
|
||||
gl.get_parameter_i32(glow::MAX_SHADER_STORAGE_BLOCK_SIZE) as u32;
|
||||
|
||||
// WORKAROUND:
|
||||
// In order to work around an issue with GL on RPI4 and similar, we ignore a zero vertex ssbo count if there are vertex sstos. (more info: https://github.com/gfx-rs/wgpu/pull/1607#issuecomment-874938961)
|
||||
@ -223,27 +224,12 @@ impl super::Adapter {
|
||||
} else {
|
||||
vertex_shader_storage_blocks.min(fragment_shader_storage_blocks)
|
||||
};
|
||||
|
||||
let max_storage_textures_per_shader_stage = if vertex_shader_storage_textures == 0 {
|
||||
fragment_shader_storage_textures
|
||||
} else {
|
||||
vertex_shader_storage_textures.min(fragment_shader_storage_textures)
|
||||
};
|
||||
|
||||
let mut features = wgt::Features::empty()
|
||||
| wgt::Features::TEXTURE_COMPRESSION_ETC2
|
||||
| wgt::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES;
|
||||
features.set(
|
||||
wgt::Features::DEPTH_CLAMPING,
|
||||
extensions.contains("GL_EXT_depth_clamp"),
|
||||
);
|
||||
features.set(
|
||||
wgt::Features::VERTEX_WRITABLE_STORAGE,
|
||||
ver >= (3, 1)
|
||||
&& (vertex_shader_storage_blocks != 0 || vertex_ssbo_false_zero)
|
||||
&& vertex_shader_storage_textures != 0,
|
||||
);
|
||||
|
||||
let mut downlevel_flags = wgt::DownlevelFlags::empty()
|
||||
| wgt::DownlevelFlags::DEVICE_LOCAL_IMAGE_COPIES
|
||||
| wgt::DownlevelFlags::NON_POWER_OF_TWO_MIPMAPPED_TEXTURES
|
||||
@ -252,7 +238,7 @@ impl super::Adapter {
|
||||
downlevel_flags.set(wgt::DownlevelFlags::COMPUTE_SHADERS, ver >= (3, 1));
|
||||
downlevel_flags.set(
|
||||
wgt::DownlevelFlags::FRAGMENT_WRITABLE_STORAGE,
|
||||
ver >= (3, 1),
|
||||
ver >= (3, 1) && max_storage_block_size != 0,
|
||||
);
|
||||
downlevel_flags.set(wgt::DownlevelFlags::INDIRECT_EXECUTION, ver >= (3, 1));
|
||||
//TODO: we can actually support positive `base_vertex` in the same way
|
||||
@ -264,7 +250,37 @@ impl super::Adapter {
|
||||
);
|
||||
downlevel_flags.set(
|
||||
wgt::DownlevelFlags::VERTEX_STORAGE,
|
||||
ver >= (3, 1) && (vertex_shader_storage_blocks > 0 || vertex_ssbo_false_zero),
|
||||
ver >= (3, 1)
|
||||
&& max_storage_block_size != 0
|
||||
&& (vertex_shader_storage_blocks != 0 || vertex_ssbo_false_zero),
|
||||
);
|
||||
|
||||
let mut features = wgt::Features::empty()
|
||||
| wgt::Features::TEXTURE_COMPRESSION_ETC2
|
||||
| wgt::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES;
|
||||
features.set(
|
||||
wgt::Features::DEPTH_CLAMPING,
|
||||
extensions.contains("GL_EXT_depth_clamp"),
|
||||
);
|
||||
features.set(
|
||||
wgt::Features::VERTEX_WRITABLE_STORAGE,
|
||||
downlevel_flags.contains(wgt::DownlevelFlags::VERTEX_STORAGE)
|
||||
&& vertex_shader_storage_textures != 0,
|
||||
);
|
||||
|
||||
let mut private_caps = super::PrivateCapabilities::empty();
|
||||
private_caps.set(
|
||||
super::PrivateCapabilities::SHADER_BINDING_LAYOUT,
|
||||
ver >= (3, 1),
|
||||
);
|
||||
private_caps.set(
|
||||
super::PrivateCapabilities::SHADER_TEXTURE_SHADOW_LOD,
|
||||
extensions.contains("GL_EXT_texture_shadow_lod"),
|
||||
);
|
||||
private_caps.set(super::PrivateCapabilities::MEMORY_BARRIERS, ver >= (3, 1));
|
||||
private_caps.set(
|
||||
super::PrivateCapabilities::VERTEX_BUFFER_LAYOUT,
|
||||
ver >= (3, 1),
|
||||
);
|
||||
|
||||
let max_texture_size = gl.get_parameter_i32(glow::MAX_TEXTURE_SIZE) as u32;
|
||||
@ -301,29 +317,25 @@ impl super::Adapter {
|
||||
} else {
|
||||
0
|
||||
} as u32,
|
||||
max_vertex_buffers: gl.get_parameter_i32(glow::MAX_VERTEX_ATTRIB_BINDINGS) as u32,
|
||||
max_vertex_buffers: if private_caps
|
||||
.contains(super::PrivateCapabilities::VERTEX_BUFFER_LAYOUT)
|
||||
{
|
||||
gl.get_parameter_i32(glow::MAX_VERTEX_ATTRIB_BINDINGS) as u32
|
||||
} else {
|
||||
16 // should this be different?
|
||||
},
|
||||
max_vertex_attributes: (gl.get_parameter_i32(glow::MAX_VERTEX_ATTRIBS) as u32)
|
||||
.min(super::MAX_VERTEX_ATTRIBUTES as u32),
|
||||
max_vertex_buffer_array_stride: gl.get_parameter_i32(glow::MAX_VERTEX_ATTRIB_STRIDE)
|
||||
as u32,
|
||||
max_vertex_buffer_array_stride: if private_caps
|
||||
.contains(super::PrivateCapabilities::VERTEX_BUFFER_LAYOUT)
|
||||
{
|
||||
gl.get_parameter_i32(glow::MAX_VERTEX_ATTRIB_STRIDE) as u32
|
||||
} else {
|
||||
!0
|
||||
},
|
||||
max_push_constant_size: 0,
|
||||
};
|
||||
|
||||
let mut private_caps = super::PrivateCapabilities::empty();
|
||||
private_caps.set(
|
||||
super::PrivateCapabilities::SHADER_BINDING_LAYOUT,
|
||||
ver >= (3, 1),
|
||||
);
|
||||
private_caps.set(
|
||||
super::PrivateCapabilities::SHADER_TEXTURE_SHADOW_LOD,
|
||||
extensions.contains("GL_EXT_texture_shadow_lod"),
|
||||
);
|
||||
private_caps.set(super::PrivateCapabilities::MEMORY_BARRIERS, ver >= (3, 1));
|
||||
private_caps.set(
|
||||
super::PrivateCapabilities::VERTEX_BUFFER_LAYOUT,
|
||||
ver >= (3, 1),
|
||||
);
|
||||
|
||||
let mut workarounds = super::Workarounds::empty();
|
||||
let r = renderer.to_lowercase();
|
||||
// Check for Mesa sRGB clear bug. See
|
||||
|
Loading…
Reference in New Issue
Block a user