diff options
Diffstat (limited to 'mesalib')
-rw-r--r-- | mesalib/src/glsl/ast_function.cpp | 3 | ||||
-rw-r--r-- | mesalib/src/glsl/ir.cpp | 2 | ||||
-rw-r--r-- | mesalib/src/glsl/ir.h | 1 | ||||
-rw-r--r-- | mesalib/src/glsl/ir_constant_expression.cpp | 6 | ||||
-rw-r--r-- | mesalib/src/glsl/ir_validate.cpp | 4 | ||||
-rw-r--r-- | mesalib/src/mesa/SConscript | 1 | ||||
-rw-r--r-- | mesalib/src/mesa/main/fbobject.c | 11 | ||||
-rw-r--r-- | mesalib/src/mesa/program/ir_to_mesa.cpp | 1 | ||||
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_cb_fbo.c | 204 | ||||
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_cb_texture.c | 1 | ||||
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 6 |
11 files changed, 161 insertions, 79 deletions
diff --git a/mesalib/src/glsl/ast_function.cpp b/mesalib/src/glsl/ast_function.cpp index 9e7c5995f..ea3282c5f 100644 --- a/mesalib/src/glsl/ast_function.cpp +++ b/mesalib/src/glsl/ast_function.cpp @@ -452,8 +452,7 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type) result = new(ctx) ir_expression(ir_unop_i2u, src); break; case GLSL_TYPE_FLOAT: - result = new(ctx) ir_expression(ir_unop_i2u, - new(ctx) ir_expression(ir_unop_f2i, src)); + result = new(ctx) ir_expression(ir_unop_f2u, src); break; case GLSL_TYPE_BOOL: result = new(ctx) ir_expression(ir_unop_i2u, diff --git a/mesalib/src/glsl/ir.cpp b/mesalib/src/glsl/ir.cpp index f81bfd1ab..1c9eec6e2 100644 --- a/mesalib/src/glsl/ir.cpp +++ b/mesalib/src/glsl/ir.cpp @@ -299,6 +299,7 @@ ir_expression::ir_expression(int op, ir_rvalue *op0) break; case ir_unop_i2u: + case ir_unop_f2u: case ir_unop_bitcast_f2u: this->type = glsl_type::get_instance(GLSL_TYPE_UINT, op0->type->vector_elements, 1); @@ -428,6 +429,7 @@ static const char *const operator_strs[] = { "exp2", "log2", "f2i", + "f2u", "i2f", "f2b", "b2f", diff --git a/mesalib/src/glsl/ir.h b/mesalib/src/glsl/ir.h index 55535b2f5..014f3630d 100644 --- a/mesalib/src/glsl/ir.h +++ b/mesalib/src/glsl/ir.h @@ -896,6 +896,7 @@ enum ir_expression_operation { ir_unop_exp2, ir_unop_log2, ir_unop_f2i, /**< Float-to-integer conversion. */ + ir_unop_f2u, /**< Float-to-unsigned conversion. */ ir_unop_i2f, /**< Integer-to-float conversion. */ ir_unop_f2b, /**< Float-to-boolean conversion */ ir_unop_b2f, /**< Boolean-to-float conversion */ diff --git a/mesalib/src/glsl/ir_constant_expression.cpp b/mesalib/src/glsl/ir_constant_expression.cpp index 38a1ed96c..17b54b923 100644 --- a/mesalib/src/glsl/ir_constant_expression.cpp +++ b/mesalib/src/glsl/ir_constant_expression.cpp @@ -182,6 +182,12 @@ ir_expression::constant_expression_value(struct hash_table *variable_context) data.i[c] = (int) op[0]->value.f[c]; } break; + case ir_unop_f2u: + assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); + for (unsigned c = 0; c < op[0]->type->components(); c++) { + data.i[c] = (unsigned) op[0]->value.f[c]; + } + break; case ir_unop_i2f: assert(op[0]->type->base_type == GLSL_TYPE_INT); for (unsigned c = 0; c < op[0]->type->components(); c++) { diff --git a/mesalib/src/glsl/ir_validate.cpp b/mesalib/src/glsl/ir_validate.cpp index 5721717a5..191d39831 100644 --- a/mesalib/src/glsl/ir_validate.cpp +++ b/mesalib/src/glsl/ir_validate.cpp @@ -256,6 +256,10 @@ ir_validate::visit_leave(ir_expression *ir) assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); assert(ir->type->base_type == GLSL_TYPE_INT); break; + case ir_unop_f2u: + assert(ir->operands[0]->type->base_type == GLSL_TYPE_FLOAT); + assert(ir->type->base_type == GLSL_TYPE_UINT); + break; case ir_unop_i2f: assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT); assert(ir->type->base_type == GLSL_TYPE_FLOAT); diff --git a/mesalib/src/mesa/SConscript b/mesalib/src/mesa/SConscript index 99bdfad46..819a0fd7d 100644 --- a/mesalib/src/mesa/SConscript +++ b/mesalib/src/mesa/SConscript @@ -229,6 +229,7 @@ vbo_sources = [ statetracker_sources = [ 'state_tracker/st_atom.c', + 'state_tracker/st_atom_array.c', 'state_tracker/st_atom_blend.c', 'state_tracker/st_atom_clip.c', 'state_tracker/st_atom_constbuf.c', diff --git a/mesalib/src/mesa/main/fbobject.c b/mesalib/src/mesa/main/fbobject.c index 777783eb7..cfaea62bb 100644 --- a/mesalib/src/mesa/main/fbobject.c +++ b/mesalib/src/mesa/main/fbobject.c @@ -805,6 +805,15 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx, return; } } + + /* Check that the format is valid. (MESA_FORMAT_NONE means unsupported) + */ + if (att->Type == GL_RENDERBUFFER && + att->Renderbuffer->Format == MESA_FORMAT_NONE) { + fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED; + fbo_incomplete("unsupported renderbuffer format", i); + return; + } } #if FEATURE_GL @@ -1394,7 +1403,7 @@ renderbuffer_storage(GLenum target, GLenum internalFormat, ASSERT(rb->AllocStorage); if (rb->AllocStorage(ctx, rb, internalFormat, width, height)) { /* No error - check/set fields now */ - assert(rb->Format != MESA_FORMAT_NONE); + /* If rb->Format == MESA_FORMAT_NONE, the format is unsupported. */ assert(rb->Width == (GLuint) width); assert(rb->Height == (GLuint) height); rb->InternalFormat = internalFormat; diff --git a/mesalib/src/mesa/program/ir_to_mesa.cpp b/mesalib/src/mesa/program/ir_to_mesa.cpp index 224540005..217a26455 100644 --- a/mesalib/src/mesa/program/ir_to_mesa.cpp +++ b/mesalib/src/mesa/program/ir_to_mesa.cpp @@ -1400,6 +1400,7 @@ ir_to_mesa_visitor::visit(ir_expression *ir) result_src = op[0]; break; case ir_unop_f2i: + case ir_unop_f2u: emit(ir, OPCODE_TRUNC, result_dst, op[0]); break; case ir_unop_f2b: diff --git a/mesalib/src/mesa/state_tracker/st_cb_fbo.c b/mesalib/src/mesa/state_tracker/st_cb_fbo.c index 953295c0e..aeb5ac7fb 100644 --- a/mesalib/src/mesa/state_tracker/st_cb_fbo.c +++ b/mesalib/src/mesa/state_tracker/st_cb_fbo.c @@ -57,6 +57,47 @@ #include "util/u_surface.h" +static GLboolean +st_renderbuffer_alloc_sw_storage(struct gl_context * ctx, + struct gl_renderbuffer *rb, + GLenum internalFormat, + GLuint width, GLuint height) +{ + struct pipe_screen *screen = st_context(ctx)->pipe->screen; + struct st_renderbuffer *strb = st_renderbuffer(rb); + enum pipe_format format; + size_t size; + + free(strb->data); + strb->data = NULL; + + if (internalFormat == GL_RGBA16_SNORM) { + /* Special case for software accum buffers. Otherwise, if the + * call to st_choose_renderbuffer_format() fails (because the + * driver doesn't support signed 16-bit/channel colors) we'd + * just return without allocating the software accum buffer. + */ + format = PIPE_FORMAT_R16G16B16A16_SNORM; + } + else { + format = st_choose_renderbuffer_format(screen, internalFormat, 0); + + /* Not setting gl_renderbuffer::Format here will cause + * FRAMEBUFFER_UNSUPPORTED and ValidateFramebuffer will not be called. + */ + if (format == PIPE_FORMAT_NONE) { + return GL_TRUE; + } + } + + strb->Base.Format = st_pipe_format_to_mesa_format(format); + + size = _mesa_format_image_size(strb->Base.Format, width, height, 1); + strb->data = malloc(size); + return strb->data != NULL; +} + + /** * gl_renderbuffer::AllocStorage() * This is called to allocate the original drawing surface, and @@ -72,100 +113,111 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx, struct pipe_context *pipe = st->pipe; struct pipe_screen *screen = st->pipe->screen; struct st_renderbuffer *strb = st_renderbuffer(rb); - enum pipe_format format; + enum pipe_format format = PIPE_FORMAT_NONE; struct pipe_surface surf_tmpl; - - if (internalFormat == GL_RGBA16_SNORM && strb->software) { - /* Special case for software accum buffers. Otherwise, if the - * call to st_choose_renderbuffer_format() fails (because the - * driver doesn't support signed 16-bit/channel colors) we'd - * just return without allocating the software accum buffer. - */ - format = PIPE_FORMAT_R16G16B16A16_SNORM; - } - else { - format = st_choose_renderbuffer_format(screen, internalFormat, - rb->NumSamples); - } - - if (format == PIPE_FORMAT_NONE) { - return FALSE; - } + struct pipe_resource templ; /* init renderbuffer fields */ strb->Base.Width = width; strb->Base.Height = height; - strb->Base.Format = st_pipe_format_to_mesa_format(format); strb->Base._BaseFormat = _mesa_base_fbo_format(ctx, internalFormat); - strb->defined = GL_FALSE; /* undefined contents now */ if (strb->software) { - size_t size; - - free(strb->data); - - size = _mesa_format_image_size(strb->Base.Format, width, height, 1); - - strb->data = malloc(size); - - return strb->data != NULL; + return st_renderbuffer_alloc_sw_storage(ctx, rb, internalFormat, + width, height); } - else { - struct pipe_resource template; - - /* Free the old surface and texture - */ - pipe_surface_reference( &strb->surface, NULL ); - pipe_resource_reference( &strb->texture, NULL ); - if (width == 0 || height == 0) { - /* if size is zero, nothing to allocate */ - return GL_TRUE; - } + /* Free the old surface and texture + */ + pipe_surface_reference( &strb->surface, NULL ); + pipe_resource_reference( &strb->texture, NULL ); + + /* Handle multisample renderbuffers first. + * + * From ARB_framebuffer_object: + * If <samples> is zero, then RENDERBUFFER_SAMPLES is set to zero. + * Otherwise <samples> represents a request for a desired minimum + * number of samples. Since different implementations may support + * different sample counts for multisampled rendering, the actual + * number of samples allocated for the renderbuffer image is + * implementation dependent. However, the resulting value for + * RENDERBUFFER_SAMPLES is guaranteed to be greater than or equal + * to <samples> and no more than the next larger sample count supported + * by the implementation. + * + * So let's find the supported number of samples closest to NumSamples. + * (NumSamples == 1) is treated the same as (NumSamples == 0). + */ + if (rb->NumSamples > 1) { + unsigned i; - /* Setup new texture template. - */ - memset(&template, 0, sizeof(template)); - template.target = st->internal_target; - template.format = format; - template.width0 = width; - template.height0 = height; - template.depth0 = 1; - template.array_size = 1; - template.last_level = 0; - template.nr_samples = rb->NumSamples; - if (util_format_is_depth_or_stencil(format)) { - template.bind = PIPE_BIND_DEPTH_STENCIL; - } - else if (strb->Base.Name != 0) { - /* this is a user-created renderbuffer */ - template.bind = PIPE_BIND_RENDER_TARGET; - } - else { - /* this is a window-system buffer */ - template.bind = (PIPE_BIND_DISPLAY_TARGET | - PIPE_BIND_RENDER_TARGET); + for (i = rb->NumSamples; i <= ctx->Const.MaxSamples; i++) { + format = st_choose_renderbuffer_format(screen, internalFormat, i); + + if (format != PIPE_FORMAT_NONE) { + rb->NumSamples = i; + break; + } } + } else { + format = st_choose_renderbuffer_format(screen, internalFormat, 0); + } + + /* Not setting gl_renderbuffer::Format here will cause + * FRAMEBUFFER_UNSUPPORTED and ValidateFramebuffer will not be called. + */ + if (format == PIPE_FORMAT_NONE) { + return GL_TRUE; + } - strb->texture = screen->resource_create(screen, &template); + strb->Base.Format = st_pipe_format_to_mesa_format(format); - if (!strb->texture) - return FALSE; + if (width == 0 || height == 0) { + /* if size is zero, nothing to allocate */ + return GL_TRUE; + } - u_surface_default_template(&surf_tmpl, strb->texture, template.bind); - strb->surface = pipe->create_surface(pipe, - strb->texture, - &surf_tmpl); - if (strb->surface) { - assert(strb->surface->texture); - assert(strb->surface->format); - assert(strb->surface->width == width); - assert(strb->surface->height == height); - } + /* Setup new texture template. + */ + memset(&templ, 0, sizeof(templ)); + templ.target = st->internal_target; + templ.format = format; + templ.width0 = width; + templ.height0 = height; + templ.depth0 = 1; + templ.array_size = 1; + templ.nr_samples = rb->NumSamples; + if (util_format_is_depth_or_stencil(format)) { + templ.bind = PIPE_BIND_DEPTH_STENCIL; + } + else if (strb->Base.Name != 0) { + /* this is a user-created renderbuffer */ + templ.bind = PIPE_BIND_RENDER_TARGET; + } + else { + /* this is a window-system buffer */ + templ.bind = (PIPE_BIND_DISPLAY_TARGET | + PIPE_BIND_RENDER_TARGET); + } + + strb->texture = screen->resource_create(screen, &templ); + + if (!strb->texture) + return FALSE; - return strb->surface != NULL; + u_surface_default_template(&surf_tmpl, strb->texture, templ.bind); + strb->surface = pipe->create_surface(pipe, + strb->texture, + &surf_tmpl); + if (strb->surface) { + assert(strb->surface->texture); + assert(strb->surface->format); + assert(strb->surface->width == width); + assert(strb->surface->height == height); } + + return strb->surface != NULL; } diff --git a/mesalib/src/mesa/state_tracker/st_cb_texture.c b/mesalib/src/mesa/state_tracker/st_cb_texture.c index 9d1b7f672..67c3f9590 100644 --- a/mesalib/src/mesa/state_tracker/st_cb_texture.c +++ b/mesalib/src/mesa/state_tracker/st_cb_texture.c @@ -600,6 +600,7 @@ decompress_with_blit(struct gl_context * ctx, u_sampler_view_default_template(&sv_temp, stObj->pt, stObj->pt->format); + sv_temp.format = util_format_linear(sv_temp.format); sv_temp.u.tex.first_level = sv_temp.u.tex.last_level = texImage->Level; diff --git a/mesalib/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/mesalib/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 347a22f19..5802b52b7 100644 --- a/mesalib/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/mesalib/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -1762,6 +1762,12 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir) else emit(ir, TGSI_OPCODE_TRUNC, result_dst, op[0]); break; + case ir_unop_f2u: + if (native_integers) + emit(ir, TGSI_OPCODE_F2U, result_dst, op[0]); + else + emit(ir, TGSI_OPCODE_TRUNC, result_dst, op[0]); + break; case ir_unop_bitcast_f2i: case ir_unop_bitcast_f2u: case ir_unop_bitcast_i2f: |