spec@arb_shading_language_packing@execution@built-in-functions@fs-packhalf2x16,Fail
spec@arb_shading_language_packing@execution@built-in-functions@vs-packhalf2x16,Fail
spec@arb_tessellation_shader@execution@tcs-tes-levels-out-of-bounds-write,Crash
-spec@arb_texture_buffer_object@texture-buffer-size-clamp,Fail
-spec@arb_texture_buffer_object@texture-buffer-size-clamp@r8ui_texture_buffer_size_via_image,Fail
-spec@arb_texture_buffer_object@texture-buffer-size-clamp@r8ui_texture_buffer_size_via_sampler,Fail
-spec@arb_texture_buffer_object@texture-buffer-size-clamp@rg8ui_texture_buffer_size_via_image,Fail
-spec@arb_texture_buffer_object@texture-buffer-size-clamp@rg8ui_texture_buffer_size_via_sampler,Fail
-spec@arb_texture_buffer_object@texture-buffer-size-clamp@rgba8ui_texture_buffer_size_via_image,Fail
-spec@arb_texture_buffer_object@texture-buffer-size-clamp@rgba8ui_texture_buffer_size_via_sampler,Fail
spec@egl_ext_protected_content@conformance,Fail
spec@ext_framebuffer_blit@fbo-blit-check-limits,Fail
spec@ext_image_dma_buf_import@ext_image_dma_buf_import-sample_uyvy,Fail
spec@arb_shading_language_packing@execution@built-in-functions@fs-packhalf2x16,Fail
spec@arb_shading_language_packing@execution@built-in-functions@vs-packhalf2x16,Fail
spec@arb_tessellation_shader@execution@tcs-tes-levels-out-of-bounds-write,Crash
-spec@arb_texture_buffer_object@texture-buffer-size-clamp,Fail
-spec@arb_texture_buffer_object@texture-buffer-size-clamp@r8ui_texture_buffer_size_via_image,Fail
-spec@arb_texture_buffer_object@texture-buffer-size-clamp@r8ui_texture_buffer_size_via_sampler,Fail
-spec@arb_texture_buffer_object@texture-buffer-size-clamp@rg8ui_texture_buffer_size_via_image,Fail
-spec@arb_texture_buffer_object@texture-buffer-size-clamp@rg8ui_texture_buffer_size_via_sampler,Fail
-spec@arb_texture_buffer_object@texture-buffer-size-clamp@rgba8ui_texture_buffer_size_via_image,Fail
-spec@arb_texture_buffer_object@texture-buffer-size-clamp@rgba8ui_texture_buffer_size_via_sampler,Fail
spec@arb_texture_compression@texwrap formats bordercolor-swizzled,Fail
spec@arb_texture_compression@texwrap formats bordercolor-swizzled@GL_COMPRESSED_RGB- swizzled- border color only,Fail
spec@arb_texture_compression@texwrap formats bordercolor-swizzled@GL_COMPRESSED_RGBA- swizzled- border color only,Fail
if (res->b.b.target == PIPE_BUFFER) {
if (view->access & PIPE_IMAGE_ACCESS_WRITE)
si_mark_image_range_valid(view);
+ uint32_t size = si_clamp_texture_texel_count(screen->max_texture_buffer_size,
+ view->format, view->u.buf.size);
- si_make_buffer_descriptor(screen, res, view->format, view->u.buf.offset, view->u.buf.size,
+ si_make_buffer_descriptor(screen, res, view->format, view->u.buf.offset, size,
desc);
si_set_buf_desc_address(res, view->u.buf.offset, desc + 4);
} else {
si_init_screen_query_functions(sscreen);
si_init_screen_live_shader_cache(sscreen);
+ sscreen->max_texture_buffer_size = sscreen->b.get_param(
+ &sscreen->b, PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE);
+
/* Set these flags in debug_flags early, so that the shader cache takes
* them into account.
*
/* Texture filter settings. */
int force_aniso; /* -1 = disabled */
+ unsigned max_texture_buffer_size;
+
/* Auxiliary context. Mainly used to initialize resources.
* It must be locked prior to using and flushed before unlocking. */
struct pipe_context *aux_context;
/* Buffer resource. */
if (texture->target == PIPE_BUFFER) {
+ uint32_t size = si_clamp_texture_texel_count(sctx->screen->max_texture_buffer_size,
+ state->format, state->u.buf.size);
+
si_make_buffer_descriptor(sctx->screen, si_resource(texture), state->format,
- state->u.buf.offset, state->u.buf.size, view->state);
+ state->u.buf.offset, size, view->state);
return &view->base;
}
return SI_NUM_IMAGE_SLOTS - 1 - slot;
}
+static inline unsigned si_clamp_texture_texel_count(unsigned max_texture_buffer_size,
+ enum pipe_format format,
+ uint32_t size)
+{
+ /* The spec says:
+ * The number of texels in the texel array is then clamped to the value of
+ * the implementation-dependent limit GL_MAX_TEXTURE_BUFFER_SIZE.
+ *
+ * So compute the number of texels, compare to GL_MAX_TEXTURE_BUFFER_SIZE and update it.
+ */
+ unsigned stride = util_format_get_blocksize(format);
+ unsigned num_texels = MIN2(max_texture_buffer_size,
+ size / stride);
+ return num_texels * stride;
+}
+
#ifdef __cplusplus
}
#endif