r600_state.c revision 58c243905b0cfcbf1b0299a0f7f0ea90755e36cc
172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse/* 272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a 572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * copy of this software and associated documentation files (the "Software"), 672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * to deal in the Software without restriction, including without limitation 772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub 872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom 972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * the Software is furnished to do so, subject to the following conditions: 1072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * The above copyright notice and this permission notice (including the next 1272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the 1372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Software. 1472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 1872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 1972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 2072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 2172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE. 2272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 2372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Authors: 2472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Jerome Glisse 2572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse */ 2672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include <stdio.h> 277a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse#include <errno.h> 28742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse#include "util/u_inlines.h" 29742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse#include "util/u_format.h" 30742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse#include "util/u_memory.h" 31b5fcf8274916afdf29aca5e8db7611687b03abe4Dave Airlie#include "util/u_pack_color.h" 3272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_screen.h" 3372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_context.h" 34742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse#include "r600_resource.h" 3572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 364af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airliestatic void clean_flush(struct r600_context *rctx, struct radeon_state *flush); 374af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airliestatic int setup_cb_flush(struct r600_context *rctx, struct radeon_state *flush); 384af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airliestatic int setup_db_flush(struct r600_context *rctx, struct radeon_state *flush); 394af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie 4049b4f5259bdbfce4f84a6997ccb36376f953068cDave Airliestatic struct r600_context_state *r600_new_context_state(unsigned type) 4149b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie{ 4249b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie struct r600_context_state *rstate = CALLOC_STRUCT(r600_context_state); 4349b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie if (rstate == NULL) 4449b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie return NULL; 4549b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->type = type; 4649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->refcount = 1; 4749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie return rstate; 4849b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie} 4915ce70252c5357081a61f3494261c7e343174301Jerome Glisse 506f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void *r600_create_blend_state(struct pipe_context *ctx, 516f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_blend_state *state) 526f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 536f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context *rctx = r600_context(ctx); 5449b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie struct r600_context_state *rstate; 556f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 5649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate = r600_new_context_state(pipe_blend_type); 5749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->state.blend = *state; 589ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie rctx->vtbl->blend(rctx, &rstate->rstate[0], &rstate->state.blend); 5949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie 6049b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie return rstate; 616f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 626f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 636f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void *r600_create_dsa_state(struct pipe_context *ctx, 6449b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie const struct pipe_depth_stencil_alpha_state *state) 656f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 6649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie struct r600_context_state *rstate; 676f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 6849b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate = r600_new_context_state(pipe_dsa_type); 6949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->state.dsa = *state; 7049b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie return rstate; 716f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 726f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 736f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void *r600_create_rs_state(struct pipe_context *ctx, 746f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_rasterizer_state *state) 756f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 7649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie struct r600_context_state *rstate; 776f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 7849b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate = r600_new_context_state(pipe_rasterizer_type); 7949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->state.rasterizer = *state; 8049b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie return rstate; 816f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 826f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 836f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void *r600_create_sampler_state(struct pipe_context *ctx, 846f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_sampler_state *state) 856f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 866f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context *rctx = r600_context(ctx); 8749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie struct r600_context_state *rstate; 886f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 8949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate = r600_new_context_state(pipe_sampler_type); 9049b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->state.sampler = *state; 919ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie rctx->vtbl->sampler(rctx, &rstate->rstate[0], &rstate->state.sampler, 0); 929ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie rctx->vtbl->sampler_border(rctx, &rstate->rstate[1], &rstate->state.sampler, 0); 9349b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie return rstate; 946f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 956f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 963a672785df247e6f8ce95616166b74d4fd10ede0Dave Airliestatic void r600_remove_sampler_view(struct r600_shader_sampler_states *sampler, 973a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie struct r600_context_state *rstate) 983a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie{ 993a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie int i, j; 1003a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie 1013a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie for (i = 0; i < sampler->nview; i++) { 1023a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie for (j = 0; j < rstate->nrstate; j++) { 1033a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie if (sampler->view[i] == &rstate->rstate[j]) 1043a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie sampler->view[i] = NULL; 1053a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie } 1063a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie } 1073a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie} 1086f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_sampler_view_destroy(struct pipe_context *ctx, 1096f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct pipe_sampler_view *state) 1106f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 1116f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rstate = (struct r600_context_state *)state; 1123a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie struct r600_context *rctx = r600_context(ctx); 1136f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 1143a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie /* need to search list of vs/ps sampler views and remove it from any - uggh */ 1153a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie r600_remove_sampler_view(&rctx->ps_sampler, rstate); 1163a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie r600_remove_sampler_view(&rctx->vs_sampler, rstate); 1176f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse r600_context_state_decref(rstate); 1186f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 1196f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 1206f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic struct pipe_sampler_view *r600_create_sampler_view(struct pipe_context *ctx, 1216f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct pipe_resource *texture, 1226f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_sampler_view *state) 1236f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 1246f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rstate; 1259ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie struct r600_context *rctx = r600_context(ctx); 1266f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 12749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate = r600_new_context_state(pipe_sampler_view_type); 12849b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->state.sampler_view = *state; 12949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->state.sampler_view.texture = NULL; 1306f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse pipe_reference(NULL, &texture->reference); 1316f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rstate->state.sampler_view.texture = texture; 1326f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rstate->state.sampler_view.reference.count = 1; 13342c1f27149828e5b5143f5e53ca3bd7c04a4e762Jerome Glisse rstate->state.sampler_view.context = ctx; 1349ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie rctx->vtbl->resource(ctx, &rstate->rstate[0], &rstate->state.sampler_view, 0); 1356f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return &rstate->state.sampler_view; 1366f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 1376f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 138191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_set_sampler_view(struct pipe_context *ctx, 139191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie unsigned count, 140191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie struct pipe_sampler_view **views, 141191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie struct r600_shader_sampler_states *sampler, 142191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie unsigned shader_id) 143f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse{ 144f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse struct r600_context *rctx = r600_context(ctx); 145f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse struct r600_context_state *rstate; 146f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse unsigned i; 147f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse 148191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie for (i = 0; i < sampler->nview; i++) { 149191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie radeon_draw_unbind(&rctx->draw, sampler->view[i]); 150f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse } 151191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie 152f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse for (i = 0; i < count; i++) { 153f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse rstate = (struct r600_context_state *)views[i]; 154f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse if (rstate) { 155f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse rstate->nrstate = 0; 156f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse } 157f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse } 158f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse for (i = 0; i < count; i++) { 159f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse rstate = (struct r600_context_state *)views[i]; 160f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse if (rstate) { 161f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse if (rstate->nrstate >= R600_MAX_RSTATE) 162f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse continue; 163f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse if (rstate->nrstate) { 164f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse memcpy(&rstate->rstate[rstate->nrstate], &rstate->rstate[0], sizeof(struct radeon_state)); 165f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse } 166191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie radeon_state_convert(&rstate->rstate[rstate->nrstate], R600_STATE_RESOURCE, i, shader_id); 167191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie sampler->view[i] = &rstate->rstate[rstate->nrstate]; 168f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse rstate->nrstate++; 169f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse } 170f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse } 171191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie sampler->nview = count; 172f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse} 173f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse 174191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_set_ps_sampler_view(struct pipe_context *ctx, 175f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse unsigned count, 176f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse struct pipe_sampler_view **views) 177f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse{ 178f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse struct r600_context *rctx = r600_context(ctx); 179191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie r600_set_sampler_view(ctx, count, views, &rctx->ps_sampler, R600_SHADER_PS); 180191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie} 181f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse 182191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_set_vs_sampler_view(struct pipe_context *ctx, 183191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie unsigned count, 184191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie struct pipe_sampler_view **views) 185191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie{ 186191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie struct r600_context *rctx = r600_context(ctx); 187191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie r600_set_sampler_view(ctx, count, views, &rctx->vs_sampler, R600_SHADER_VS); 188f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse} 189f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse 1906f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void *r600_create_shader_state(struct pipe_context *ctx, 1916f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_shader_state *state) 1926f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 1936f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context *rctx = r600_context(ctx); 19449b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie struct r600_context_state *rstate; 19549b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie int r; 1966f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 19749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate = r600_new_context_state(pipe_shader_type); 19849b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->state.shader = *state; 19949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie r = r600_pipe_shader_create(&rctx->context, rstate, rstate->state.shader.tokens); 20049b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie if (r) { 20149b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie r600_context_state_decref(rstate); 20249b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie return NULL; 20349b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie } 20449b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie return rstate; 2056f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 2066f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 2076f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void *r600_create_vertex_elements(struct pipe_context *ctx, 2086f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse unsigned count, 2096f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_vertex_element *elements) 2106f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 2116f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_vertex_element *v = CALLOC_STRUCT(r600_vertex_element); 2126f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 2136f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse assert(count < 32); 2146f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse v->count = count; 2156f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse memcpy(v->elements, elements, count * sizeof(struct pipe_vertex_element)); 2166f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse v->refcount = 1; 2176f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return v; 2186f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 2196f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 220f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glissestatic void r600_delete_vertex_element(struct pipe_context *ctx, void *state) 221f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse{ 222f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse struct r600_vertex_element *v = (struct r600_vertex_element*)state; 223f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse 224f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse if (v == NULL) 225f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse return; 226f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse if (--v->refcount) 227f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse return; 228f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse free(v); 229f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse} 230f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse 231f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glissestatic void r600_bind_vertex_elements(struct pipe_context *ctx, void *state) 232f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse{ 233f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse struct r600_context *rctx = r600_context(ctx); 234f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse struct r600_vertex_element *v = (struct r600_vertex_element*)state; 235f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse 236f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse r600_delete_vertex_element(ctx, rctx->vertex_elements); 237f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse rctx->vertex_elements = v; 238f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse if (v) { 239f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse v->refcount++; 240f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse } 241f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse} 242f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse 2434ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airliestatic void r600_bind_rasterizer_state(struct pipe_context *ctx, void *state) 2446f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 2456f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context *rctx = r600_context(ctx); 2466f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rstate = (struct r600_context_state *)state; 2476f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 2486f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse if (state == NULL) 2496f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return; 2504ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->rasterizer = r600_context_state_decref(rctx->rasterizer); 2514ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->rasterizer = r600_context_state_incref(rstate); 2524ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie} 2534ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie 2544ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airliestatic void r600_bind_blend_state(struct pipe_context *ctx, void *state) 2554ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie{ 2564ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie struct r600_context *rctx = r600_context(ctx); 2574ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie struct r600_context_state *rstate = (struct r600_context_state *)state; 2584ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie 2594ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie if (state == NULL) 2606f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return; 2614ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->blend = r600_context_state_decref(rctx->blend); 2624ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->blend = r600_context_state_incref(rstate); 2634ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie 2644ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie} 2654ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie 2664ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airliestatic void r600_bind_dsa_state(struct pipe_context *ctx, void *state) 2674ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie{ 2684ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie struct r600_context *rctx = r600_context(ctx); 2694ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie struct r600_context_state *rstate = (struct r600_context_state *)state; 2704ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie 2714ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie if (state == NULL) 2724ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie return; 2734ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->dsa = r600_context_state_decref(rctx->dsa); 2744ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->dsa = r600_context_state_incref(rstate); 2756f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 2766f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 2776f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_bind_ps_shader(struct pipe_context *ctx, void *state) 2786f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 2796f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context *rctx = r600_context(ctx); 2806f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rstate = (struct r600_context_state *)state; 2816f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 2826f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->ps_shader = r600_context_state_decref(rctx->ps_shader); 2836f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->ps_shader = r600_context_state_incref(rstate); 2846f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 2856f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 2866f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_bind_vs_shader(struct pipe_context *ctx, void *state) 2876f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 2886f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context *rctx = r600_context(ctx); 2896f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rstate = (struct r600_context_state *)state; 2906f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 2916f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->vs_shader = r600_context_state_decref(rctx->vs_shader); 2926f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->vs_shader = r600_context_state_incref(rstate); 2936f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 2946f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 295191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_bind_sampler_shader(struct pipe_context *ctx, 296191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie unsigned count, void **states, 297191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie struct r600_shader_sampler_states *sampler, unsigned shader_id) 2986f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 2996f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context *rctx = r600_context(ctx); 3006f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rstate; 3016f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse unsigned i; 3026f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 303191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie for (i = 0; i < sampler->nsampler; i++) { 304191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie radeon_draw_unbind(&rctx->draw, sampler->sampler[i]); 305f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse } 306191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie for (i = 0; i < sampler->nborder; i++) { 307191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie radeon_draw_unbind(&rctx->draw, sampler->border[i]); 308b5fcf8274916afdf29aca5e8db7611687b03abe4Dave Airlie } 30931b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse for (i = 0; i < count; i++) { 31031b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse rstate = (struct r600_context_state *)states[i]; 31131b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse if (rstate) { 31231b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse rstate->nrstate = 0; 31331b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse } 3146f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse } 3156f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse for (i = 0; i < count; i++) { 3166f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rstate = (struct r600_context_state *)states[i]; 31715ce70252c5357081a61f3494261c7e343174301Jerome Glisse if (rstate) { 31831b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse if (rstate->nrstate >= R600_MAX_RSTATE) 31931b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse continue; 32031b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse if (rstate->nrstate) { 32131b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse memcpy(&rstate->rstate[rstate->nrstate], &rstate->rstate[0], sizeof(struct radeon_state)); 322b5fcf8274916afdf29aca5e8db7611687b03abe4Dave Airlie memcpy(&rstate->rstate[rstate->nrstate+1], &rstate->rstate[1], sizeof(struct radeon_state)); 32331b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse } 324191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie radeon_state_convert(&rstate->rstate[rstate->nrstate], R600_STATE_SAMPLER, i, shader_id); 325191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie radeon_state_convert(&rstate->rstate[rstate->nrstate + 1], R600_STATE_SAMPLER_BORDER, i, shader_id); 326191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie sampler->sampler[i] = &rstate->rstate[rstate->nrstate]; 327191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie sampler->border[i] = &rstate->rstate[rstate->nrstate + 1]; 328b5fcf8274916afdf29aca5e8db7611687b03abe4Dave Airlie rstate->nrstate += 2; 32915ce70252c5357081a61f3494261c7e343174301Jerome Glisse } 3306f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse } 331191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie sampler->nsampler = count; 332191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie sampler->nborder = count; 3336f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 3346f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 335191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_bind_ps_sampler(struct pipe_context *ctx, 3366f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse unsigned count, void **states) 3376f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 3386f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context *rctx = r600_context(ctx); 339191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie r600_bind_sampler_shader(ctx, count, states, &rctx->ps_sampler, R600_SHADER_PS); 340191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie} 3416f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 342191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_bind_vs_sampler(struct pipe_context *ctx, 343191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie unsigned count, void **states) 344191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie{ 345191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie struct r600_context *rctx = r600_context(ctx); 346191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie r600_bind_sampler_shader(ctx, count, states, &rctx->vs_sampler, R600_SHADER_VS); 3476f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 34872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 34972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glissestatic void r600_delete_state(struct pipe_context *ctx, void *state) 35072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 3516f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rstate = (struct r600_context_state *)state; 35272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 3536f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse r600_context_state_decref(rstate); 35472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 35572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 3566f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_blend_color(struct pipe_context *ctx, 3576f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_blend_color *color) 3586f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 3597bcd39ce50b7b710bb8561c430f345ebe91ab9a3Dave Airlie struct r600_context *rctx = r600_context(ctx); 3607bcd39ce50b7b710bb8561c430f345ebe91ab9a3Dave Airlie 3617bcd39ce50b7b710bb8561c430f345ebe91ab9a3Dave Airlie rctx->blend_color = *color; 3626f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 3636f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 3646f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_clip_state(struct pipe_context *ctx, 3656f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_clip_state *state) 3666f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 3673e58007892cb2e89cb979ab172b7160adc84a44dDave Airlie struct r600_context *rctx = r600_context(ctx); 3683e58007892cb2e89cb979ab172b7160adc84a44dDave Airlie struct r600_context_state *rstate; 3693e58007892cb2e89cb979ab172b7160adc84a44dDave Airlie 370ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie r600_context_state_decref(rctx->clip); 371ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie 37249b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate = r600_new_context_state(pipe_clip_type); 37349b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->state.clip = *state; 3749ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie rctx->vtbl->ucp(rctx, &rstate->rstate[0], &rstate->state.clip); 3754ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->clip = rstate; 3766f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 3776f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 3786f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_framebuffer_state(struct pipe_context *ctx, 3796f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_framebuffer_state *state) 3806f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 3816f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context *rctx = r600_context(ctx); 3826f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rstate; 38349b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie int i; 3846f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 385040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie if (rctx->framebuffer) { 386040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie for (i = 0; i < rctx->framebuffer->state.framebuffer.nr_cbufs; i++) 387040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie radeon_draw_unbind(&rctx->draw, &rctx->framebuffer->rstate[i+1]); 388040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie radeon_draw_unbind(&rctx->draw, &rctx->framebuffer->rstate[0]); 389040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie } 3904af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie clean_flush(rctx, &rctx->hw_states.cb_flush); 3914af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie clean_flush(rctx, &rctx->hw_states.db_flush); 392ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie 393040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie r600_context_state_decref(rctx->framebuffer); 394040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie 39549b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate = r600_new_context_state(pipe_framebuffer_type); 39649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->state.framebuffer = *state; 39749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie for (i = 0; i < rstate->state.framebuffer.nr_cbufs; i++) { 3985b82777311965d26e534bd522afb0f679622d504Dave Airlie pipe_reference(NULL, &state->cbufs[i]->reference); 39949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie } 4005b82777311965d26e534bd522afb0f679622d504Dave Airlie pipe_reference(NULL, &state->zsbuf->reference); 4014ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->framebuffer = rstate; 40249b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie for (i = 0; i < state->nr_cbufs; i++) { 4039ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie rctx->vtbl->cb(rctx, &rstate->rstate[i+1], state, i); 40415ce70252c5357081a61f3494261c7e343174301Jerome Glisse } 40515ce70252c5357081a61f3494261c7e343174301Jerome Glisse if (state->zsbuf) { 4069ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie rctx->vtbl->db(rctx, &rstate->rstate[0], state); 40715ce70252c5357081a61f3494261c7e343174301Jerome Glisse } 4084af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie /* setup flush states */ 4094af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie setup_cb_flush(rctx, &rctx->hw_states.cb_flush); 4104af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie setup_db_flush(rctx, &rctx->hw_states.db_flush); 4114af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie 4124ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie return; 4136f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 4146f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 4156f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_polygon_stipple(struct pipe_context *ctx, 4166f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_poly_stipple *state) 4176f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 4186f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 4196f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 4206f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask) 4216f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 4226f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 4236f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 4246f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_scissor_state(struct pipe_context *ctx, 4256f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_scissor_state *state) 4266f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 4276f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context *rctx = r600_context(ctx); 4286f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rstate; 4296f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 430ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie r600_context_state_decref(rctx->scissor); 431ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie 43249b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate = r600_new_context_state(pipe_scissor_type); 43349b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->state.scissor = *state; 4344ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->scissor = rstate; 4356f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 4366f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 4376f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_stencil_ref(struct pipe_context *ctx, 4386f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_stencil_ref *state) 4396f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 4406f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context *rctx = r600_context(ctx); 4416f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rstate; 4426f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 443ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie r600_context_state_decref(rctx->stencil_ref); 444ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie 44549b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate = r600_new_context_state(pipe_stencil_ref_type); 44649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->state.stencil_ref = *state; 4474ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->stencil_ref = rstate; 4486f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 4496f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 4506f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_vertex_buffers(struct pipe_context *ctx, 4516f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse unsigned count, 4526f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_vertex_buffer *buffers) 4536f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 4546f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context *rctx = r600_context(ctx); 4556f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse unsigned i; 4560d76bb5d4c5c867155f7fb381c46018e1560b790Dave Airlie boolean any_user_buffers = FALSE; 4576f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 4586f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse for (i = 0; i < rctx->nvertex_buffer; i++) { 4596f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse pipe_resource_reference(&rctx->vertex_buffer[i].buffer, NULL); 4606f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse } 4616f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse memcpy(rctx->vertex_buffer, buffers, sizeof(struct pipe_vertex_buffer) * count); 4626f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse for (i = 0; i < count; i++) { 4636f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->vertex_buffer[i].buffer = NULL; 4640d76bb5d4c5c867155f7fb381c46018e1560b790Dave Airlie if (r600_buffer_is_user_buffer(buffers[i].buffer)) 4650d76bb5d4c5c867155f7fb381c46018e1560b790Dave Airlie any_user_buffers = TRUE; 4666f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse pipe_resource_reference(&rctx->vertex_buffer[i].buffer, buffers[i].buffer); 4676f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse } 4680d76bb5d4c5c867155f7fb381c46018e1560b790Dave Airlie rctx->any_user_vbs = any_user_buffers; 4696f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->nvertex_buffer = count; 4706f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 4716f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 4726d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wustatic void r600_set_index_buffer(struct pipe_context *ctx, 4736d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu const struct pipe_index_buffer *ib) 4746d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu{ 4756d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu struct r600_context *rctx = r600_context(ctx); 4766d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu 4776d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu if (ib) { 4786d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu pipe_resource_reference(&rctx->index_buffer.buffer, ib->buffer); 4796d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu memcpy(&rctx->index_buffer, ib, sizeof(rctx->index_buffer)); 480313df4156279f84ebc5b98a7540820b994762650Jerome Glisse } else { 4816d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu pipe_resource_reference(&rctx->index_buffer.buffer, NULL); 4826d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu memset(&rctx->index_buffer, 0, sizeof(rctx->index_buffer)); 4836d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu } 4846d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu 4856d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu /* TODO make this more like a state */ 4866d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu} 4876d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu 4886f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_viewport_state(struct pipe_context *ctx, 4896f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse const struct pipe_viewport_state *state) 4906f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 4916f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context *rctx = r600_context(ctx); 4926f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse struct r600_context_state *rstate; 4936f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 494ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie r600_context_state_decref(rctx->viewport); 495ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie 49649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate = r600_new_context_state(pipe_viewport_type); 49749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie rstate->state.viewport = *state; 4989ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie rctx->vtbl->viewport(rctx, &rstate->rstate[0], &rstate->state.viewport); 4994ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->viewport = rstate; 5006f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 5016f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 5026f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissevoid r600_init_state_functions(struct r600_context *rctx) 5036f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 5046f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.create_blend_state = r600_create_blend_state; 5056f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.create_depth_stencil_alpha_state = r600_create_dsa_state; 5066f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.create_fs_state = r600_create_shader_state; 5076f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.create_rasterizer_state = r600_create_rs_state; 5086f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.create_sampler_state = r600_create_sampler_state; 5096f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.create_sampler_view = r600_create_sampler_view; 5106f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.create_vertex_elements_state = r600_create_vertex_elements; 5116f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.create_vs_state = r600_create_shader_state; 5124ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->context.bind_blend_state = r600_bind_blend_state; 5134ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->context.bind_depth_stencil_alpha_state = r600_bind_dsa_state; 5146f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.bind_fragment_sampler_states = r600_bind_ps_sampler; 5156f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.bind_fs_state = r600_bind_ps_shader; 5164ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie rctx->context.bind_rasterizer_state = r600_bind_rasterizer_state; 5176f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.bind_vertex_elements_state = r600_bind_vertex_elements; 5186f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.bind_vertex_sampler_states = r600_bind_vs_sampler; 5196f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.bind_vs_state = r600_bind_vs_shader; 5206f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.delete_blend_state = r600_delete_state; 5216f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.delete_depth_stencil_alpha_state = r600_delete_state; 5226f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.delete_fs_state = r600_delete_state; 5236f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.delete_rasterizer_state = r600_delete_state; 5246f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.delete_sampler_state = r600_delete_state; 5256f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.delete_vertex_elements_state = r600_delete_vertex_element; 5266f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.delete_vs_state = r600_delete_state; 5276f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.set_blend_color = r600_set_blend_color; 5286f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.set_clip_state = r600_set_clip_state; 52950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 530363dfb83f1ca7f1ab09eec30aeb89732c5ce3e02Jerome Glisse if (radeon_get_family_class(rctx->rw) == EVERGREEN) 53150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie rctx->context.set_constant_buffer = eg_set_constant_buffer; 53250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie else if (rctx->screen->use_mem_constant) 533d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie rctx->context.set_constant_buffer = r600_set_constant_buffer_mem; 534d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie else 535d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie rctx->context.set_constant_buffer = r600_set_constant_buffer_file; 53650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 5376f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.set_fragment_sampler_views = r600_set_ps_sampler_view; 5386f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.set_framebuffer_state = r600_set_framebuffer_state; 5396f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.set_polygon_stipple = r600_set_polygon_stipple; 5406f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.set_sample_mask = r600_set_sample_mask; 5416f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.set_scissor_state = r600_set_scissor_state; 5426f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.set_stencil_ref = r600_set_stencil_ref; 5436f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.set_vertex_buffers = r600_set_vertex_buffers; 5446d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu rctx->context.set_index_buffer = r600_set_index_buffer; 5456f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.set_vertex_sampler_views = r600_set_vs_sampler_view; 5466f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.set_viewport_state = r600_set_viewport_state; 5476f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rctx->context.sampler_view_destroy = r600_sampler_view_destroy; 5486f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 5496f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 5506f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestruct r600_context_state *r600_context_state_incref(struct r600_context_state *rstate) 5516f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 5526f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse if (rstate == NULL) 5536f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return NULL; 5546f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse rstate->refcount++; 5556f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return rstate; 5566f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 5576f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 5586f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestruct r600_context_state *r600_context_state_decref(struct r600_context_state *rstate) 5596f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{ 5606f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse unsigned i; 5616f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 5626f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse if (rstate == NULL) 5636f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return NULL; 5646f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse if (--rstate->refcount) 5656f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return NULL; 5666f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse switch (rstate->type) { 5676f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_sampler_view_type: 5686f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse pipe_resource_reference(&rstate->state.sampler_view.texture, NULL); 5696f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse break; 5706f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_framebuffer_type: 5716f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse for (i = 0; i < rstate->state.framebuffer.nr_cbufs; i++) { 5726f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse pipe_surface_reference(&rstate->state.framebuffer.cbufs[i], NULL); 5734af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie radeon_state_fini(&rstate->rstate[i+1]); 5746f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse } 5756f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse pipe_surface_reference(&rstate->state.framebuffer.zsbuf, NULL); 5766f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse break; 5776f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_viewport_type: 5786f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_depth_type: 5796f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_rasterizer_type: 5806f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_poly_stipple_type: 5816f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_scissor_type: 5826f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_clip_type: 5836f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_stencil_type: 5846f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_alpha_type: 5856f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_dsa_type: 5866f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_blend_type: 5876f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_stencil_ref_type: 5886f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_shader_type: 5896f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse case pipe_sampler_type: 5906f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse break; 5916f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse default: 5926f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse R600_ERR("invalid type %d\n", rstate->type); 5936f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return NULL; 5946f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse } 59567234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse radeon_state_fini(&rstate->rstate[0]); 5966f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse FREE(rstate); 5976f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return NULL; 5986f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse} 5996f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 600191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_bind_shader_sampler(struct r600_context *rctx, struct r600_shader_sampler_states *sampler) 601191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie{ 602191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie int i; 603191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie 604191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie for (i = 0; i < sampler->nsampler; i++) { 605191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie if (sampler->sampler[i]) 606191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie radeon_draw_bind(&rctx->draw, sampler->sampler[i]); 607191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie } 608191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie 609191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie for (i = 0; i < sampler->nborder; i++) { 610191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie if (sampler->border[i]) 611191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie radeon_draw_bind(&rctx->draw, sampler->border[i]); 612191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie } 613191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie 614191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie for (i = 0; i < sampler->nview; i++) { 615191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie if (sampler->view[i]) 616191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie radeon_draw_bind(&rctx->draw, sampler->view[i]); 617191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie } 618191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie} 619191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie 6204af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airliestatic void clean_flush(struct r600_context *rctx, struct radeon_state *flush) 6214af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie{ 6224af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie struct r600_screen *rscreen = rctx->screen; 6234af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie int i; 6244af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie 6254af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie for (i = 0 ; i < flush->nbo; i++) { 6264af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie radeon_ws_bo_reference(rscreen->rw, &flush->bo[i], NULL); 6274af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie } 6284af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie flush->nbo = 0; 6294af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie radeon_state_fini(flush); 6304af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie} 63142da02743358fd4b212f47d2727340dcd0578b5aDave Airlie 63242da02743358fd4b212f47d2727340dcd0578b5aDave Airliestatic int setup_cb_flush(struct r600_context *rctx, struct radeon_state *flush) 63342da02743358fd4b212f47d2727340dcd0578b5aDave Airlie{ 63442da02743358fd4b212f47d2727340dcd0578b5aDave Airlie struct r600_screen *rscreen = rctx->screen; 63542da02743358fd4b212f47d2727340dcd0578b5aDave Airlie struct r600_resource_texture *rtex; 63642da02743358fd4b212f47d2727340dcd0578b5aDave Airlie struct r600_resource *rbuffer; 63742da02743358fd4b212f47d2727340dcd0578b5aDave Airlie struct pipe_surface *surf; 63842da02743358fd4b212f47d2727340dcd0578b5aDave Airlie int i; 63942da02743358fd4b212f47d2727340dcd0578b5aDave Airlie 64042da02743358fd4b212f47d2727340dcd0578b5aDave Airlie radeon_state_init(flush, rscreen->rw, R600_STATE_CB_FLUSH, 0, 0); 64142da02743358fd4b212f47d2727340dcd0578b5aDave Airlie 64242da02743358fd4b212f47d2727340dcd0578b5aDave Airlie for (i = 0; i < rctx->framebuffer->state.framebuffer.nr_cbufs; i++) { 64342da02743358fd4b212f47d2727340dcd0578b5aDave Airlie surf = rctx->framebuffer->state.framebuffer.cbufs[i]; 64442da02743358fd4b212f47d2727340dcd0578b5aDave Airlie 64542da02743358fd4b212f47d2727340dcd0578b5aDave Airlie rtex = (struct r600_resource_texture*)surf->texture; 64642da02743358fd4b212f47d2727340dcd0578b5aDave Airlie rbuffer = &rtex->resource; 64742da02743358fd4b212f47d2727340dcd0578b5aDave Airlie /* just need to the bo to the flush list */ 648f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie radeon_ws_bo_reference(rscreen->rw, &flush->bo[i], rbuffer->bo); 64942da02743358fd4b212f47d2727340dcd0578b5aDave Airlie flush->placement[i] = RADEON_GEM_DOMAIN_VRAM; 65042da02743358fd4b212f47d2727340dcd0578b5aDave Airlie } 65142da02743358fd4b212f47d2727340dcd0578b5aDave Airlie flush->nbo = rctx->framebuffer->state.framebuffer.nr_cbufs; 65242da02743358fd4b212f47d2727340dcd0578b5aDave Airlie return radeon_state_pm4(flush); 65342da02743358fd4b212f47d2727340dcd0578b5aDave Airlie} 65442da02743358fd4b212f47d2727340dcd0578b5aDave Airlie 65542da02743358fd4b212f47d2727340dcd0578b5aDave Airliestatic int setup_db_flush(struct r600_context *rctx, struct radeon_state *flush) 65642da02743358fd4b212f47d2727340dcd0578b5aDave Airlie{ 65742da02743358fd4b212f47d2727340dcd0578b5aDave Airlie struct r600_screen *rscreen = rctx->screen; 65842da02743358fd4b212f47d2727340dcd0578b5aDave Airlie struct r600_resource_texture *rtex; 65942da02743358fd4b212f47d2727340dcd0578b5aDave Airlie struct r600_resource *rbuffer; 66042da02743358fd4b212f47d2727340dcd0578b5aDave Airlie struct pipe_surface *surf; 66142da02743358fd4b212f47d2727340dcd0578b5aDave Airlie 66242da02743358fd4b212f47d2727340dcd0578b5aDave Airlie surf = rctx->framebuffer->state.framebuffer.zsbuf; 66342da02743358fd4b212f47d2727340dcd0578b5aDave Airlie 66442da02743358fd4b212f47d2727340dcd0578b5aDave Airlie if (!surf) 66542da02743358fd4b212f47d2727340dcd0578b5aDave Airlie return 0; 66642da02743358fd4b212f47d2727340dcd0578b5aDave Airlie 66742da02743358fd4b212f47d2727340dcd0578b5aDave Airlie radeon_state_init(flush, rscreen->rw, R600_STATE_DB_FLUSH, 0, 0); 66842da02743358fd4b212f47d2727340dcd0578b5aDave Airlie rtex = (struct r600_resource_texture*)surf->texture; 66942da02743358fd4b212f47d2727340dcd0578b5aDave Airlie rbuffer = &rtex->resource; 67042da02743358fd4b212f47d2727340dcd0578b5aDave Airlie /* just need to the bo to the flush list */ 671f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie radeon_ws_bo_reference(rscreen->rw, &flush->bo[0], rbuffer->bo); 67242da02743358fd4b212f47d2727340dcd0578b5aDave Airlie flush->placement[0] = RADEON_GEM_DOMAIN_VRAM; 67342da02743358fd4b212f47d2727340dcd0578b5aDave Airlie 67442da02743358fd4b212f47d2727340dcd0578b5aDave Airlie flush->nbo = 1; 67542da02743358fd4b212f47d2727340dcd0578b5aDave Airlie return radeon_state_pm4(flush); 67642da02743358fd4b212f47d2727340dcd0578b5aDave Airlie} 67742da02743358fd4b212f47d2727340dcd0578b5aDave Airlie 678ed99c28d12579bb8ee79eb9cfa55452785be7b6eJerome Glisseint r600_context_hw_states(struct pipe_context *ctx) 67972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 680ed99c28d12579bb8ee79eb9cfa55452785be7b6eJerome Glisse struct r600_context *rctx = r600_context(ctx); 6816f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse unsigned i; 68250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 68366e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse /* build new states */ 6849ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie rctx->vtbl->rasterizer(rctx, &rctx->hw_states.rasterizer); 6859ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie rctx->vtbl->scissor(rctx, &rctx->hw_states.scissor); 6869ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie rctx->vtbl->dsa(rctx, &rctx->hw_states.dsa); 6879ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie rctx->vtbl->cb_cntl(rctx, &rctx->hw_states.cb_cntl); 68842da02743358fd4b212f47d2727340dcd0578b5aDave Airlie 68966e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse /* bind states */ 69050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie radeon_draw_bind(&rctx->draw, &rctx->config); 69150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 69266e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse radeon_draw_bind(&rctx->draw, &rctx->hw_states.rasterizer); 69366e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse radeon_draw_bind(&rctx->draw, &rctx->hw_states.scissor); 69466e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse radeon_draw_bind(&rctx->draw, &rctx->hw_states.dsa); 69566e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse radeon_draw_bind(&rctx->draw, &rctx->hw_states.cb_cntl); 69666e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse 69750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie radeon_draw_bind(&rctx->draw, &rctx->hw_states.db_flush); 69850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie radeon_draw_bind(&rctx->draw, &rctx->hw_states.cb_flush); 6996f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse 70015ce70252c5357081a61f3494261c7e343174301Jerome Glisse if (rctx->viewport) { 70167234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse radeon_draw_bind(&rctx->draw, &rctx->viewport->rstate[0]); 702de0b76cab22caa9fc7260f80acb8f151ccced6c5Jerome Glisse } 70315ce70252c5357081a61f3494261c7e343174301Jerome Glisse if (rctx->blend) { 70467234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse radeon_draw_bind(&rctx->draw, &rctx->blend->rstate[0]); 705de0b76cab22caa9fc7260f80acb8f151ccced6c5Jerome Glisse } 70615ce70252c5357081a61f3494261c7e343174301Jerome Glisse if (rctx->clip) { 70767234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse radeon_draw_bind(&rctx->draw, &rctx->clip->rstate[0]); 70815ce70252c5357081a61f3494261c7e343174301Jerome Glisse } 70915ce70252c5357081a61f3494261c7e343174301Jerome Glisse for (i = 0; i < rctx->framebuffer->state.framebuffer.nr_cbufs; i++) { 71067234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse radeon_draw_bind(&rctx->draw, &rctx->framebuffer->rstate[i+1]); 71115ce70252c5357081a61f3494261c7e343174301Jerome Glisse } 71215ce70252c5357081a61f3494261c7e343174301Jerome Glisse if (rctx->framebuffer->state.framebuffer.zsbuf) { 71367234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse radeon_draw_bind(&rctx->draw, &rctx->framebuffer->rstate[0]); 71415ce70252c5357081a61f3494261c7e343174301Jerome Glisse } 715191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie 716191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie r600_bind_shader_sampler(rctx, &rctx->vs_sampler); 717191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie r600_bind_shader_sampler(rctx, &rctx->ps_sampler); 718191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie 7196f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse return 0; 72072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 721