1a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs/* 2a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * Copyright 2012 Red Hat Inc. 3a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * 4a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 5a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * copy of this software and associated documentation files (the "Software"), 6a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * to deal in the Software without restriction, including without limitation 7a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * and/or sell copies of the Software, and to permit persons to whom the 9a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * Software is furnished to do so, subject to the following conditions: 10a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * 11a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * The above copyright notice and this permission notice shall be included in 12a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * all copies or substantial portions of the Software. 13a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * 14a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * SOFTWARE. 21a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * 22a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * Authors: Ben Skeggs 23a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * 24a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs */ 25a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 26a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "draw/draw_context.h" 27a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 28a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "nouveau/nv_object.xml.h" 29a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "nv30-40_3d.xml.h" 30a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 31a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "nouveau/nouveau_fence.h" 32a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "nv30_context.h" 33a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "nv30_transfer.h" 34a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#include "nv30_state.h" 35a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 36a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void 37a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_context_kick_notify(struct nouveau_pushbuf *push) 38a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 39a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_screen *screen; 40a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30; 41a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 42a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!push->user_priv) 43a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return; 44a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30 = container_of(push->user_priv, nv30, bufctx); 45a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs screen = &nv30->screen->base; 46a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 47a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nouveau_fence_next(screen); 48a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nouveau_fence_update(screen, TRUE); 49a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 50a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (push->bufctx) { 51a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_bufref *bref; 52a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs LIST_FOR_EACH_ENTRY(bref, &push->bufctx->current, thead) { 53a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv04_resource *res = bref->priv; 54a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (res && res->mm) { 55a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nouveau_fence_ref(screen->fence.current, &res->fence); 56a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 57a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (bref->flags & NOUVEAU_BO_RD) 58a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; 59a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 60a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (bref->flags & NOUVEAU_BO_WR) { 61a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nouveau_fence_ref(screen->fence.current, &res->fence_wr); 62a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING; 63a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 64a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 65a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 66a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 67a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 68a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 69a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void 70a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_context_flush(struct pipe_context *pipe, struct pipe_fence_handle **fence) 71a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 72a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30 = nv30_context(pipe); 73a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_pushbuf *push = nv30->base.pushbuf; 74a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 75a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (fence) 76a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nouveau_fence_ref(nv30->screen->base.fence.current, 77a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs (struct nouveau_fence **)fence); 78a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 79a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs PUSH_KICK(push); 80a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 81a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 82a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstatic void 83a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_context_destroy(struct pipe_context *pipe) 84a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 85a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30 = nv30_context(pipe); 86a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 87a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->draw) 88a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs draw_destroy(nv30->draw); 89a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 90a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nouveau_bufctx_del(&nv30->bufctx); 91a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 92a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (nv30->screen->cur_ctx == nv30) 93a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->screen->cur_ctx = NULL; 94a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 9517e047242e82111859eb8220369c601c79a26350Marcin Slusarz nouveau_context_destroy(&nv30->base); 96a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 97a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 98a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs#define FAIL_CONTEXT_INIT(str, err) \ 99a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs do { \ 100a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs NOUVEAU_ERR(str, err); \ 101a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_context_destroy(pipe); \ 102a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return NULL; \ 103a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } while(0) 104a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 105a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsstruct pipe_context * 106a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggsnv30_context_create(struct pipe_screen *pscreen, void *priv) 107a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs{ 108a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_screen *screen = nv30_screen(pscreen); 109a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nv30_context *nv30 = CALLOC_STRUCT(nv30_context); 110a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_pushbuf *push; 111a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct pipe_context *pipe; 112a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs int ret; 113a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 114a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (!nv30) 115a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return NULL; 116a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 117a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->screen = screen; 118a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->base.screen = &screen->base; 119a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->base.copy_data = nv30_transfer_copy_data; 120a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 121a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pipe = &nv30->base.pipe; 122a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pipe->screen = pscreen; 123a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pipe->priv = priv; 124a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pipe->destroy = nv30_context_destroy; 125a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs pipe->flush = nv30_context_flush; 126a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 127a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs /*XXX: *cough* per-context client */ 128a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->base.client = screen->base.client; 129a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 130a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs /*XXX: *cough* per-context pushbufs */ 131a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs push = screen->base.pushbuf; 132a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->base.pushbuf = push; 133a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->base.pushbuf->user_priv = push->user_priv; /* hack at validate time */ 134a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->base.pushbuf->rsvd_kick = 16; /* hack in screen before first space */ 135a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->base.pushbuf->kick_notify = nv30_context_kick_notify; 136a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 137a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs ret = nouveau_bufctx_new(nv30->base.client, 64, &nv30->bufctx); 138a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (ret) { 139a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_context_destroy(pipe); 140a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return NULL; 141a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs } 142a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 143a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs /*XXX: make configurable with performance vs quality, these defaults 144a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs * match the binary driver's defaults 145a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs */ 146a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (screen->eng3d->oclass < NV40_3D_CLASS) 147a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->config.filter = 0x00000004; 148a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs else 149a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->config.filter = 0x00002dc4; 150a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 151a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->config.aniso = NV40_3D_TEX_WRAP_ANISO_MIP_FILTER_OPTIMIZATION_OFF; 152a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 153a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs if (debug_get_bool_option("NV30_SWTNL", FALSE)) 154a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->draw_flags |= NV30_NEW_SWTNL; 155a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 156a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs /*XXX: nvfx... */ 157a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->is_nv4x = (screen->eng3d->oclass >= NV40_3D_CLASS) ? ~0 : 0; 158a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->use_nv4x = (screen->eng3d->oclass >= NV40_3D_CLASS) ? ~0 : 0; 159a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30->render_mode = HW; 160a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 161d37f90f131ff18f0902e79853b2dbdfd494baa17Ben Skeggs nv30->sample_mask = 0xffff; 162a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_vbo_init(pipe); 163a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_query_init(pipe); 164a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_state_init(pipe); 165a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_resource_init(pipe); 166a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_clear_init(pipe); 167a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_fragprog_init(pipe); 168a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_vertprog_init(pipe); 169a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_texture_init(pipe); 170a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_fragtex_init(pipe); 171a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv40_verttex_init(pipe); 172a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs nv30_draw_init(pipe); 173a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs 174a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs return pipe; 175a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs} 176