vrend: make texture buffer objects more robust

This allows the tbo code to properly detect if we are using a buffer
as a texture or not, instead of relying on GL_TEXTURE_BUFFER being used.

We also don't need to special case generate the tbo texture id until
sampler bind time.

Reviewed-by: Elie Tournier <elie.tournier@collabora.com>
macos/master
Dave Airlie 7 years ago
parent 89d8ff8a88
commit 792b99d9db
  1. 29
      src/vrend_renderer.c
  2. 1
      src/vrend_renderer.h

@ -2029,7 +2029,7 @@ void vrend_set_single_sampler_view(struct vrend_context *ctx,
if (!tex) {
return;
}
if (view->texture->target != GL_TEXTURE_BUFFER) {
if (!view->texture->is_buffer) {
glBindTexture(view->texture->target, view->texture->id);
if (util_format_is_depth_or_stencil(view->format)) {
@ -2086,6 +2086,9 @@ void vrend_set_single_sampler_view(struct vrend_context *ctx,
} else {
GLenum internalformat;
if (!view->texture->tbo_tex_id)
glGenTextures(1, &view->texture->tbo_tex_id);
glBindTexture(GL_TEXTURE_BUFFER, view->texture->tbo_tex_id);
internalformat = tex_conv_table[view->format].internalformat;
glTexBuffer(GL_TEXTURE_BUFFER, internalformat, view->texture->id);
@ -2841,13 +2844,15 @@ static void vrend_draw_bind_samplers(struct vrend_context *ctx)
glActiveTexture(GL_TEXTURE0 + sampler_id);
if (texture) {
int id;
GLenum target = texture->target;
if (texture->target == GL_TEXTURE_BUFFER)
if (texture->is_buffer) {
id = texture->tbo_tex_id;
else
target = GL_TEXTURE_BUFFER;
} else
id = texture->id;
glBindTexture(texture->target, id);
glBindTexture(target, id);
if (ctx->sub->views[shader_type].old_ids[i] != id || ctx->sub->sampler_state_dirty) {
vrend_apply_sampler_state(ctx, texture, shader_type, i, sampler_id, ctx->sub->views[shader_type].views[i]->srgb_decode);
ctx->sub->views[shader_type].old_ids[i] = id;
@ -3890,7 +3895,7 @@ static void vrend_apply_sampler_state(struct vrend_context *ctx,
return;
}
if (target == GL_TEXTURE_BUFFER) {
if (tex->base.is_buffer) {
tex->state = *state;
return;
}
@ -4559,6 +4564,7 @@ static void vrend_create_buffer(struct vrend_resource *gr, uint32_t width)
glGenBuffersARB(1, &gr->id);
glBindBufferARB(gr->target, gr->id);
glBufferData(gr->target, width, NULL, GL_STREAM_DRAW);
gr->is_buffer = true;
}
int vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *args, struct iovec *iov, uint32_t num_iovs)
@ -4615,8 +4621,6 @@ int vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *a
gr->target = GL_ARRAY_BUFFER_ARB;
vrend_create_buffer(gr, args->width);
} else if (args->target == PIPE_BUFFER && (args->bind & VREND_RES_BIND_SAMPLER_VIEW)) {
GLenum internalformat;
/*
* On Desktop we use GL_ARB_texture_buffer_object on GLES we use
* GL_EXT_texture_buffer (it is in the ANDRIOD extension pack).
@ -4628,17 +4632,10 @@ int vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *a
/* need to check GL version here */
if (vrend_state.have_arb_or_gles_ext_texture_buffer) {
gr->target = GL_TEXTURE_BUFFER;
vrend_create_buffer(gr, args->width);
glGenTextures(1, &gr->tbo_tex_id);
glBindTexture(gr->target, gr->tbo_tex_id);
internalformat = tex_conv_table[args->format].internalformat;
glTexBuffer(gr->target, internalformat, gr->id);
} else {
gr->target = GL_PIXEL_PACK_BUFFER_ARB;
vrend_create_buffer(gr, args->width);
}
vrend_create_buffer(gr, args->width);
} else {
struct vrend_texture *gt = (struct vrend_texture *)gr;
GLenum internalformat, glformat, gltype;
@ -4764,7 +4761,7 @@ void vrend_renderer_resource_destroy(struct vrend_resource *res, bool remove)
res->target == GL_TEXTURE_BUFFER||
res->target == GL_TRANSFORM_FEEDBACK_BUFFER) {
glDeleteBuffers(1, &res->id);
if (res->target == GL_TEXTURE_BUFFER)
if (res->tbo_tex_id)
glDeleteTextures(1, &res->tbo_tex_id);
} else
glDeleteTextures(1, &res->id);

@ -54,6 +54,7 @@ struct vrend_resource {
GLuint tbo_tex_id;/* tbos have two ids to track */
bool y_0_top;
bool is_buffer;
GLuint handle;

Loading…
Cancel
Save