diff options
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r-- | src/mesa/state_tracker/st_atom_framebuffer.c | 54 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_atom_rasterizer.c | 2 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_atom_scissor.c | 8 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_cb_drawtex.c | 9 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_cb_msaa.c | 4 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_extensions.c | 28 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 8 |
7 files changed, 99 insertions, 14 deletions
diff --git a/src/mesa/state_tracker/st_atom_framebuffer.c b/src/mesa/state_tracker/st_atom_framebuffer.c index ae883a2535e..ade3d61dc70 100644 --- a/src/mesa/state_tracker/st_atom_framebuffer.c +++ b/src/mesa/state_tracker/st_atom_framebuffer.c @@ -43,6 +43,7 @@ #include "util/u_math.h" #include "util/u_inlines.h" #include "util/u_format.h" +#include "main/framebuffer.h" /** @@ -64,6 +65,41 @@ update_framebuffer_size(struct pipe_framebuffer_state *framebuffer, framebuffer->height = MIN2(framebuffer->height, surface->height); } +/** + * Round up the requested multisample count to the next supported sample size. + */ +static unsigned +framebuffer_quantize_num_samples(struct st_context *st, unsigned num_samples) +{ + struct pipe_screen *screen = st->pipe->screen; + int quantized_samples = 0; + unsigned msaa_mode; + + if (!num_samples) + return 0; + + /* Assumes the highest supported MSAA is a power of 2 */ + msaa_mode = util_next_power_of_two(st->ctx->Const.MaxFramebufferSamples); + assert(!(num_samples > msaa_mode)); /* be safe from infinite loops */ + + /** + * Check if the MSAA mode that is higher than the requested + * num_samples is supported, and if so returning it. + */ + for (; msaa_mode >= num_samples; msaa_mode = msaa_mode / 2) { + /** + * For ARB_framebuffer_no_attachment, A format of + * PIPE_FORMAT_NONE implies what number of samples is + * supported for a framebuffer with no attachment. Thus the + * drivers callback must be adjusted for this. + */ + if (screen->is_format_supported(screen, PIPE_FORMAT_NONE, + PIPE_TEXTURE_2D, msaa_mode, + PIPE_BIND_RENDER_TARGET)) + quantized_samples = msaa_mode; + } + return quantized_samples; +} /** * Update framebuffer state (color, depth, stencil, etc. buffers) @@ -79,10 +115,22 @@ update_framebuffer_state( struct st_context *st ) st_flush_bitmap_cache(st); st->state.fb_orientation = st_fb_orientation(fb); - framebuffer->width = UINT_MAX; - framebuffer->height = UINT_MAX; - /*printf("------ fb size %d x %d\n", fb->Width, fb->Height);*/ + /** + * Quantize the derived default number of samples: + * + * A query to the driver of supported MSAA values the + * hardware supports is done as to legalize the number + * of application requested samples, NumSamples. + * See commit eb9cf3c for more information. + */ + fb->DefaultGeometry._NumSamples = + framebuffer_quantize_num_samples(st, fb->DefaultGeometry.NumSamples); + + framebuffer->width = _mesa_geometric_width(fb); + framebuffer->height = _mesa_geometric_height(fb); + framebuffer->samples = _mesa_geometric_samples(fb); + framebuffer->layers = _mesa_geometric_layers(fb); /* Examine Mesa's ctx->DrawBuffer->_ColorDrawBuffers state * to determine which surfaces to draw to diff --git a/src/mesa/state_tracker/st_atom_rasterizer.c b/src/mesa/state_tracker/st_atom_rasterizer.c index 366163e42df..ed9deb03327 100644 --- a/src/mesa/state_tracker/st_atom_rasterizer.c +++ b/src/mesa/state_tracker/st_atom_rasterizer.c @@ -244,7 +244,7 @@ static void update_raster_state( struct st_context *st ) _mesa_is_multisample_enabled(ctx) && ctx->Multisample.SampleShading && ctx->Multisample.MinSampleShadingValue * - ctx->DrawBuffer->Visual.samples > 1; + _mesa_geometric_samples(ctx->DrawBuffer) > 1; /* _NEW_SCISSOR */ raster->scissor = ctx->Scissor.EnableFlags; diff --git a/src/mesa/state_tracker/st_atom_scissor.c b/src/mesa/state_tracker/st_atom_scissor.c index 4ebe799e35d..605d5cba9e7 100644 --- a/src/mesa/state_tracker/st_atom_scissor.c +++ b/src/mesa/state_tracker/st_atom_scissor.c @@ -32,6 +32,7 @@ #include "main/macros.h" +#include "main/framebuffer.h" #include "st_context.h" #include "pipe/p_context.h" #include "st_atom.h" @@ -46,14 +47,17 @@ update_scissor( struct st_context *st ) struct pipe_scissor_state scissor[PIPE_MAX_VIEWPORTS]; const struct gl_context *ctx = st->ctx; const struct gl_framebuffer *fb = ctx->DrawBuffer; + const unsigned int fb_width = _mesa_geometric_width(fb); + const unsigned int fb_height = _mesa_geometric_height(fb); GLint miny, maxy; unsigned i; bool changed = false; + for (i = 0 ; i < ctx->Const.MaxViewports; i++) { scissor[i].minx = 0; scissor[i].miny = 0; - scissor[i].maxx = fb->Width; - scissor[i].maxy = fb->Height; + scissor[i].maxx = fb_width; + scissor[i].maxy = fb_height; if (ctx->Scissor.EnableFlags & (1 << i)) { /* need to be careful here with xmax or ymax < 0 */ diff --git a/src/mesa/state_tracker/st_cb_drawtex.c b/src/mesa/state_tracker/st_cb_drawtex.c index a7926295277..e2af2357f02 100644 --- a/src/mesa/state_tracker/st_cb_drawtex.c +++ b/src/mesa/state_tracker/st_cb_drawtex.c @@ -16,6 +16,7 @@ #include "main/image.h" #include "main/macros.h" #include "main/teximage.h" +#include "main/framebuffer.h" #include "program/program.h" #include "program/prog_print.h" @@ -166,8 +167,8 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z, /* positions (in clip coords) */ { const struct gl_framebuffer *fb = ctx->DrawBuffer; - const GLfloat fb_width = (GLfloat)fb->Width; - const GLfloat fb_height = (GLfloat)fb->Height; + const GLfloat fb_width = (GLfloat)_mesa_geometric_width(fb); + const GLfloat fb_height = (GLfloat)_mesa_geometric_height(fb); const GLfloat clip_x0 = (GLfloat)(x0 / fb_width * 2.0 - 1.0); const GLfloat clip_y0 = (GLfloat)(y0 / fb_height * 2.0 - 1.0); @@ -262,8 +263,8 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z, { const struct gl_framebuffer *fb = ctx->DrawBuffer; const GLboolean invert = (st_fb_orientation(fb) == Y_0_TOP); - const GLfloat width = (GLfloat)fb->Width; - const GLfloat height = (GLfloat)fb->Height; + const GLfloat width = (GLfloat)_mesa_geometric_width(fb); + const GLfloat height = (GLfloat)_mesa_geometric_height(fb); struct pipe_viewport_state vp; vp.scale[0] = 0.5f * width; vp.scale[1] = height * (invert ? -0.5f : 0.5f); diff --git a/src/mesa/state_tracker/st_cb_msaa.c b/src/mesa/state_tracker/st_cb_msaa.c index d581f2121b0..22001e49973 100644 --- a/src/mesa/state_tracker/st_cb_msaa.c +++ b/src/mesa/state_tracker/st_cb_msaa.c @@ -27,6 +27,7 @@ #include "main/bufferobj.h" #include "main/imports.h" +#include "main/framebuffer.h" #include "state_tracker/st_cb_msaa.h" #include "state_tracker/st_context.h" @@ -47,7 +48,8 @@ st_GetSamplePosition(struct gl_context *ctx, st_validate_state(st, ST_PIPELINE_RENDER); if (st->pipe->get_sample_position) - st->pipe->get_sample_position(st->pipe, (unsigned) fb->Visual.samples, + st->pipe->get_sample_position(st->pipe, + _mesa_geometric_samples(fb), index, outPos); else outPos[0] = outPos[1] = 0.5f; diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 6c0df8d2a98..287894317df 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -445,6 +445,18 @@ void st_init_limits(struct pipe_screen *screen, extensions->ARB_shader_image_load_store = GL_TRUE; extensions->ARB_shader_image_size = GL_TRUE; } + + /* ARB_framebuffer_no_attachments */ + c->MaxFramebufferWidth = c->MaxViewportWidth; + c->MaxFramebufferHeight = c->MaxViewportHeight; + /* NOTE: we cheat here a little by assuming that + * PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS has the same + * number of layers as we need, although we technically + * could have more the generality is not really useful + * in practicality. + */ + c->MaxFramebufferLayers = + screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS); } @@ -956,6 +968,9 @@ void st_init_extensions(struct pipe_screen *screen, enum pipe_format int_formats[] = { PIPE_FORMAT_R8G8B8A8_SINT }; + enum pipe_format void_formats[] = { + PIPE_FORMAT_NONE + }; consts->MaxSamples = get_max_samples_for_formats(screen, ARRAY_SIZE(color_formats), @@ -976,6 +991,12 @@ void st_init_extensions(struct pipe_screen *screen, get_max_samples_for_formats(screen, ARRAY_SIZE(int_formats), int_formats, consts->MaxSamples, PIPE_BIND_SAMPLER_VIEW); + + /* ARB_framebuffer_no_attachments, assume max no. of samples 32 */ + consts->MaxFramebufferSamples = + get_max_samples_for_formats(screen, ARRAY_SIZE(void_formats), + void_formats, 32, + PIPE_BIND_RENDER_TARGET); } if (consts->MaxSamples == 1) { /* one sample doesn't really make sense */ @@ -1068,6 +1089,13 @@ void st_init_extensions(struct pipe_screen *screen, extensions->AMD_vertex_shader_viewport_index = GL_TRUE; } + /* ARB_framebuffer_no_attachments */ + if (screen->get_param(screen, PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT) && + ((consts->MaxSamples >= 4 && consts->MaxFramebufferLayers >= 2048) || + (consts->MaxFramebufferSamples >= consts->MaxSamples && + consts->MaxFramebufferLayers >= consts->MaxArrayTextureLayers))) + extensions->ARB_framebuffer_no_attachments = GL_TRUE; + /* GL_ARB_ES3_compatibility. * * Assume that ES3 is supported if GLSL 3.30 is supported. diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index cd481c166e7..b9ab7ae9919 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -389,7 +389,7 @@ public: unsigned num_output_arrays; int num_address_regs; - int samplers_used; + uint32_t samplers_used; glsl_base_type sampler_types[PIPE_MAX_SAMPLERS]; int sampler_targets[PIPE_MAX_SAMPLERS]; /**< One of TGSI_TEXTURE_* */ int buffers_used; @@ -4290,6 +4290,8 @@ glsl_to_tgsi_visitor::visit(ir_barrier *ir) glsl_to_tgsi_visitor::glsl_to_tgsi_visitor() { + STATIC_ASSERT(sizeof(samplers_used) * 8 >= PIPE_MAX_SAMPLERS); + result.file = PROGRAM_UNDEFINED; next_temp = 1; array_sizes = NULL; @@ -4346,7 +4348,7 @@ count_resources(glsl_to_tgsi_visitor *v, gl_program *prog) if (inst->info->is_tex) { for (int i = 0; i < inst->sampler_array_size; i++) { unsigned idx = inst->sampler_base + i; - v->samplers_used |= 1 << idx; + v->samplers_used |= 1u << idx; debug_assert(idx < (int)ARRAY_SIZE(v->sampler_types)); v->sampler_types[idx] = inst->tex_type; @@ -6325,7 +6327,7 @@ st_translate_program( /* texture samplers */ for (i = 0; i < frag_const->MaxTextureImageUnits; i++) { - if (program->samplers_used & (1 << i)) { + if (program->samplers_used & (1u << i)) { unsigned type; t->samplers[i] = ureg_DECL_sampler(ureg, i); |