uint32_t data)
{
struct pipe_sampler_view *texture = texstate->textures[data];
-
switch (contents) {
case QUNIFORM_TEXTURE_WIDTH:
- return u_minify(texture->texture->width0,
- texture->u.tex.first_level);
+ if (texture->target == PIPE_BUFFER) {
+ return texture->u.buf.size /
+ util_format_get_blocksize(texture->format);
+ } else {
+ return u_minify(texture->texture->width0,
+ texture->u.tex.first_level);
+ }
case QUNIFORM_TEXTURE_HEIGHT:
return u_minify(texture->texture->height0,
texture->u.tex.first_level);
case QUNIFORM_TEXTURE_DEPTH:
+ assert(texture->target != PIPE_BUFFER);
return u_minify(texture->texture->depth0,
texture->u.tex.first_level);
case QUNIFORM_TEXTURE_ARRAY_SIZE:
+ assert(texture->target != PIPE_BUFFER);
return texture->texture->array_size;
case QUNIFORM_TEXTURE_LEVELS:
+ assert(texture->target != PIPE_BUFFER);
return (texture->u.tex.last_level -
texture->u.tex.first_level) + 1;
default:
switch (contents) {
case QUNIFORM_IMAGE_WIDTH:
- return u_minify(image->base.resource->width0,
- image->base.u.tex.level);
+ if (image->base.resource->target == PIPE_BUFFER) {
+ return image->base.u.buf.size /
+ util_format_get_blocksize(image->base.format);
+ } else {
+ return u_minify(image->base.resource->width0,
+ image->base.u.tex.level);
+ }
case QUNIFORM_IMAGE_HEIGHT:
+ assert(image->base.resource->target != PIPE_BUFFER);
return u_minify(image->base.resource->height0,
image->base.u.tex.level);
case QUNIFORM_IMAGE_DEPTH:
+ assert(image->base.resource->target != PIPE_BUFFER);
return u_minify(image->base.resource->depth0,
image->base.u.tex.level);
case QUNIFORM_IMAGE_ARRAY_SIZE:
+ assert(image->base.resource->target != PIPE_BUFFER);
return image->base.resource->array_size;
default:
unreachable("Bad texture size field");
struct v3d_sampler_view *sview = v3d_sampler_view(psview);
int variant = 0;
+ /* If we are being asked by the compiler to write parameter 1, then we
+ * need that. So if we are at this point, we should expect to have a
+ * sampler and psampler. As an additional assert, we can check that we
+ * are not on a texel buffer case, as these don't have a sampler.
+ */
+ assert(psview->target != PIPE_BUFFER);
+ assert(sampler);
+ assert(psampler);
+
if (sampler->border_color_variants)
variant = sview->sampler_variant;
#endif
static void
+v3d_setup_texture_shader_state_from_buffer(struct V3DX(TEXTURE_SHADER_STATE) *tex,
+ struct pipe_resource *prsc,
+ enum pipe_format format,
+ unsigned offset,
+ unsigned size)
+{
+ struct v3d_resource *rsc = v3d_resource(prsc);
+
+ tex->image_depth = 1;
+ tex->image_width = size / util_format_get_blocksize(format);
+
+ /* On 4.x, the height of a 1D texture is redefined to be the
+ * upper 14 bits of the width (which is only usable with txf).
+ */
+ tex->image_height = tex->image_width >> 14;
+
+ tex->image_width &= (1 << 14) - 1;
+ tex->image_height &= (1 << 14) - 1;
+
+ /* Note that we don't have a job to reference the texture's sBO
+ * at state create time, so any time this sampler view is used
+ * we need to add the texture to the job.
+ */
+ tex->texture_base_pointer =
+ cl_address(NULL, rsc->bo->offset + offset);
+}
+
+static void
v3d_setup_texture_shader_state(struct V3DX(TEXTURE_SHADER_STATE) *tex,
struct pipe_resource *prsc,
int base_level, int last_level,
#endif
v3dx_pack(map, TEXTURE_SHADER_STATE, tex) {
- v3d_setup_texture_shader_state(&tex, prsc,
- cso->u.tex.first_level,
- cso->u.tex.last_level,
- cso->u.tex.first_layer,
- cso->u.tex.last_layer);
+ if (prsc->target != PIPE_BUFFER) {
+ v3d_setup_texture_shader_state(&tex, prsc,
+ cso->u.tex.first_level,
+ cso->u.tex.last_level,
+ cso->u.tex.first_layer,
+ cso->u.tex.last_layer);
+ } else {
+ v3d_setup_texture_shader_state_from_buffer(&tex, prsc,
+ cso->format,
+ cso->u.buf.offset,
+ cso->u.buf.size);
+ }
tex.srgb = util_format_is_srgb(cso->format);
* have to copy to a temporary tiled texture.
*/
if (!rsc->tiled && !(prsc->target == PIPE_TEXTURE_1D ||
- prsc->target == PIPE_TEXTURE_1D_ARRAY)) {
+ prsc->target == PIPE_TEXTURE_1D_ARRAY ||
+ prsc->target == PIPE_BUFFER)) {
struct v3d_resource *shadow_parent = rsc;
struct pipe_resource tmpl = {
.target = prsc->target,
struct pipe_resource *prsc = iview->base.resource;
v3dx_pack(map, TEXTURE_SHADER_STATE, tex) {
- v3d_setup_texture_shader_state(&tex, prsc,
- iview->base.u.tex.level,
- iview->base.u.tex.level,
- iview->base.u.tex.first_layer,
- iview->base.u.tex.last_layer);
+ if (prsc->target != PIPE_BUFFER) {
+ v3d_setup_texture_shader_state(&tex, prsc,
+ iview->base.u.tex.level,
+ iview->base.u.tex.level,
+ iview->base.u.tex.first_layer,
+ iview->base.u.tex.last_layer);
+ } else {
+ v3d_setup_texture_shader_state_from_buffer(&tex, prsc,
+ iview->base.format,
+ iview->base.u.buf.offset,
+ iview->base.u.buf.size);
+ }
tex.swizzle_r = translate_swizzle(PIPE_SWIZZLE_X);
tex.swizzle_g = translate_swizzle(PIPE_SWIZZLE_Y);