r600g: Close a memory leak of llvm byte streams
[mesa.git] / src / gallium / drivers / r600 / r600_state.c
index 05271e20132d450500bba6e3f075b5802ecd44bc..e092cf498089e2cb5cf71e29c6a56ae02af8873b 100644 (file)
@@ -592,6 +592,10 @@ boolean r600_is_format_supported(struct pipe_screen *screen,
                    format == PIPE_FORMAT_R11G11B10_FLOAT)
                        return FALSE;
 
+               /* MSAA integer colorbuffers hang. */
+               if (util_format_is_pure_integer(format))
+                       return FALSE;
+
                switch (sample_count) {
                case 2:
                case 4:
@@ -600,15 +604,6 @@ boolean r600_is_format_supported(struct pipe_screen *screen,
                default:
                        return FALSE;
                }
-
-               /* require render-target support for multisample resources */
-               if (util_format_is_depth_or_stencil(format)) {
-                       usage |= PIPE_BIND_DEPTH_STENCIL;
-               } else if (util_format_is_pure_integer(format)) {
-                       return FALSE; /* no integer textures */
-               } else {
-                       usage |= PIPE_BIND_RENDER_TARGET;
-               }
        }
 
        if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
@@ -1120,43 +1115,13 @@ static struct pipe_sampler_view *r600_create_sampler_view(struct pipe_context *c
        return &view->base;
 }
 
-static void r600_set_clip_state(struct pipe_context *ctx,
-                               const struct pipe_clip_state *state)
+static void r600_emit_clip_state(struct r600_context *rctx, struct r600_atom *atom)
 {
-       struct r600_context *rctx = (struct r600_context *)ctx;
-       struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
-       struct pipe_constant_buffer cb;
-
-       if (rstate == NULL)
-               return;
-
-       rctx->clip = *state;
-       rstate->id = R600_PIPE_STATE_CLIP;
-       for (int i = 0; i < 6; i++) {
-               r600_pipe_state_add_reg(rstate,
-                                       R_028E20_PA_CL_UCP0_X + i * 16,
-                                       fui(state->ucp[i][0]));
-               r600_pipe_state_add_reg(rstate,
-                                       R_028E24_PA_CL_UCP0_Y + i * 16,
-                                       fui(state->ucp[i][1]) );
-               r600_pipe_state_add_reg(rstate,
-                                       R_028E28_PA_CL_UCP0_Z + i * 16,
-                                       fui(state->ucp[i][2]));
-               r600_pipe_state_add_reg(rstate,
-                                       R_028E2C_PA_CL_UCP0_W + i * 16,
-                                       fui(state->ucp[i][3]));
-       }
-
-       free(rctx->states[R600_PIPE_STATE_CLIP]);
-       rctx->states[R600_PIPE_STATE_CLIP] = rstate;
-       r600_context_pipe_state_set(rctx, rstate);
+       struct radeon_winsys_cs *cs = rctx->cs;
+       struct pipe_clip_state *state = &rctx->clip_state.state;
 
-       cb.buffer = NULL;
-       cb.user_buffer = state->ucp;
-       cb.buffer_offset = 0;
-       cb.buffer_size = 4*4*8;
-       ctx->set_constant_buffer(ctx, PIPE_SHADER_VERTEX, 1, &cb);
-       pipe_resource_reference(&cb.buffer, NULL);
+       r600_write_context_reg_seq(cs, R_028E20_PA_CL_UCP0_X, 6*4);
+       r600_write_array(cs, 6*4, (unsigned*)state);
 }
 
 static void r600_set_polygon_stipple(struct pipe_context *ctx,
@@ -1879,6 +1844,13 @@ static void r600_emit_vs_constant_buffers(struct r600_context *rctx, struct r600
                                   R_028980_ALU_CONST_CACHE_VS_0);
 }
 
+static void r600_emit_gs_constant_buffers(struct r600_context *rctx, struct r600_atom *atom)
+{
+       r600_emit_constant_buffers(rctx, &rctx->constbuf_state[PIPE_SHADER_GEOMETRY], 336,
+                                  R_0281C0_ALU_CONST_BUFFER_SIZE_GS_0,
+                                  R_0289C0_ALU_CONST_CACHE_GS_0);
+}
+
 static void r600_emit_ps_constant_buffers(struct r600_context *rctx, struct r600_atom *atom)
 {
        r600_emit_constant_buffers(rctx, &rctx->constbuf_state[PIPE_SHADER_FRAGMENT], 0,
@@ -1916,11 +1888,23 @@ static void r600_emit_sampler_views(struct r600_context *rctx,
        state->dirty_mask = 0;
 }
 
+/* Resource IDs:
+ *   PS: 0   .. +160
+ *   VS: 160 .. +160
+ *   FS: 320 .. +16
+ *   GS: 336 .. +160
+ */
+
 static void r600_emit_vs_sampler_views(struct r600_context *rctx, struct r600_atom *atom)
 {
        r600_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].views, 160 + R600_MAX_CONST_BUFFERS);
 }
 
+static void r600_emit_gs_sampler_views(struct r600_context *rctx, struct r600_atom *atom)
+{
+       r600_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].views, 336 + R600_MAX_CONST_BUFFERS);
+}
+
 static void r600_emit_ps_sampler_views(struct r600_context *rctx, struct r600_atom *atom)
 {
        r600_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].views, R600_MAX_CONST_BUFFERS);
@@ -1980,6 +1964,11 @@ static void r600_emit_vs_sampler_states(struct r600_context *rctx, struct r600_a
        r600_emit_sampler_states(rctx, &rctx->samplers[PIPE_SHADER_VERTEX], 18, R_00A600_TD_VS_SAMPLER0_BORDER_RED);
 }
 
+static void r600_emit_gs_sampler_states(struct r600_context *rctx, struct r600_atom *atom)
+{
+       r600_emit_sampler_states(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY], 36, R_00A800_TD_GS_SAMPLER0_BORDER_RED);
+}
+
 static void r600_emit_ps_sampler_states(struct r600_context *rctx, struct r600_atom *atom)
 {
        r600_emit_sampler_states(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT], 0, R_00A400_TD_PS_SAMPLER0_BORDER_RED);
@@ -2025,40 +2014,42 @@ void r600_init_state_functions(struct r600_context *rctx)
 
        /* shader const */
        r600_init_atom(rctx, &rctx->constbuf_state[PIPE_SHADER_VERTEX].atom, id++, r600_emit_vs_constant_buffers, 0);
+       r600_init_atom(rctx, &rctx->constbuf_state[PIPE_SHADER_GEOMETRY].atom, id++, r600_emit_gs_constant_buffers, 0);
        r600_init_atom(rctx, &rctx->constbuf_state[PIPE_SHADER_FRAGMENT].atom, id++, r600_emit_ps_constant_buffers, 0);
 
        /* sampler must be emited before TA_CNTL_AUX otherwise DISABLE_CUBE_WRAP change
         * does not take effect (TA_CNTL_AUX emited by r600_emit_seamless_cube_map)
         */
        r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].states.atom, id++, r600_emit_vs_sampler_states, 0);
+       r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].states.atom, id++, r600_emit_gs_sampler_states, 0);
        r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].states.atom, id++, r600_emit_ps_sampler_states, 0);
        /* resource */
        r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].views.atom, id++, r600_emit_vs_sampler_views, 0);
+       r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].views.atom, id++, r600_emit_gs_sampler_views, 0);
        r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].views.atom, id++, r600_emit_ps_sampler_views, 0);
        r600_init_atom(rctx, &rctx->vertex_buffer_state.atom, id++, r600_emit_vertex_buffers, 0);
 
-       r600_init_atom(rctx, &rctx->seamless_cube_map.atom, id++, r600_emit_seamless_cube_map, 3);
-       r600_atom_dirty(rctx, &rctx->seamless_cube_map.atom);
+       r600_init_atom(rctx, &rctx->vgt_state.atom, id++, r600_emit_vgt_state, 6);
+       r600_init_atom(rctx, &rctx->vgt2_state.atom, id++, r600_emit_vgt2_state, 3);
 
+       r600_init_atom(rctx, &rctx->seamless_cube_map.atom, id++, r600_emit_seamless_cube_map, 3);
        r600_init_atom(rctx, &rctx->sample_mask.atom, id++, r600_emit_sample_mask, 3);
        rctx->sample_mask.sample_mask = ~0;
-       r600_atom_dirty(rctx, &rctx->sample_mask.atom);
-
-       r600_init_atom(rctx, &rctx->cb_misc_state.atom, id++, r600_emit_cb_misc_state, 0);
-       r600_atom_dirty(rctx, &rctx->cb_misc_state.atom);
 
        r600_init_atom(rctx, &rctx->alphatest_state.atom, id++, r600_emit_alphatest_state, 6);
-       r600_atom_dirty(rctx, &rctx->alphatest_state.atom);
-
+       r600_init_atom(rctx, &rctx->blend_color.atom, id++, r600_emit_blend_color, 6);
+       r600_init_atom(rctx, &rctx->cb_misc_state.atom, id++, r600_emit_cb_misc_state, 7);
+       r600_init_atom(rctx, &rctx->clip_misc_state.atom, id++, r600_emit_clip_misc_state, 6);
+       r600_init_atom(rctx, &rctx->clip_state.atom, id++, r600_emit_clip_state, 26);
        r600_init_atom(rctx, &rctx->db_misc_state.atom, id++, r600_emit_db_misc_state, 4);
-       r600_atom_dirty(rctx, &rctx->db_misc_state.atom);
+       r600_init_atom(rctx, &rctx->stencil_ref.atom, id++, r600_emit_stencil_ref, 4);
+       r600_init_atom(rctx, &rctx->viewport.atom, id++, r600_emit_viewport_state, 8);
 
        rctx->context.create_blend_state = r600_create_blend_state;
        rctx->context.create_depth_stencil_alpha_state = r600_create_dsa_state;
        rctx->context.create_rasterizer_state = r600_create_rs_state;
        rctx->context.create_sampler_state = r600_create_sampler_state;
        rctx->context.create_sampler_view = r600_create_sampler_view;
-       rctx->context.set_clip_state = r600_set_clip_state;
        rctx->context.set_framebuffer_state = r600_set_framebuffer_state;
        rctx->context.set_polygon_stipple = r600_set_polygon_stipple;
        rctx->context.set_scissor_state = r600_pipe_set_scissor_state;