gallium: add PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT

This is required for any serious constant buffer support.
Constant buffer offsets on ATI and NVIDIA DX10 and DX11 GPUs must be
a multiple of 256.

In OpenGL, this can be queried via GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT.
This commit is contained in:
Marek Olšák
2012-04-24 17:31:17 +02:00
parent 8c655f499c
commit 1b749dc34f
12 changed files with 28 additions and 1 deletions

View File

@@ -116,6 +116,8 @@ The integer capabilities:
* ``PIPE_CAP_USER_CONSTANT_BUFFERS``: Whether user constant buffers are * ``PIPE_CAP_USER_CONSTANT_BUFFERS``: Whether user constant buffers are
supported. If not, the state tracker must upload constants which are not in hw supported. If not, the state tracker must upload constants which are not in hw
resources. resources.
* ``PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT``: Describes the required
alignment of pipe_constant_buffer::buffer_offset.

View File

@@ -208,6 +208,9 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
return 0; return 0;
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
return 16;
/* Features we can lie about (boolean caps). */ /* Features we can lie about (boolean caps). */
case PIPE_CAP_OCCLUSION_QUERY: case PIPE_CAP_OCCLUSION_QUERY:
return is->debug.lie ? 1 : 0; return is->debug.lie ? 1 : 0;

View File

@@ -163,6 +163,8 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
case PIPE_CAP_USER_INDEX_BUFFERS: case PIPE_CAP_USER_INDEX_BUFFERS:
case PIPE_CAP_USER_CONSTANT_BUFFERS: case PIPE_CAP_USER_CONSTANT_BUFFERS:
return 1; return 1;
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
return 16;
default: default:
return 0; return 0;
} }

View File

@@ -82,6 +82,8 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_USER_INDEX_BUFFERS: case PIPE_CAP_USER_INDEX_BUFFERS:
case PIPE_CAP_USER_CONSTANT_BUFFERS: case PIPE_CAP_USER_CONSTANT_BUFFERS:
return 1; return 1;
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
return 16;
/* nv4x capabilities */ /* nv4x capabilities */
case PIPE_CAP_BLEND_EQUATION_SEPARATE: case PIPE_CAP_BLEND_EQUATION_SEPARATE:
case PIPE_CAP_NPOT_TEXTURES: case PIPE_CAP_NPOT_TEXTURES:

View File

@@ -154,6 +154,8 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_USER_INDEX_BUFFERS: case PIPE_CAP_USER_INDEX_BUFFERS:
case PIPE_CAP_USER_CONSTANT_BUFFERS: case PIPE_CAP_USER_CONSTANT_BUFFERS:
return 1; return 1;
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
return 256;
case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY: case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_VERTEX_BUFFER_STRIDE_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_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:

View File

@@ -144,6 +144,8 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_USER_INDEX_BUFFERS: case PIPE_CAP_USER_INDEX_BUFFERS:
case PIPE_CAP_USER_CONSTANT_BUFFERS: case PIPE_CAP_USER_CONSTANT_BUFFERS:
return 1; return 1;
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
return 256;
case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY: case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_VERTEX_BUFFER_STRIDE_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_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:

View File

@@ -110,6 +110,9 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
case PIPE_CAP_USER_CONSTANT_BUFFERS: case PIPE_CAP_USER_CONSTANT_BUFFERS:
return 1; return 1;
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
return 16;
case PIPE_CAP_GLSL_FEATURE_LEVEL: case PIPE_CAP_GLSL_FEATURE_LEVEL:
return 120; return 120;

View File

@@ -407,6 +407,9 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
case PIPE_CAP_USER_CONSTANT_BUFFERS: case PIPE_CAP_USER_CONSTANT_BUFFERS:
return 1; return 1;
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
return 256;
case PIPE_CAP_GLSL_FEATURE_LEVEL: case PIPE_CAP_GLSL_FEATURE_LEVEL:
return rscreen->glsl_feature_level; return rscreen->glsl_feature_level;

View File

@@ -349,6 +349,9 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
case PIPE_CAP_USER_CONSTANT_BUFFERS: case PIPE_CAP_USER_CONSTANT_BUFFERS:
return 1; return 1;
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
return 256;
case PIPE_CAP_GLSL_FEATURE_LEVEL: case PIPE_CAP_GLSL_FEATURE_LEVEL:
return debug_get_bool_option("R600_GLSL130", FALSE) ? 130 : 120; return debug_get_bool_option("R600_GLSL130", FALSE) ? 130 : 120;

View File

@@ -142,6 +142,8 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
case PIPE_CAP_USER_INDEX_BUFFERS: case PIPE_CAP_USER_INDEX_BUFFERS:
case PIPE_CAP_USER_CONSTANT_BUFFERS: case PIPE_CAP_USER_CONSTANT_BUFFERS:
return 1; return 1;
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
return 16;
default: default:
return 0; return 0;
} }

View File

@@ -164,6 +164,8 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
case PIPE_CAP_USER_INDEX_BUFFERS: case PIPE_CAP_USER_INDEX_BUFFERS:
case PIPE_CAP_USER_CONSTANT_BUFFERS: case PIPE_CAP_USER_CONSTANT_BUFFERS:
return 1; return 1;
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
return 16;
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
{ {

View File

@@ -478,7 +478,8 @@ enum pipe_cap {
PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY = 66, PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY = 66,
PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY = 67, PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY = 67,
PIPE_CAP_USER_INDEX_BUFFERS = 68, PIPE_CAP_USER_INDEX_BUFFERS = 68,
PIPE_CAP_USER_CONSTANT_BUFFERS = 69 PIPE_CAP_USER_CONSTANT_BUFFERS = 69,
PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT = 70
}; };
/** /**