Skip to content

Instantly share code, notes, and snippets.

@anarsoul
Created December 28, 2019 00:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anarsoul/c59d359b521cdfdebc308c173aa1ee85 to your computer and use it in GitHub Desktop.
Save anarsoul/c59d359b521cdfdebc308c173aa1ee85 to your computer and use it in GitHub Desktop.
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_gather.c b/src/gallium/auxiliary/gallivm/lp_bld_gather.c
index e991b0dc375..4686a94d314 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_gather.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_gather.c
@@ -105,7 +105,7 @@ lp_build_gather_elem(struct gallivm_state *gallivm,
* two >= 32). On x86 it doesn't matter, however.
* We should be able to guarantee full alignment for any kind of texture
* fetch (except ARB_texture_buffer_range, oops), but not vertex fetch
- * (there's PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY and friends
+ * (there's PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT and friends
* but I don't think that's quite what we wanted).
* For ARB_texture_buffer_range, PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT
* looks like a good fit, but it seems this cap bit (and OpenGL) aren't
@@ -186,7 +186,7 @@ lp_build_gather_elem_vec(struct gallivm_state *gallivm,
* two >= 32). On x86 it doesn't matter, however.
* We should be able to guarantee full alignment for any kind of texture
* fetch (except ARB_texture_buffer_range, oops), but not vertex fetch
- * (there's PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY and friends
+ * (there's PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT and friends
* but I don't think that's quite what we wanted).
* For ARB_texture_buffer_range, PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT
* looks like a good fit, but it seems this cap bit (and OpenGL) aren't
diff --git a/src/gallium/auxiliary/util/u_screen.c b/src/gallium/auxiliary/util/u_screen.c
index 70eb4a27d74..0b6297f14ba 100644
--- a/src/gallium/auxiliary/util/u_screen.c
+++ b/src/gallium/auxiliary/util/u_screen.c
@@ -116,12 +116,12 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen,
case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
case PIPE_CAP_USER_VERTEX_BUFFERS:
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_COMPUTE:
return 0;
+ case PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT:
+ case PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT:
+ case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_ALIGNMENT:
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
/* GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT default value. */
return 1;
diff --git a/src/gallium/auxiliary/util/u_vbuf.c b/src/gallium/auxiliary/util/u_vbuf.c
index a8b57aafed3..e493384c64f 100644
--- a/src/gallium/auxiliary/util/u_vbuf.c
+++ b/src/gallium/auxiliary/util/u_vbuf.c
@@ -279,15 +279,15 @@ boolean u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps,
}
}
- caps->buffer_offset_unaligned =
- !screen->get_param(screen,
- PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY);
- caps->buffer_stride_unaligned =
- !screen->get_param(screen,
- PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY);
- caps->velem_src_offset_unaligned =
- !screen->get_param(screen,
- PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY);
+ caps->buffer_offset_alignment =
+ screen->get_param(screen,
+ PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT);
+ caps->buffer_stride_alignment =
+ screen->get_param(screen,
+ PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT);
+ caps->velem_src_offset_alignment =
+ screen->get_param(screen,
+ PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_ALIGNMENT);
caps->user_vertex_buffers =
screen->get_param(screen, PIPE_CAP_USER_VERTEX_BUFFERS);
caps->max_vertex_buffers =
@@ -297,9 +297,9 @@ boolean u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps,
if (caps->max_vertex_buffers < 16)
fallback = TRUE;
- if (!caps->buffer_offset_unaligned ||
- !caps->buffer_stride_unaligned ||
- !caps->velem_src_offset_unaligned ||
+ if (caps->buffer_offset_alignment != 1 ||
+ caps->buffer_stride_alignment != 1 ||
+ caps->velem_src_offset_alignment != 1||
(!(flags & U_VBUF_FLAG_NO_USER_VBOS) && !caps->user_vertex_buffers)) {
fallback = TRUE;
}
@@ -812,8 +812,7 @@ u_vbuf_create_vertex_elements(struct u_vbuf *mgr, unsigned count,
util_format_get_blocksize(ve->native_format[i]);
if (ve->ve[i].src_format != format ||
- (!mgr->caps.velem_src_offset_unaligned &&
- ve->ve[i].src_offset % 4 != 0)) {
+ (ve->ve[i].src_offset % mgr->caps.velem_src_offset_alignment)) {
ve->incompatible_elem_mask |= 1 << i;
ve->incompatible_vb_mask_any |= 1 << ve->ve[i].vertex_buffer_index;
} else {
@@ -837,10 +836,12 @@ u_vbuf_create_vertex_elements(struct u_vbuf *mgr, unsigned count,
ve->incompatible_vb_mask_all = ~ve->compatible_vb_mask_any & used_buffers;
/* Align the formats and offsets to the size of DWORD if needed. */
- if (!mgr->caps.velem_src_offset_unaligned) {
+ if (mgr->caps.velem_src_offset_alignment != 1) {
for (i = 0; i < count; i++) {
- ve->native_format_size[i] = align(ve->native_format_size[i], 4);
- driver_attribs[i].src_offset = align(ve->ve[i].src_offset, 4);
+ ve->native_format_size[i] = align(ve->native_format_size[i],
+ mgr->caps.velem_src_offset_alignment);
+ driver_attribs[i].src_offset = align(ve->ve[i].src_offset,
+ mgr->caps.velem_src_offset_alignment);
}
}
@@ -918,8 +919,8 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
}
enabled_vb_mask |= 1 << dst_index;
- if ((!mgr->caps.buffer_offset_unaligned && vb->buffer_offset % 4 != 0) ||
- (!mgr->caps.buffer_stride_unaligned && vb->stride % 4 != 0)) {
+ if ((vb->buffer_offset % mgr->caps.buffer_offset_alignment) ||
+ (vb->stride % mgr->caps.buffer_stride_alignment)) {
incompatible_vb_mask |= 1 << dst_index;
real_vb->buffer_offset = vb->buffer_offset;
real_vb->stride = vb->stride;
diff --git a/src/gallium/auxiliary/util/u_vbuf.h b/src/gallium/auxiliary/util/u_vbuf.h
index 797fbb7681f..867e993df2a 100644
--- a/src/gallium/auxiliary/util/u_vbuf.h
+++ b/src/gallium/auxiliary/util/u_vbuf.h
@@ -46,11 +46,9 @@ struct u_vbuf;
struct u_vbuf_caps {
enum pipe_format format_translation[PIPE_FORMAT_COUNT];
- /* Whether vertex fetches don't have to be 4-byte-aligned. */
- /* TRUE if hardware supports it. */
- unsigned buffer_offset_unaligned:1;
- unsigned buffer_stride_unaligned:1;
- unsigned velem_src_offset_unaligned:1;
+ unsigned buffer_offset_alignment;
+ unsigned buffer_stride_alignment;
+ unsigned velem_src_offset_alignment;
/* Whether the driver supports user vertex buffers. */
unsigned user_vertex_buffers:1;
diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst
index 7e6964282f5..de1679da0fd 100644
--- a/src/gallium/docs/source/screen.rst
+++ b/src/gallium/docs/source/screen.rst
@@ -124,15 +124,13 @@ The integer capabilities:
buffers. If not, the state tracker must upload all data which is not in hw
resources. If user-space buffers are supported, the driver must also still
accept HW resource buffers.
-* ``PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY``: This CAP describes a hw
- limitation. If true, pipe_vertex_buffer::buffer_offset must always be aligned
- to 4. If false, there are no restrictions on the offset.
-* ``PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY``: This CAP describes a hw
- limitation. If true, pipe_vertex_buffer::stride must always be aligned to 4.
+* ``PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT``: Describes hardware
+ alignment requirement of pipe_vertex_buffer::buffer_offset
+* ``PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT``: Describes hardware
+ alignment requirement of pipe_vertex_buffer::stride
If false, there are no restrictions on the stride.
-* ``PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY``: This CAP describes
- a hw limitation. If true, pipe_vertex_element::src_offset must always be
- aligned to 4. If false, there are no restrictions on src_offset.
+* ``PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_ALIGNMENT``: Describe hardware
+ alignment requirement of pipe_vertex_element::src_offset
* ``PIPE_CAP_COMPUTE``: Whether the implementation supports the
compute entry points defined in pipe_context and pipe_screen.
* ``PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT``: Describes the required
diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c
index 75d3e1e6877..c5fb3a94443 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
@@ -143,14 +143,17 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_VERTEX_SHADER_SATURATE:
case PIPE_CAP_TEXTURE_BARRIER:
case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_TGSI_TEXCOORD:
case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
return 1;
+
+ case PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT:
+ case PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT:
+ case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_ALIGNMENT:
+ return 4;
+
+ case PIPE_CAP_TGSI_TEXCOORD:
case PIPE_CAP_NATIVE_FENCE_FD:
return screen->drm_version >= ETNA_DRM_VERSION_FENCE_FD;
case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
index d467cae6b00..6ba0231081e 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -189,9 +189,6 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_SEAMLESS_CUBE_MAP:
case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
case PIPE_CAP_STRING_MARKER:
case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
@@ -199,6 +196,11 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_INVALIDATE_BUFFER:
return 1;
+ case PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT:
+ case PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT:
+ case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_ALIGNMENT:
+ return 4;
+
case PIPE_CAP_PACKED_UNIFORMS:
return !is_a2xx(screen);
diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c
index a22eaa95abb..4209a2fe2a5 100644
--- a/src/gallium/drivers/i915/i915_screen.c
+++ b/src/gallium/drivers/i915/i915_screen.c
@@ -300,9 +300,6 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
case PIPE_CAP_DRAW_INDIRECT:
diff --git a/src/gallium/drivers/lima/lima_screen.c b/src/gallium/drivers/lima/lima_screen.c
index 9610018115d..c34382eaafa 100644
--- a/src/gallium/drivers/lima/lima_screen.c
+++ b/src/gallium/drivers/lima/lima_screen.c
@@ -143,6 +143,11 @@ lima_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
return 0;
+ case PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT:
+ case PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT:
+ case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_ALIGNMENT:
+ return 64;
+
default:
return u_pipe_screen_get_param_defaults(pscreen, param);
}
diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
index 8258614aebe..46501a0ae2b 100644
--- a/src/gallium/drivers/llvmpipe/lp_screen.c
+++ b/src/gallium/drivers/llvmpipe/lp_screen.c
@@ -225,10 +225,6 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
return GALLIVM_HAVE_CORO;
case PIPE_CAP_USER_VERTEX_BUFFERS:
return 1;
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
- return 0;
case PIPE_CAP_TGSI_TEXCOORD:
case PIPE_CAP_DRAW_INDIRECT:
return 1;
diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
index c4b514cfa61..55f59eabc4e 100644
--- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
+++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
@@ -96,12 +96,13 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
case PIPE_CAP_TGSI_TEXCOORD:
case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
return 1;
+ case PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT:
+ case PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT:
+ case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_ALIGNMENT:
+ return 4;
/* nv35 capabilities */
case PIPE_CAP_DEPTH_BOUNDS_TEST:
return eng3d->oclass == NV35_3D_CLASS || eng3d->oclass >= NV40_3D_CLASS;
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
index ad35bd8cd42..0fee4bfefb4 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
+++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
@@ -242,9 +242,6 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
case PIPE_CAP_SHADER_STENCIL_EXPORT:
case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_TGSI_TEXCOORD:
case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
case PIPE_CAP_TEXTURE_GATHER_SM5:
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
index c7779c26548..9b7be053930 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
@@ -316,9 +316,6 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
case PIPE_CAP_SHADER_STENCIL_EXPORT:
case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_FAKE_SW_MSAA:
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
case PIPE_CAP_VERTEXID_NOBASE:
diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c
index b2954c0751d..920f4294796 100644
--- a/src/gallium/drivers/panfrost/pan_screen.c
+++ b/src/gallium/drivers/panfrost/pan_screen.c
@@ -162,8 +162,8 @@ panfrost_get_param(struct pipe_screen *screen, enum pipe_cap param)
return is_deqp;
/* TODO: Where does this req come from in practice? */
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- return 1;
+ case PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT:
+ return 4;
case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
return 4096;
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
index 1300596db27..37702b8bf13 100644
--- a/src/gallium/drivers/r300/r300_screen.c
+++ b/src/gallium/drivers/r300/r300_screen.c
@@ -311,10 +311,10 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
return !r300screen->caps.has_tcl;
/* HWTCL-only features / limitations. */
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
- return r300screen->caps.has_tcl;
+ case PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT:
+ case PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT:
+ case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_ALIGNMENT:
+ return r300screen->caps.has_tcl ? 4 : 1;
case PIPE_CAP_TGSI_TEXCOORD:
return 0;
diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
index 831d348b430..f6ab1551602 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -287,9 +287,6 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
case PIPE_CAP_TGSI_INSTANCEID:
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_START_INSTANCE:
case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
@@ -319,6 +316,11 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
return 1;
+ case PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT:
+ case PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT:
+ case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_ALIGNMENT:
+ return 4;
+
case PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET:
/* Optimal number for good TexSubImage performance on Polaris10. */
return 64 * 1024 * 1024;
diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c
index 4b63d6b7522..cf6cda546e3 100644
--- a/src/gallium/drivers/radeonsi/si_get.c
+++ b/src/gallium/drivers/radeonsi/si_get.c
@@ -205,10 +205,10 @@ static int si_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_MAX_SHADER_BUFFER_SIZE:
return MIN2(sscreen->info.max_alloc_size, INT_MAX);
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
- return LLVM_VERSION_MAJOR < 9 && !sscreen->info.has_unaligned_shader_loads;
+ case PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT:
+ case PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT:
+ case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_ALIGNMENT:
+ return (LLVM_VERSION_MAJOR < 9 && !sscreen->info.has_unaligned_shader_loads) ? 4 : 1;
case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
return sscreen->info.has_sparse_vm_mappings ?
diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c
index 41910c10a31..c606f5e7d3d 100644
--- a/src/gallium/drivers/softpipe/sp_screen.c
+++ b/src/gallium/drivers/softpipe/sp_screen.c
@@ -181,9 +181,6 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
return 16;
case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_TEXTURE_MULTISAMPLE:
return 0;
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c
index dc521cf3f9c..144f506cfb9 100644
--- a/src/gallium/drivers/svga/svga_screen.c
+++ b/src/gallium/drivers/svga/svga_screen.c
@@ -403,10 +403,10 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
return 0;
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
return 64;
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
- return 1; /* need 4-byte alignment for all offsets and strides */
+ case PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT:
+ case PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT:
+ case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_ALIGNMENT:
+ return 4; /* need 4-byte alignment for all offsets and strides */
case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
return 2048;
case PIPE_CAP_MAX_VIEWPORTS:
diff --git a/src/gallium/drivers/swr/swr_screen.cpp b/src/gallium/drivers/swr/swr_screen.cpp
index b2e3132b2a7..f4ac192e321 100644
--- a/src/gallium/drivers/swr/swr_screen.cpp
+++ b/src/gallium/drivers/swr/swr_screen.cpp
@@ -290,10 +290,10 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param)
return (swr_screen(screen)->msaa_max_count > 1) ? 0 : 1;
/* fetch jit change for 2-4GB buffers requires alignment */
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
- return 1;
+ case PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT:
+ case PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT:
+ case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_ALIGNMENT:
+ return 4;
/* unsupported features */
case PIPE_CAP_ANISOTROPIC_FILTER:
diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c
index 869e25cc46c..26840113afa 100644
--- a/src/gallium/drivers/virgl/virgl_screen.c
+++ b/src/gallium/drivers/virgl/virgl_screen.c
@@ -177,9 +177,6 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param)
case PIPE_CAP_START_INSTANCE:
return vscreen->caps.caps.v1.bset.start_instance;
case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
return 0;
case PIPE_CAP_QUERY_TIMESTAMP:
diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
index 76afb5a311c..b0457370b23 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -736,9 +736,9 @@ enum pipe_cap
PIPE_CAP_ESSL_FEATURE_LEVEL,
PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION,
PIPE_CAP_USER_VERTEX_BUFFERS,
- PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY,
- PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY,
- PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY,
+ PIPE_CAP_VERTEX_BUFFER_OFFSET_ALIGNMENT,
+ PIPE_CAP_VERTEX_BUFFER_STRIDE_ALIGNMENT,
+ PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_ALIGNMENT,
PIPE_CAP_COMPUTE,
PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT,
PIPE_CAP_START_INSTANCE,
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment