1fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt/* 2fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * Copyright 2011 Joakim Sindholt <opensource@zhasha.com> 3fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * Copyright 2013 Christoph Bumiller 4fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * 5fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * Permission is hereby granted, free of charge, to any person obtaining a 6fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * copy of this software and associated documentation files (the "Software"), 7fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * to deal in the Software without restriction, including without limitation 8fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * on the rights to use, copy, modify, merge, publish, distribute, sub 9fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * license, and/or sell copies of the Software, and to permit persons to whom 10fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * the Software is furnished to do so, subject to the following conditions: 11fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * 12fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * The above copyright notice and this permission notice (including the next 13fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * paragraph) shall be included in all copies or substantial portions of the 14fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * Software. 15fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * 16fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 20fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 21fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 22fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * USE OR OTHER DEALINGS IN THE SOFTWARE. */ 23fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 24ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph#define NINE_STATE 25ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 26fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "device9.h" 27ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph#include "swapchain9.h" 28fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "basetexture9.h" 29cc0114f30b587a10766ec212afb3ad356099ef23Axel Davy#include "buffer9.h" 30fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "indexbuffer9.h" 31fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "surface9.h" 32b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy#include "vertexbuffer9.h" 33fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "vertexdeclaration9.h" 34fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "vertexshader9.h" 35fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "pixelshader9.h" 36fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "nine_pipe.h" 37fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "nine_ff.h" 3864e232bd60336591e55e6c95112bac334cb38970Axel Davy#include "nine_limits.h" 39fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "pipe/p_context.h" 40fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "pipe/p_state.h" 41fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "cso_cache/cso_context.h" 42ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph#include "util/u_atomic.h" 43b06f3ee6f4ebf6ad403e7ee917c54bef85899c19Axel Davy#include "util/u_upload_mgr.h" 44fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "util/u_math.h" 45b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy#include "util/u_box.h" 46b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy#include "util/u_simple_shaders.h" 478d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy#include "util/u_gen_mipmap.h" 48fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 49ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph/* CSMT headers */ 50ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph#include "nine_queue.h" 51ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph#include "nine_csmt_helper.h" 52ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph#include "os/os_thread.h" 53ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 54fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#define DBG_CHANNEL DBG_DEVICE 55fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 56ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph/* Nine CSMT */ 57ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 58ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphstruct csmt_instruction { 59ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph int (* func)(struct NineDevice9 *This, struct csmt_instruction *instr); 60ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph}; 61ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 62ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphstruct csmt_context { 63ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_thread worker; 64ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct nine_queue_pool* pool; 65ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph BOOL terminate; 66ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_condvar event_processed; 67ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_mutex mutex_processed; 68ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct NineDevice9 *device; 69ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph BOOL processed; 707a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy BOOL toPause; 717a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy BOOL hasPaused; 727a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex thread_running; 737a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex thread_resume; 74ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph}; 75ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 76ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph/* Wait for instruction to be processed. 77ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph * Caller has to ensure that only one thread waits at time. 78ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph */ 79ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphstatic void 80ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphnine_csmt_wait_processed(struct csmt_context *ctx) 81ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph{ 82ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_mutex_lock(ctx->mutex_processed); 83ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph while (!p_atomic_read(&ctx->processed)) { 84ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_condvar_wait(ctx->event_processed, ctx->mutex_processed); 85ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph } 86ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_mutex_unlock(ctx->mutex_processed); 87ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph} 88ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 89ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph/* CSMT worker thread */ 90ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphstatic 91ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphPIPE_THREAD_ROUTINE(nine_csmt_worker, arg) 92ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph{ 93ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct csmt_context *ctx = arg; 94ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct csmt_instruction *instr; 95ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph DBG("CSMT worker spawned\n"); 96ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 97ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_thread_setname("CSMT-Worker"); 98ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 99ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph while (1) { 100ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph nine_queue_wait_flush(ctx->pool); 1017a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex_lock(ctx->thread_running); 102ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 103ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph /* Get instruction. NULL on empty cmdbuf. */ 104ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph while (!p_atomic_read(&ctx->terminate) && 105ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph (instr = (struct csmt_instruction *)nine_queue_get(ctx->pool))) { 106ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 107ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph /* decode */ 108ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph if (instr->func(ctx->device, instr)) { 109ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_mutex_lock(ctx->mutex_processed); 110ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph p_atomic_set(&ctx->processed, TRUE); 111ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_condvar_signal(ctx->event_processed); 112ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_mutex_unlock(ctx->mutex_processed); 113ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph } 1147a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy if (p_atomic_read(&ctx->toPause)) { 1157a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex_unlock(ctx->thread_running); 1167a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy /* will wait here the thread can be resumed */ 1177a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex_lock(ctx->thread_resume); 1187a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex_lock(ctx->thread_running); 1197a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex_unlock(ctx->thread_resume); 1207a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy } 121ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph } 1227a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy 1237a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex_unlock(ctx->thread_running); 124ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph if (p_atomic_read(&ctx->terminate)) { 125ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_mutex_lock(ctx->mutex_processed); 126ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph p_atomic_set(&ctx->processed, TRUE); 127ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_condvar_signal(ctx->event_processed); 128ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_mutex_unlock(ctx->mutex_processed); 129ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph break; 130ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph } 131ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph } 132ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 133ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph DBG("CSMT worker destroyed\n"); 134ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph return 0; 135ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph} 136ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 137ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph/* Create a CSMT context. 138ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph * Spawns a worker thread. 139ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph */ 140ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphstruct csmt_context * 141ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphnine_csmt_create( struct NineDevice9 *This ) 142ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph{ 143ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct csmt_context *ctx; 144ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 145ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ctx = CALLOC_STRUCT(csmt_context); 146ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph if (!ctx) 147ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph return NULL; 148ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 149ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ctx->pool = nine_queue_create(); 150ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph if (!ctx->pool) { 151ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph FREE(ctx); 152ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph return NULL; 153ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph } 154ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_condvar_init(ctx->event_processed); 155ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_mutex_init(ctx->mutex_processed); 1567a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex_init(ctx->thread_running); 1577a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex_init(ctx->thread_resume); 158ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 159ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph#if DEBUG 160ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_thread_setname("Main thread"); 161ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph#endif 162ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 163ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ctx->device = This; 164ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 165ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ctx->worker = pipe_thread_create(nine_csmt_worker, ctx); 166ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph if (!ctx->worker) { 167ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph nine_queue_delete(ctx->pool); 168ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph FREE(ctx); 169ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph return NULL; 170ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph } 171ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 172ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph DBG("Returning context %p\n", ctx); 173ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 174ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph return ctx; 175ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph} 176ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 177ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphstatic int 178ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphnop_func( struct NineDevice9 *This, struct csmt_instruction *instr ) 179ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph{ 180ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph (void) This; 181ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph (void) instr; 182ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 183ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph return 1; 184ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph} 185ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 186ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph/* Push nop instruction and flush the queue. 187ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph * Waits for the worker to complete. */ 188ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphvoid 189ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphnine_csmt_process( struct NineDevice9 *device ) 190ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph{ 191ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct csmt_instruction* instr; 192ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct csmt_context *ctx = device->csmt_ctx; 193ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 194ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph if (!device->csmt_active) 195ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph return; 196ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 197ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph if (nine_queue_isempty(ctx->pool)) 198ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph return; 199ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 200ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph DBG("device=%p\n", device); 201ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 202ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph /* NOP */ 203ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph instr = nine_queue_alloc(ctx->pool, sizeof(struct csmt_instruction)); 204ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph assert(instr); 205ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph instr->func = nop_func; 206ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 207ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph p_atomic_set(&ctx->processed, FALSE); 208ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph nine_queue_flush(ctx->pool); 209ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 210ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph nine_csmt_wait_processed(ctx); 211ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph} 212ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 213ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph/* Destroys a CSMT context. 214ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph * Waits for the worker thread to terminate. 215ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph */ 216ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphvoid 217ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphnine_csmt_destroy( struct NineDevice9 *device, struct csmt_context *ctx ) 218ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph{ 219ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct csmt_instruction* instr; 220ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_thread render_thread = ctx->worker; 221ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 222ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph DBG("device=%p ctx=%p\n", device, ctx); 223ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 224ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph /* Push nop and flush the queue. */ 225ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph instr = nine_queue_alloc(ctx->pool, sizeof(struct csmt_instruction)); 226ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph assert(instr); 227ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph instr->func = nop_func; 228ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 229ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph p_atomic_set(&ctx->processed, FALSE); 230ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph /* Signal worker to terminate. */ 231ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph p_atomic_set(&ctx->terminate, TRUE); 232ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph nine_queue_flush(ctx->pool); 233ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 234ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph nine_csmt_wait_processed(ctx); 235ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph nine_queue_delete(ctx->pool); 236ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_mutex_destroy(ctx->mutex_processed); 237ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 238ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph FREE(ctx); 239ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 240ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pipe_thread_wait(render_thread); 241ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph} 242ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 2437a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davystatic void 2447a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davynine_csmt_pause( struct NineDevice9 *device ) 2457a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy{ 2467a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy struct csmt_context *ctx = device->csmt_ctx; 2477a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy 2487a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy if (!device->csmt_active) 2497a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy return; 2507a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy 2517a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy /* No need to pause the thread */ 2527a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy if (nine_queue_no_flushed_work(ctx->pool)) 2537a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy return; 2547a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy 2557a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex_lock(ctx->thread_resume); 2567a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy p_atomic_set(&ctx->toPause, TRUE); 2577a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy 2587a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy /* Wait the thread is paused */ 2597a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex_lock(ctx->thread_running); 2607a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy ctx->hasPaused = TRUE; 2617a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy p_atomic_set(&ctx->toPause, FALSE); 2627a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy} 2637a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy 2647a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davystatic void 2657a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davynine_csmt_resume( struct NineDevice9 *device ) 2667a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy{ 2677a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy struct csmt_context *ctx = device->csmt_ctx; 2687a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy 2697a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy if (!device->csmt_active) 2707a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy return; 2717a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy 2727a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy if (!ctx->hasPaused) 2737a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy return; 2747a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy 2757a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy ctx->hasPaused = FALSE; 2767a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex_unlock(ctx->thread_running); 2777a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy pipe_mutex_unlock(ctx->thread_resume); 2787a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy} 2797a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy 280ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphstruct pipe_context * 281ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphnine_context_get_pipe( struct NineDevice9 *device ) 282ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph{ 283d43bc05e8ba0f326273c21b10f714e4d2514adaeAxel Davy nine_csmt_process(device); 284ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph return device->context.pipe; 285ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph} 286ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 287ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphstruct pipe_context * 288ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphnine_context_get_pipe_multithread( struct NineDevice9 *device ) 289ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph{ 290ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct csmt_context *ctx = device->csmt_ctx; 291ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 292ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph if (!device->csmt_active) 293ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph return device->context.pipe; 294ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 295ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph if (!pipe_thread_is_self(ctx->worker)) 296ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph nine_csmt_process(device); 297ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 298ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph return device->context.pipe; 299ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph} 3007a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy 3017a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davystruct pipe_context * 3027a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davynine_context_get_pipe_acquire( struct NineDevice9 *device ) 3037a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy{ 3047a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy nine_csmt_pause(device); 3057a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy return device->context.pipe; 3067a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy} 3077a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy 3087a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davyvoid 3097a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davynine_context_get_pipe_release( struct NineDevice9 *device ) 3107a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy{ 3117a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy nine_csmt_resume(device); 3127a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy} 3137a7eeefd7dd858682244e43eb5cb0d2c84fb0b07Axel Davy 314ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph/* Nine state functions */ 315ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 3169cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy/* Check if some states need to be set dirty */ 3179cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy 3189cae3cdc890b2aa261d635667a5850929a0913f5Axel Davystatic inline DWORD 3199cae3cdc890b2aa261d635667a5850929a0913f5Axel Davycheck_multisample(struct NineDevice9 *device) 3209cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy{ 32164e232bd60336591e55e6c95112bac334cb38970Axel Davy DWORD *rs = device->context.rs; 3229cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy DWORD new_value = (rs[D3DRS_ZENABLE] || rs[D3DRS_STENCILENABLE]) && 3237f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy device->context.rt[0]->desc.MultiSampleType >= 1 && 3249cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy rs[D3DRS_MULTISAMPLEANTIALIAS]; 3259cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy if (rs[NINED3DRS_MULTISAMPLE] != new_value) { 3269cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy rs[NINED3DRS_MULTISAMPLE] = new_value; 3279cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy return NINE_STATE_RASTERIZER; 3289cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy } 3299cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy return 0; 3309cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy} 3319cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy 33206285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy/* State preparation only */ 33306285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy 33471616d0c501077a04deb4f2a3cc115b50634763dAxel Davystatic inline void 335a3f0d21da9a33e58a4be41f65f77eebe1dd85841Axel Davyprepare_blend(struct NineDevice9 *device) 336a3f0d21da9a33e58a4be41f65f77eebe1dd85841Axel Davy{ 33766ad5b1592bb050269216bc64aa7916056cca466Axel Davy nine_convert_blend_state(&device->context.pipe_data.blend, device->context.rs); 3381b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy device->context.commit |= NINE_STATE_COMMIT_BLEND; 339a3f0d21da9a33e58a4be41f65f77eebe1dd85841Axel Davy} 340a3f0d21da9a33e58a4be41f65f77eebe1dd85841Axel Davy 341a3f0d21da9a33e58a4be41f65f77eebe1dd85841Axel Davystatic inline void 34271616d0c501077a04deb4f2a3cc115b50634763dAxel Davyprepare_dsa(struct NineDevice9 *device) 34371616d0c501077a04deb4f2a3cc115b50634763dAxel Davy{ 34466ad5b1592bb050269216bc64aa7916056cca466Axel Davy nine_convert_dsa_state(&device->context.pipe_data.dsa, device->context.rs); 3451b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy device->context.commit |= NINE_STATE_COMMIT_DSA; 34671616d0c501077a04deb4f2a3cc115b50634763dAxel Davy} 34771616d0c501077a04deb4f2a3cc115b50634763dAxel Davy 3485a2302b5ece2edf944b474eeb19ad7fc17906e7dAxel Davystatic inline void 3495a2302b5ece2edf944b474eeb19ad7fc17906e7dAxel Davyprepare_rasterizer(struct NineDevice9 *device) 3505a2302b5ece2edf944b474eeb19ad7fc17906e7dAxel Davy{ 35166ad5b1592bb050269216bc64aa7916056cca466Axel Davy nine_convert_rasterizer_state(device, &device->context.pipe_data.rast, device->context.rs); 3521b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy device->context.commit |= NINE_STATE_COMMIT_RASTERIZER; 3535a2302b5ece2edf944b474eeb19ad7fc17906e7dAxel Davy} 3545a2302b5ece2edf944b474eeb19ad7fc17906e7dAxel Davy 355fcca7ff38a6ba923abd910f50a8e2bcf6560e6aeAxel Davystatic void 3563bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davyprepare_vs_constants_userbuf_swvp(struct NineDevice9 *device) 3573bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy{ 3581b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 3593bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 360b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy if (context->changed.vs_const_f || context->changed.group & NINE_STATE_SWVP) { 3613bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy struct pipe_constant_buffer cb; 3623bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 3633bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb.buffer_offset = 0; 3643bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb.buffer_size = 4096 * sizeof(float[4]); 365b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy cb.user_buffer = context->vs_const_f_swvp; 3663bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 3672a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy if (context->vs->lconstf.ranges) { 3682a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy const struct nine_lconstf *lconstf = &(context->vs->lconstf); 3693bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy const struct nine_range *r = lconstf->ranges; 3703bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy unsigned n = 0; 371b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy float *dst = context->vs_lconstf_temp; 3723bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy float *src = (float *)cb.user_buffer; 3733bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy memcpy(dst, src, cb.buffer_size); 3743bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy while (r) { 3753bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy unsigned p = r->bgn; 3763bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy unsigned c = r->end - r->bgn; 3773bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy memcpy(&dst[p * 4], &lconstf->data[n * 4], c * 4 * sizeof(float)); 3783bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy n += c; 3793bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy r = r->next; 3803bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy } 3813bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb.user_buffer = dst; 3823bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy } 3833bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 384461e03167e20451ee2f531120f93894b23d802daAxel Davy /* Do not erase the buffer field. 385461e03167e20451ee2f531120f93894b23d802daAxel Davy * It is either NULL (user_cbufs), or a resource. 386461e03167e20451ee2f531120f93894b23d802daAxel Davy * u_upload_data will do the proper refcount */ 38766ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb0_swvp.buffer_offset = cb.buffer_offset; 38866ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb0_swvp.buffer_size = cb.buffer_size; 38966ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb0_swvp.user_buffer = cb.user_buffer; 3903bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 3913bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb.user_buffer = (char *)cb.user_buffer + 4096 * sizeof(float[4]); 39266ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb1_swvp.buffer_offset = cb.buffer_offset; 39366ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb1_swvp.buffer_size = cb.buffer_size; 39466ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb1_swvp.user_buffer = cb.user_buffer; 395b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 396b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.vs_const_f = 0; 3973bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy } 3983bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 399b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy if (context->changed.vs_const_i || context->changed.group & NINE_STATE_SWVP) { 4003bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy struct pipe_constant_buffer cb; 4013bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 4023bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb.buffer_offset = 0; 4033bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb.buffer_size = 2048 * sizeof(float[4]); 404b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy cb.user_buffer = context->vs_const_i; 4053bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 40666ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb2_swvp.buffer_offset = cb.buffer_offset; 40766ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb2_swvp.buffer_size = cb.buffer_size; 40866ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb2_swvp.user_buffer = cb.user_buffer; 409b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.vs_const_i = 0; 4103bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy } 4113bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 412b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy if (context->changed.vs_const_b || context->changed.group & NINE_STATE_SWVP) { 4133bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy struct pipe_constant_buffer cb; 4143bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 4153bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb.buffer_offset = 0; 4163bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb.buffer_size = 512 * sizeof(float[4]); 417b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy cb.user_buffer = context->vs_const_b; 4183bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 41966ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb3_swvp.buffer_offset = cb.buffer_offset; 42066ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb3_swvp.buffer_size = cb.buffer_size; 42166ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb3_swvp.user_buffer = cb.user_buffer; 422b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.vs_const_b = 0; 4233bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy } 4243bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 4253bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy if (!device->driver_caps.user_cbufs) { 42666ad5b1592bb050269216bc64aa7916056cca466Axel Davy struct pipe_constant_buffer *cb = &(context->pipe_data.cb0_swvp); 4273bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy u_upload_data(device->constbuf_uploader, 4283bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 0, 4293bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb->buffer_size, 4303bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy device->constbuf_alignment, 4313bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb->user_buffer, 4323bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy &(cb->buffer_offset), 4333bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy &(cb->buffer)); 4343bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy u_upload_unmap(device->constbuf_uploader); 4353bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb->user_buffer = NULL; 4363bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 43766ad5b1592bb050269216bc64aa7916056cca466Axel Davy cb = &(context->pipe_data.cb1_swvp); 4383bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy u_upload_data(device->constbuf_uploader, 4393bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 0, 4403bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb->buffer_size, 4413bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy device->constbuf_alignment, 4423bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb->user_buffer, 4433bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy &(cb->buffer_offset), 4443bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy &(cb->buffer)); 4453bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy u_upload_unmap(device->constbuf_uploader); 4463bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb->user_buffer = NULL; 4473bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 44866ad5b1592bb050269216bc64aa7916056cca466Axel Davy cb = &(context->pipe_data.cb2_swvp); 4493bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy u_upload_data(device->constbuf_uploader, 4503bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 0, 4513bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb->buffer_size, 4523bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy device->constbuf_alignment, 4533bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb->user_buffer, 4543bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy &(cb->buffer_offset), 4553bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy &(cb->buffer)); 4563bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy u_upload_unmap(device->constbuf_uploader); 4573bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb->user_buffer = NULL; 4583bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 45966ad5b1592bb050269216bc64aa7916056cca466Axel Davy cb = &(context->pipe_data.cb3_swvp); 4603bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy u_upload_data(device->constbuf_uploader, 4613bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 0, 4623bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb->buffer_size, 4633bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy device->constbuf_alignment, 4643bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb->user_buffer, 4653bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy &(cb->buffer_offset), 4663bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy &(cb->buffer)); 4673bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy u_upload_unmap(device->constbuf_uploader); 4683bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy cb->user_buffer = NULL; 4693bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy } 4703bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 471b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group &= ~NINE_STATE_VS_CONST; 4721b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->commit |= NINE_STATE_COMMIT_CONST_VS; 4733bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy} 4743bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 4753bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davystatic void 476993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davyprepare_vs_constants_userbuf(struct NineDevice9 *device) 477993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy{ 4781b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 479993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy struct pipe_constant_buffer cb; 480993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy cb.buffer = NULL; 481993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy cb.buffer_offset = 0; 4822a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy cb.buffer_size = context->vs->const_used_size; 483b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy cb.user_buffer = context->vs_const_f; 484993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 485bb666b0297cb81fc1b8192ba91efd2e0a69835c5Axel Davy if (context->swvp) { 4863bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy prepare_vs_constants_userbuf_swvp(device); 487993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy return; 4883bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy } 489993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 490b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy if (context->changed.vs_const_i || context->changed.group & NINE_STATE_SWVP) { 491b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy int *idst = (int *)&context->vs_const_f[4 * device->max_vs_const_f]; 492b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(idst, context->vs_const_i, NINE_MAX_CONST_I * sizeof(int[4])); 493b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.vs_const_i = 0; 494993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy } 4953bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 496b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy if (context->changed.vs_const_b || context->changed.group & NINE_STATE_SWVP) { 497b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy int *idst = (int *)&context->vs_const_f[4 * device->max_vs_const_f]; 498993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy uint32_t *bdst = (uint32_t *)&idst[4 * NINE_MAX_CONST_I]; 499b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(bdst, context->vs_const_b, NINE_MAX_CONST_B * sizeof(BOOL)); 500b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.vs_const_b = 0; 501993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy } 502993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 5033bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy if (!cb.buffer_size) 5043bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy return; 5053bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy 5062a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy if (context->vs->lconstf.ranges) { 507993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy /* TODO: Can we make it so that we don't have to copy everything ? */ 5082a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy const struct nine_lconstf *lconstf = &(context->vs->lconstf); 509993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy const struct nine_range *r = lconstf->ranges; 510993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy unsigned n = 0; 511b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy float *dst = context->vs_lconstf_temp; 512993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy float *src = (float *)cb.user_buffer; 513993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy memcpy(dst, src, cb.buffer_size); 514993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy while (r) { 515993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy unsigned p = r->bgn; 516993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy unsigned c = r->end - r->bgn; 517993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy memcpy(&dst[p * 4], &lconstf->data[n * 4], c * 4 * sizeof(float)); 518993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy n += c; 519993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy r = r->next; 520993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy } 521993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy cb.user_buffer = dst; 522993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy } 523993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 524993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy if (!device->driver_caps.user_cbufs) { 52566ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb_vs.buffer_size = cb.buffer_size; 526993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy u_upload_data(device->constbuf_uploader, 527993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 0, 528993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy cb.buffer_size, 529e0f932846c91e6eca6495c86b72e87af64dfefb5Marek Olšák device->constbuf_alignment, 530993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy cb.user_buffer, 53166ad5b1592bb050269216bc64aa7916056cca466Axel Davy &context->pipe_data.cb_vs.buffer_offset, 53266ad5b1592bb050269216bc64aa7916056cca466Axel Davy &context->pipe_data.cb_vs.buffer); 533993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy u_upload_unmap(device->constbuf_uploader); 53466ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb_vs.user_buffer = NULL; 535461e03167e20451ee2f531120f93894b23d802daAxel Davy } else 53666ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb_vs = cb; 537993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 538b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.vs_const_f = 0; 539a83dce01284f220b1bf932774730e13fca6cdd20Axel Davy 540b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group &= ~NINE_STATE_VS_CONST; 5411b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->commit |= NINE_STATE_COMMIT_CONST_VS; 542993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy} 543993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 544993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davystatic void 545993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davyprepare_ps_constants_userbuf(struct NineDevice9 *device) 546993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy{ 5471b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 548993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy struct pipe_constant_buffer cb; 549993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy cb.buffer = NULL; 550993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy cb.buffer_offset = 0; 551c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy cb.buffer_size = context->ps->const_used_size; 552b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy cb.user_buffer = context->ps_const_f; 553993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 554b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (context->changed.ps_const_i) { 555b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy int *idst = (int *)&context->ps_const_f[4 * device->max_ps_const_f]; 556b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(idst, context->ps_const_i, sizeof(context->ps_const_i)); 557b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.ps_const_i = 0; 558993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy } 559b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (context->changed.ps_const_b) { 560b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy int *idst = (int *)&context->ps_const_f[4 * device->max_ps_const_f]; 561993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy uint32_t *bdst = (uint32_t *)&idst[4 * NINE_MAX_CONST_I]; 562b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(bdst, context->ps_const_b, sizeof(context->ps_const_b)); 563b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.ps_const_b = 0; 564993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy } 565993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 566993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy /* Upload special constants needed to implement PS1.x instructions like TEXBEM,TEXBEML and BEM */ 567c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy if (context->ps->bumpenvmat_needed) { 568b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(context->ps_lconstf_temp, cb.user_buffer, cb.buffer_size); 569b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(&context->ps_lconstf_temp[4 * 8], &device->context.bumpmap_vars, sizeof(device->context.bumpmap_vars)); 570993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 571b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy cb.user_buffer = context->ps_lconstf_temp; 572993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy } 573993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 574c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy if (context->ps->byte_code.version < 0x30 && 57564e232bd60336591e55e6c95112bac334cb38970Axel Davy context->rs[D3DRS_FOGENABLE]) { 576b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy float *dst = &context->ps_lconstf_temp[4 * 32]; 577b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (cb.user_buffer != context->ps_lconstf_temp) { 578b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(context->ps_lconstf_temp, cb.user_buffer, cb.buffer_size); 579b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy cb.user_buffer = context->ps_lconstf_temp; 5808f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy } 5818f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy 58264e232bd60336591e55e6c95112bac334cb38970Axel Davy d3dcolor_to_rgba(dst, context->rs[D3DRS_FOGCOLOR]); 58364e232bd60336591e55e6c95112bac334cb38970Axel Davy if (context->rs[D3DRS_FOGTABLEMODE] == D3DFOG_LINEAR) { 58464e232bd60336591e55e6c95112bac334cb38970Axel Davy dst[4] = asfloat(context->rs[D3DRS_FOGEND]); 58564e232bd60336591e55e6c95112bac334cb38970Axel Davy dst[5] = 1.0f / (asfloat(context->rs[D3DRS_FOGEND]) - asfloat(context->rs[D3DRS_FOGSTART])); 58664e232bd60336591e55e6c95112bac334cb38970Axel Davy } else if (context->rs[D3DRS_FOGTABLEMODE] != D3DFOG_NONE) { 58764e232bd60336591e55e6c95112bac334cb38970Axel Davy dst[4] = asfloat(context->rs[D3DRS_FOGDENSITY]); 5888f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy } 5898f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy cb.buffer_size = 4 * 4 * 34; 5908f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy } 5918f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy 5928f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy if (!cb.buffer_size) 5938f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy return; 5948f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy 595993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy if (!device->driver_caps.user_cbufs) { 59666ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb_ps.buffer_size = cb.buffer_size; 597993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy u_upload_data(device->constbuf_uploader, 598993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 0, 599993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy cb.buffer_size, 600e0f932846c91e6eca6495c86b72e87af64dfefb5Marek Olšák device->constbuf_alignment, 601993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy cb.user_buffer, 60266ad5b1592bb050269216bc64aa7916056cca466Axel Davy &context->pipe_data.cb_ps.buffer_offset, 60366ad5b1592bb050269216bc64aa7916056cca466Axel Davy &context->pipe_data.cb_ps.buffer); 604993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy u_upload_unmap(device->constbuf_uploader); 60566ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb_ps.user_buffer = NULL; 606461e03167e20451ee2f531120f93894b23d802daAxel Davy } else 60766ad5b1592bb050269216bc64aa7916056cca466Axel Davy context->pipe_data.cb_ps = cb; 608993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 609b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.ps_const_f = 0; 610b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 611b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group &= ~NINE_STATE_PS_CONST; 6121b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->commit |= NINE_STATE_COMMIT_CONST_PS; 613993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy} 614993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 61569de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davystatic inline uint32_t 61669de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davyprepare_vs(struct NineDevice9 *device, uint8_t shader_changed) 61769de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy{ 6181b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 6192a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy struct NineVertexShader9 *vs = context->vs; 62069de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy uint32_t changed_group = 0; 62169de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy int has_key_changed = 0; 62269de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 6232a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy if (likely(context->programmable_vs)) 6243bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy has_key_changed = NineVertexShader9_UpdateKey(vs, device); 62569de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 62669de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy if (!shader_changed && !has_key_changed) 62769de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy return 0; 62869de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 62969de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy /* likely because we dislike FF */ 6302a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy if (likely(context->programmable_vs)) { 631fc49f7df8920df77dfbb0163a11486494f0c7883Axel Davy context->cso_shader.vs = NineVertexShader9_GetVariant(vs); 63269de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy } else { 63369de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy vs = device->ff.vs; 634fc49f7df8920df77dfbb0163a11486494f0c7883Axel Davy context->cso_shader.vs = vs->ff_cso; 63569de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy } 63669de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 63764e232bd60336591e55e6c95112bac334cb38970Axel Davy if (context->rs[NINED3DRS_VSPOINTSIZE] != vs->point_size) { 63864e232bd60336591e55e6c95112bac334cb38970Axel Davy context->rs[NINED3DRS_VSPOINTSIZE] = vs->point_size; 63969de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy changed_group |= NINE_STATE_RASTERIZER; 64069de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy } 64169de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 6421b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if ((context->bound_samplers_mask_vs & vs->sampler_mask) != vs->sampler_mask) 64369de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy /* Bound dummy sampler. */ 64469de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy changed_group |= NINE_STATE_SAMPLER; 64569de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 6461b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->commit |= NINE_STATE_COMMIT_VS; 64769de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy return changed_group; 64869de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy} 64969de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 65069de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davystatic inline uint32_t 65169de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davyprepare_ps(struct NineDevice9 *device, uint8_t shader_changed) 65269de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy{ 6531b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 654c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy struct NinePixelShader9 *ps = context->ps; 65569de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy uint32_t changed_group = 0; 65669de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy int has_key_changed = 0; 65769de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 65869de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy if (likely(ps)) 6591a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy has_key_changed = NinePixelShader9_UpdateKey(ps, context); 66069de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 66169de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy if (!shader_changed && !has_key_changed) 66269de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy return 0; 66369de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 66469de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy if (likely(ps)) { 665fc49f7df8920df77dfbb0163a11486494f0c7883Axel Davy context->cso_shader.ps = NinePixelShader9_GetVariant(ps); 66669de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy } else { 66769de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy ps = device->ff.ps; 668fc49f7df8920df77dfbb0163a11486494f0c7883Axel Davy context->cso_shader.ps = ps->ff_cso; 66969de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy } 67069de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 6711b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if ((context->bound_samplers_mask_ps & ps->sampler_mask) != ps->sampler_mask) 67269de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy /* Bound dummy sampler. */ 67369de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy changed_group |= NINE_STATE_SAMPLER; 67469de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 6751b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->commit |= NINE_STATE_COMMIT_PS; 67669de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy return changed_group; 67769de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy} 67869de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 67906285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy/* State preparation incremental */ 68006285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy 68106285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy/* State preparation + State commit */ 68206285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy 683ee31f0fed4bd97e3c9a0c4547ad908d55607f532Axel Davystatic void 684ee31f0fed4bd97e3c9a0c4547ad908d55607f532Axel Davyupdate_framebuffer(struct NineDevice9 *device, bool is_clear) 685fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 6861b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 687b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct pipe_context *pipe = context->pipe; 68866ad5b1592bb050269216bc64aa7916056cca466Axel Davy struct pipe_framebuffer_state *fb = &context->pipe_data.fb; 689fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt unsigned i; 6907f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy struct NineSurface9 *rt0 = context->rt[0]; 691dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy unsigned w = rt0->desc.Width; 692dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy unsigned h = rt0->desc.Height; 6938a50b1244fcb77334dc9d8e470061cd5f9537375Patrick Rudolph unsigned nr_samples = rt0->base.info.nr_samples; 694c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy unsigned ps_mask = context->ps ? context->ps->rt_mask : 1; 695ee31f0fed4bd97e3c9a0c4547ad908d55607f532Axel Davy unsigned mask = is_clear ? 0xf : ps_mask; 69664e232bd60336591e55e6c95112bac334cb38970Axel Davy const int sRGB = context->rs[D3DRS_SRGBWRITEENABLE] ? 1 : 0; 697fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 698fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt DBG("\n"); 699fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 7001b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->rt_mask = 0x0; 701fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt fb->nr_cbufs = 0; 702fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 703dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy /* all render targets must have the same size and the depth buffer must be 704dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy * bigger. Multisample has to match, according to spec. But some apps do 705dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy * things wrong there, and no error is returned. The behaviour they get 706dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy * apparently is that depth buffer is disabled if it doesn't match. 707dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy * Surely the same for render targets. */ 708dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy 709dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy /* Special case: D3DFMT_NULL is used to bound no real render target, 710dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy * but render to depth buffer. We have to not take into account the render 711dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy * target info. TODO: know what should happen when there are several render targers 712dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy * and the first one is D3DFMT_NULL */ 713d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy if (rt0->desc.Format == D3DFMT_NULL && context->ds) { 714d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy w = context->ds->desc.Width; 715d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy h = context->ds->desc.Height; 716d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy nr_samples = context->ds->base.info.nr_samples; 717dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy } 718dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy 719fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt for (i = 0; i < device->caps.NumSimultaneousRTs; ++i) { 7207f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy struct NineSurface9 *rt = context->rt[i]; 721dfe5e84e74b184748c48cf07d58c79c2c5685a2dAxel Davy 7229ac74e604bbce3b24565a9c277dc8f8fe9826e97Axel Davy if (rt && rt->desc.Format != D3DFMT_NULL && (mask & (1 << i)) && 7239ac74e604bbce3b24565a9c277dc8f8fe9826e97Axel Davy rt->desc.Width == w && rt->desc.Height == h && 7248a50b1244fcb77334dc9d8e470061cd5f9537375Patrick Rudolph rt->base.info.nr_samples == nr_samples) { 725fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt fb->cbufs[i] = NineSurface9_GetSurface(rt, sRGB); 7261b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->rt_mask |= 1 << i; 727fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt fb->nr_cbufs = i + 1; 728fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } else { 729fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt /* Color outputs must match RT slot, 730fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * drivers will have to handle NULL entries for GL, too. 731fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt */ 732fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt fb->cbufs[i] = NULL; 733fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 734fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 735fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 736d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy if (context->ds && context->ds->desc.Width >= w && 737d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy context->ds->desc.Height >= h && 738d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy context->ds->base.info.nr_samples == nr_samples) { 739d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy fb->zsbuf = NineSurface9_GetSurface(context->ds, 0); 740fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } else { 741fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt fb->zsbuf = NULL; 742fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 743fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 744fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt fb->width = w; 745fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt fb->height = h; 746fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 747fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt pipe->set_framebuffer_state(pipe, fb); /* XXX: cso ? */ 748fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 7491b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if (is_clear && context->rt_mask == ps_mask) 750b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group &= ~NINE_STATE_FB; 751fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 752fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 753fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstatic void 754fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtupdate_viewport(struct NineDevice9 *device) 755fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 756b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 757b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy const D3DVIEWPORT9 *vport = &context->viewport; 758fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt struct pipe_viewport_state pvport; 759fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 760907f28f87e3858028bce4477f0b57f7e5d76060aAxel Davy /* D3D coordinates are: 761fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * -1 .. +1 for X,Y and 762907f28f87e3858028bce4477f0b57f7e5d76060aAxel Davy * 0 .. +1 for Z (we use pipe_rasterizer_state.clip_halfz) 763fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt */ 764fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt pvport.scale[0] = (float)vport->Width * 0.5f; 765fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt pvport.scale[1] = (float)vport->Height * -0.5f; 766fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt pvport.scale[2] = vport->MaxZ - vport->MinZ; 767fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt pvport.translate[0] = (float)vport->Width * 0.5f + (float)vport->X; 768fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt pvport.translate[1] = (float)vport->Height * 0.5f + (float)vport->Y; 769fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt pvport.translate[2] = vport->MinZ; 770fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 7716e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy /* We found R600 and SI cards have some imprecision 7726e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * on the barycentric coordinates used for interpolation. 7736e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * Some shaders rely on having something precise. 7746e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * We found that the proprietary driver has the imprecision issue, 7756e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * except when the render target width and height are powers of two. 7766e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * It is using some sort of workaround for these cases 7776e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * which covers likely all the cases the applications rely 7786e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * on something precise. 7796e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * We haven't found the workaround, but it seems like it's better 7806e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * for applications if the imprecision is biased towards infinity 7816e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * instead of -infinity (which is what measured). So shift slightly 7826e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * the viewport: not enough to change rasterization result (in particular 7836e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * for multisampling), but enough to make the imprecision biased 7846e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * towards infinity. We do this shift only if render target width and 7856e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * height are powers of two. 7866e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy * Solves 'red shadows' bug on UE3 games. 7876e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy */ 7886e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy if (device->driver_bugs.buggy_barycentrics && 7896e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy ((vport->Width & (vport->Width-1)) == 0) && 7906e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy ((vport->Height & (vport->Height-1)) == 0)) { 7916e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy pvport.translate[0] -= 1.0f / 128.0f; 7926e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy pvport.translate[1] -= 1.0f / 128.0f; 7936e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy } 7946e825b69bd4fb163cba0a565616ed966fb1a8929Axel Davy 795b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy cso_set_viewport(context->cso, &pvport); 796fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 797fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 798fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt/* Loop through VS inputs and pick the vertex elements with the declared 799fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * usage from the vertex declaration, then insert the instance divisor from 800fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * the stream source frequency setting. 801fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt */ 802fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstatic void 803fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtupdate_vertex_elements(struct NineDevice9 *device) 804fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 8051b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 80643288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy const struct NineVertexDeclaration9 *vdecl = device->context.vdecl; 807fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt const struct NineVertexShader9 *vs; 808712a4c5438d0ce257344b5196c20ad7929b54a0eAxel Davy unsigned n, b, i; 809712a4c5438d0ce257344b5196c20ad7929b54a0eAxel Davy int index; 81017abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco char vdecl_index_map[16]; /* vs->num_inputs <= 16 */ 81117abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco char used_streams[device->caps.MaxStreams]; 81217abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco int dummy_vbo_stream = -1; 81317abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco BOOL need_dummy_vbo = FALSE; 814fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt struct pipe_vertex_element ve[PIPE_MAX_ATTRIBS]; 815fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 816aea7a019ef67a4a5cb83f97aceafac098275171cAxel Davy context->stream_usage_mask = 0; 81717abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco memset(vdecl_index_map, -1, 16); 81817abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco memset(used_streams, 0, device->caps.MaxStreams); 8192a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy vs = context->programmable_vs ? context->vs : device->ff.vs; 820fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 82117abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco if (vdecl) { 82217abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco for (n = 0; n < vs->num_inputs; ++n) { 82317abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco DBG("looking up input %u (usage %u) from vdecl(%p)\n", 82417abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco n, vs->input_map[n].ndecl, vdecl); 82517abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco 82617abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco for (i = 0; i < vdecl->nelems; i++) { 82717abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco if (vdecl->usage_map[i] == vs->input_map[n].ndecl) { 82817abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco vdecl_index_map[n] = i; 82917abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco used_streams[vdecl->elems[i].vertex_buffer_index] = 1; 83017abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco break; 83117abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco } 83217abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco } 83317abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco if (vdecl_index_map[n] < 0) 83417abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco need_dummy_vbo = TRUE; 83517abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco } 83617abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco } else { 83717abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco /* No vertex declaration. Likely will never happen in practice, 83817abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco * but we need not crash on this */ 83917abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco need_dummy_vbo = TRUE; 84017abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco } 84117abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco 84217abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco if (need_dummy_vbo) { 84317abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco for (i = 0; i < device->caps.MaxStreams; i++ ) { 84417abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco if (!used_streams[i]) { 84517abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco dummy_vbo_stream = i; 846993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy break; 847993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy } 848993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy } 849fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 850993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy /* there are less vertex shader inputs than stream slots, 851993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy * so if we need a slot for the dummy vbo, we should have found one */ 852993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy assert (!need_dummy_vbo || dummy_vbo_stream != -1); 853fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 854993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy for (n = 0; n < vs->num_inputs; ++n) { 855993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy index = vdecl_index_map[n]; 856993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy if (index >= 0) { 857993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy ve[n] = vdecl->elems[index]; 858993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy b = ve[n].vertex_buffer_index; 859aea7a019ef67a4a5cb83f97aceafac098275171cAxel Davy context->stream_usage_mask |= 1 << b; 860993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy /* XXX wine just uses 1 here: */ 861b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy if (context->stream_freq[b] & D3DSTREAMSOURCE_INSTANCEDATA) 862b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy ve[n].instance_divisor = context->stream_freq[b] & 0x7FFFFF; 863993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy } else { 864993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy /* if the vertex declaration is incomplete compared to what the 865993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy * vertex shader needs, we bind a dummy vbo with 0 0 0 0. 866993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy * This is not precised by the spec, but is the behaviour 867993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy * tested on win */ 868993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy ve[n].vertex_buffer_index = dummy_vbo_stream; 869993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy ve[n].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 870993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy ve[n].src_offset = 0; 871993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy ve[n].instance_divisor = 0; 872fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 873fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 874fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 8751b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if (context->dummy_vbo_bound_at != dummy_vbo_stream) { 8761b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if (context->dummy_vbo_bound_at >= 0) 877848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy context->changed.vtxbuf |= 1 << context->dummy_vbo_bound_at; 878993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy if (dummy_vbo_stream >= 0) { 879848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy context->changed.vtxbuf |= 1 << dummy_vbo_stream; 8801b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->vbo_bound_done = FALSE; 881fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 8821b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->dummy_vbo_bound_at = dummy_vbo_stream; 883fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 884993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 885b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy cso_set_vertex_elements(context->cso, vs->num_inputs, ve); 886fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 887fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 888fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstatic void 889fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtupdate_vertex_buffers(struct NineDevice9 *device) 890fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 8911b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 892b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct pipe_context *pipe = context->pipe; 89317abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco struct pipe_vertex_buffer dummy_vtxbuf; 894848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy uint32_t mask = context->changed.vtxbuf; 895fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt unsigned i; 896fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 897fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt DBG("mask=%x\n", mask); 898fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 8991b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if (context->dummy_vbo_bound_at >= 0) { 9001b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if (!context->vbo_bound_done) { 90117abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco dummy_vtxbuf.buffer = device->dummy_vbo; 90217abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco dummy_vtxbuf.stride = 0; 90317abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco dummy_vtxbuf.user_buffer = NULL; 90417abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco dummy_vtxbuf.buffer_offset = 0; 9051b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy pipe->set_vertex_buffers(pipe, context->dummy_vbo_bound_at, 90617abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco 1, &dummy_vtxbuf); 9071b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->vbo_bound_done = TRUE; 90817abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco } 9091b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy mask &= ~(1 << context->dummy_vbo_bound_at); 91017abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco } 91117abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco 912fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt for (i = 0; mask; mask >>= 1, ++i) { 913fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt if (mask & 1) { 914848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy if (context->vtxbuf[i].buffer) 915848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy pipe->set_vertex_buffers(pipe, i, 1, &context->vtxbuf[i]); 9164acbf420d1101bd32e8f23acadff5fe6c6fa9b26Axel Davy else 9174acbf420d1101bd32e8f23acadff5fe6c6fa9b26Axel Davy pipe->set_vertex_buffers(pipe, i, 1, NULL); 918fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 919fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 920fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 921848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy context->changed.vtxbuf = 0; 922fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 923fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 924a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean 92593ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davyupdate_sampler_derived(struct nine_context *context, unsigned s) 926fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 927fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt boolean changed = FALSE; 928fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 9297ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy if (context->samp[s][NINED3DSAMP_SHADOW] != context->texture[s].shadow) { 930fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt changed = TRUE; 9317ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy context->samp[s][NINED3DSAMP_SHADOW] = context->texture[s].shadow; 932fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 933fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 93493ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy if (context->samp[s][NINED3DSAMP_CUBETEX] != 9357ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy (context->texture[s].type == D3DRTYPE_CUBETEXTURE)) { 93609edc0555f91d76001b1ffc0e656b0614abb809aPatrick Rudolph changed = TRUE; 93793ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy context->samp[s][NINED3DSAMP_CUBETEX] = 9387ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy context->texture[s].type == D3DRTYPE_CUBETEXTURE; 93909edc0555f91d76001b1ffc0e656b0614abb809aPatrick Rudolph } 94009edc0555f91d76001b1ffc0e656b0614abb809aPatrick Rudolph 94193ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy if (context->samp[s][D3DSAMP_MIPFILTER] != D3DTEXF_NONE) { 9427ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy int lod = context->samp[s][D3DSAMP_MAXMIPLEVEL] - context->texture[s].lod; 943fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt if (lod < 0) 944fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt lod = 0; 94593ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy if (context->samp[s][NINED3DSAMP_MINLOD] != lod) { 946fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt changed = TRUE; 94793ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy context->samp[s][NINED3DSAMP_MINLOD] = lod; 948fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 949fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } else { 95093ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy context->changed.sampler[s] &= ~0x300; /* lod changes irrelevant */ 951fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 952fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 953fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt return changed; 954fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 955fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 956fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt/* TODO: add sRGB override to pipe_sampler_state ? */ 957fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstatic void 958fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtupdate_textures_and_samplers(struct NineDevice9 *device) 959fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 9601b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 961fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt struct pipe_sampler_view *view[NINE_MAX_SAMPLERS]; 962fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt unsigned num_textures; 963fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt unsigned i; 964fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt boolean commit_samplers; 965c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy uint16_t sampler_mask = context->ps ? context->ps->sampler_mask : 9662c54d154e86cd93caed527824166f468a6c24c70Axel Davy device->ff.ps->sampler_mask; 967fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 968fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt /* TODO: Can we reduce iterations here ? */ 969fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 970fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt commit_samplers = FALSE; 9711b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->bound_samplers_mask_ps = 0; 972fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt for (num_textures = 0, i = 0; i < NINE_MAX_SAMPLERS_PS; ++i) { 973fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt const unsigned s = NINE_SAMPLER_PS(i); 974fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt int sRGB; 9752c54d154e86cd93caed527824166f468a6c24c70Axel Davy 9767ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy if (!context->texture[s].enabled && !(sampler_mask & (1 << i))) { 977fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt view[i] = NULL; 978fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt continue; 979fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 980fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 9817ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy if (context->texture[s].enabled) { 98293ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy sRGB = context->samp[s][D3DSAMP_SRGBTEXTURE] ? 1 : 0; 983fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 9847ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy view[i] = context->texture[s].view[sRGB]; 9852c54d154e86cd93caed527824166f468a6c24c70Axel Davy num_textures = i + 1; 9862c54d154e86cd93caed527824166f468a6c24c70Axel Davy 98793ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy if (update_sampler_derived(context, s) || (context->changed.sampler[s] & 0x05fe)) { 98893ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy context->changed.sampler[s] = 0; 9892c54d154e86cd93caed527824166f468a6c24c70Axel Davy commit_samplers = TRUE; 990b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy nine_convert_sampler_state(context->cso, s, context->samp[s]); 9912c54d154e86cd93caed527824166f468a6c24c70Axel Davy } 9922c54d154e86cd93caed527824166f468a6c24c70Axel Davy } else { 9932c54d154e86cd93caed527824166f468a6c24c70Axel Davy /* Bind dummy sampler. We do not bind dummy sampler when 9942c54d154e86cd93caed527824166f468a6c24c70Axel Davy * it is not needed because it could add overhead. The 9952c54d154e86cd93caed527824166f468a6c24c70Axel Davy * dummy sampler should have r=g=b=0 and a=1. We do not 9962c54d154e86cd93caed527824166f468a6c24c70Axel Davy * unbind dummy sampler directly when they are not needed 9972c54d154e86cd93caed527824166f468a6c24c70Axel Davy * anymore, but they're going to be removed as long as texture 9982c54d154e86cd93caed527824166f468a6c24c70Axel Davy * or sampler states are changed. */ 99998f786b270b3e55a1e8a7bdc8182e436702748a2Axel Davy view[i] = device->dummy_sampler_view; 10002c54d154e86cd93caed527824166f468a6c24c70Axel Davy num_textures = i + 1; 10012c54d154e86cd93caed527824166f468a6c24c70Axel Davy 1002b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy cso_single_sampler(context->cso, PIPE_SHADER_FRAGMENT, 100398f786b270b3e55a1e8a7bdc8182e436702748a2Axel Davy s - NINE_SAMPLER_PS(0), &device->dummy_sampler_state); 10042c54d154e86cd93caed527824166f468a6c24c70Axel Davy 1005fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt commit_samplers = TRUE; 100693ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy context->changed.sampler[s] = ~0; 1007fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 10082c54d154e86cd93caed527824166f468a6c24c70Axel Davy 10091b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->bound_samplers_mask_ps |= (1 << s); 1010fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 10112c54d154e86cd93caed527824166f468a6c24c70Axel Davy 1012b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy cso_set_sampler_views(context->cso, PIPE_SHADER_FRAGMENT, num_textures, view); 1013fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 1014fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt if (commit_samplers) 1015b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy cso_single_sampler_done(context->cso, PIPE_SHADER_FRAGMENT); 1016fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 1017fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt commit_samplers = FALSE; 10182a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy sampler_mask = context->programmable_vs ? context->vs->sampler_mask : 0; 10191b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->bound_samplers_mask_vs = 0; 1020fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt for (num_textures = 0, i = 0; i < NINE_MAX_SAMPLERS_VS; ++i) { 1021fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt const unsigned s = NINE_SAMPLER_VS(i); 1022fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt int sRGB; 10232c54d154e86cd93caed527824166f468a6c24c70Axel Davy 10247ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy if (!context->texture[s].enabled && !(sampler_mask & (1 << i))) { 1025fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt view[i] = NULL; 1026fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt continue; 1027fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 1028fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 10297ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy if (context->texture[s].enabled) { 103093ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy sRGB = context->samp[s][D3DSAMP_SRGBTEXTURE] ? 1 : 0; 10312c54d154e86cd93caed527824166f468a6c24c70Axel Davy 10327ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy view[i] = context->texture[s].view[sRGB]; 10332c54d154e86cd93caed527824166f468a6c24c70Axel Davy num_textures = i + 1; 1034fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 103593ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy if (update_sampler_derived(context, s) || (context->changed.sampler[s] & 0x05fe)) { 103693ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy context->changed.sampler[s] = 0; 10372c54d154e86cd93caed527824166f468a6c24c70Axel Davy commit_samplers = TRUE; 1038b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy nine_convert_sampler_state(context->cso, s, context->samp[s]); 10392c54d154e86cd93caed527824166f468a6c24c70Axel Davy } 10402c54d154e86cd93caed527824166f468a6c24c70Axel Davy } else { 10412c54d154e86cd93caed527824166f468a6c24c70Axel Davy /* Bind dummy sampler. We do not bind dummy sampler when 10422c54d154e86cd93caed527824166f468a6c24c70Axel Davy * it is not needed because it could add overhead. The 10432c54d154e86cd93caed527824166f468a6c24c70Axel Davy * dummy sampler should have r=g=b=0 and a=1. We do not 10442c54d154e86cd93caed527824166f468a6c24c70Axel Davy * unbind dummy sampler directly when they are not needed 10452c54d154e86cd93caed527824166f468a6c24c70Axel Davy * anymore, but they're going to be removed as long as texture 10462c54d154e86cd93caed527824166f468a6c24c70Axel Davy * or sampler states are changed. */ 104798f786b270b3e55a1e8a7bdc8182e436702748a2Axel Davy view[i] = device->dummy_sampler_view; 10482c54d154e86cd93caed527824166f468a6c24c70Axel Davy num_textures = i + 1; 10492c54d154e86cd93caed527824166f468a6c24c70Axel Davy 1050b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy cso_single_sampler(context->cso, PIPE_SHADER_VERTEX, 105198f786b270b3e55a1e8a7bdc8182e436702748a2Axel Davy s - NINE_SAMPLER_VS(0), &device->dummy_sampler_state); 10522c54d154e86cd93caed527824166f468a6c24c70Axel Davy 1053fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt commit_samplers = TRUE; 105493ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy context->changed.sampler[s] = ~0; 1055fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 10562c54d154e86cd93caed527824166f468a6c24c70Axel Davy 10571b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->bound_samplers_mask_vs |= (1 << s); 1058fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 1059f15ff98e2c53f6ce62443b24e3a9cf79c60ddff7Axel Davy 1060b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy cso_set_sampler_views(context->cso, PIPE_SHADER_VERTEX, num_textures, view); 1061fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 1062fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt if (commit_samplers) 1063b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy cso_single_sampler_done(context->cso, PIPE_SHADER_VERTEX); 1064fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 1065fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 106606285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy/* State commit only */ 106706285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy 106806285530566ea3387b6eb3f8e1a0443132c3659bAxel Davystatic inline void 1069a3f0d21da9a33e58a4be41f65f77eebe1dd85841Axel Davycommit_blend(struct NineDevice9 *device) 1070a3f0d21da9a33e58a4be41f65f77eebe1dd85841Axel Davy{ 1071b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 1072b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy 1073b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy cso_set_blend(context->cso, &context->pipe_data.blend); 1074a3f0d21da9a33e58a4be41f65f77eebe1dd85841Axel Davy} 1075a3f0d21da9a33e58a4be41f65f77eebe1dd85841Axel Davy 1076a3f0d21da9a33e58a4be41f65f77eebe1dd85841Axel Davystatic inline void 107771616d0c501077a04deb4f2a3cc115b50634763dAxel Davycommit_dsa(struct NineDevice9 *device) 107871616d0c501077a04deb4f2a3cc115b50634763dAxel Davy{ 1079b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 1080b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy 1081b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy cso_set_depth_stencil_alpha(context->cso, &context->pipe_data.dsa); 108271616d0c501077a04deb4f2a3cc115b50634763dAxel Davy} 108371616d0c501077a04deb4f2a3cc115b50634763dAxel Davy 108471616d0c501077a04deb4f2a3cc115b50634763dAxel Davystatic inline void 108506285530566ea3387b6eb3f8e1a0443132c3659bAxel Davycommit_scissor(struct NineDevice9 *device) 108606285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy{ 1087b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 1088b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct pipe_context *pipe = context->pipe; 108906285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy 1090b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy pipe->set_scissor_states(pipe, 0, 1, &context->scissor); 109106285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy} 109206285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy 109306285530566ea3387b6eb3f8e1a0443132c3659bAxel Davystatic inline void 10945a2302b5ece2edf944b474eeb19ad7fc17906e7dAxel Davycommit_rasterizer(struct NineDevice9 *device) 10955a2302b5ece2edf944b474eeb19ad7fc17906e7dAxel Davy{ 1096b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 1097b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy 1098b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy cso_set_rasterizer(context->cso, &context->pipe_data.rast); 10995a2302b5ece2edf944b474eeb19ad7fc17906e7dAxel Davy} 11005a2302b5ece2edf944b474eeb19ad7fc17906e7dAxel Davy 11015a2302b5ece2edf944b474eeb19ad7fc17906e7dAxel Davystatic inline void 110206285530566ea3387b6eb3f8e1a0443132c3659bAxel Davycommit_index_buffer(struct NineDevice9 *device) 110306285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy{ 1104b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 1105b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct pipe_context *pipe = context->pipe; 1106b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy if (context->idxbuf.buffer) 1107b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy pipe->set_index_buffer(pipe, &context->idxbuf); 110806285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy else 110906285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy pipe->set_index_buffer(pipe, NULL); 111006285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy} 111106285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy 1112993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davystatic inline void 1113993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davycommit_vs_constants(struct NineDevice9 *device) 1114993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy{ 1115b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 1116b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct pipe_context *pipe = context->pipe; 1117993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 1118b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy if (unlikely(!context->programmable_vs)) 1119b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &context->pipe_data.cb_vs_ff); 11203bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy else { 1121bb666b0297cb81fc1b8192ba91efd2e0a69835c5Axel Davy if (context->swvp) { 1122b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &context->pipe_data.cb0_swvp); 1123b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 1, &context->pipe_data.cb1_swvp); 1124b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 2, &context->pipe_data.cb2_swvp); 1125b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 3, &context->pipe_data.cb3_swvp); 11263bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy } else { 1127b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &context->pipe_data.cb_vs); 11283bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy } 11293bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy } 1130993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy} 1131993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 1132993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davystatic inline void 1133993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davycommit_ps_constants(struct NineDevice9 *device) 1134993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy{ 1135b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 1136b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct pipe_context *pipe = context->pipe; 1137993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 1138b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy if (unlikely(!context->ps)) 1139b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy pipe->set_constant_buffer(pipe, PIPE_SHADER_FRAGMENT, 0, &context->pipe_data.cb_ps_ff); 114087ec6b56b28c25d4184422c40f576c24ebe7cd75Axel Davy else 1141b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy pipe->set_constant_buffer(pipe, PIPE_SHADER_FRAGMENT, 0, &context->pipe_data.cb_ps); 1142993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy} 1143993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 114469de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davystatic inline void 114569de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davycommit_vs(struct NineDevice9 *device) 114669de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy{ 11471b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 114869de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 1149b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy context->pipe->bind_vs_state(context->pipe, context->cso_shader.vs); 115069de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy} 115169de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 115269de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 115369de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davystatic inline void 115469de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davycommit_ps(struct NineDevice9 *device) 115569de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy{ 11561b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 115769de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy 1158b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy context->pipe->bind_fs_state(context->pipe, context->cso_shader.ps); 115969de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy} 116006285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy/* State Update */ 1161fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 1162fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy#define NINE_STATE_SHADER_CHANGE_VS \ 1163fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy (NINE_STATE_VS | \ 1164fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy NINE_STATE_TEXTURE | \ 116589344a80fc4479fa3ac466cb17706cf12070afe1Axel Davy NINE_STATE_FOG_SHADER | \ 11663bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy NINE_STATE_POINTSIZE_SHADER | \ 11673bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy NINE_STATE_SWVP) 1168fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy 1169fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy#define NINE_STATE_SHADER_CHANGE_PS \ 1170fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy (NINE_STATE_PS | \ 1171fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy NINE_STATE_TEXTURE | \ 1172fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy NINE_STATE_FOG_SHADER | \ 11734a00e4cdc970582df338ebf880168a4ef4ec05d9Axel Davy NINE_STATE_PS1X_SHADER) 1174fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 1175fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy#define NINE_STATE_FREQUENT \ 1176fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy (NINE_STATE_RASTERIZER | \ 1177fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy NINE_STATE_TEXTURE | \ 1178fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy NINE_STATE_SAMPLER | \ 1179fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy NINE_STATE_VS_CONST | \ 11809cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy NINE_STATE_PS_CONST | \ 11819cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy NINE_STATE_MULTISAMPLE) 1182fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy 1183fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy#define NINE_STATE_COMMON \ 1184fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy (NINE_STATE_FB | \ 1185fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy NINE_STATE_BLEND | \ 1186fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy NINE_STATE_DSA | \ 1187fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy NINE_STATE_VIEWPORT | \ 1188fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy NINE_STATE_VDECL | \ 118904e22a04a61e0388ccc5d8c65f79bc3cfa5ac3bcAxel Davy NINE_STATE_IDXBUF | \ 119004e22a04a61e0388ccc5d8c65f79bc3cfa5ac3bcAxel Davy NINE_STATE_STREAMFREQ) 1191fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy 1192fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy#define NINE_STATE_RARE \ 1193fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy (NINE_STATE_SCISSOR | \ 1194fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy NINE_STATE_BLEND_COLOR | \ 1195fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy NINE_STATE_STENCIL_REF | \ 1196fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy NINE_STATE_SAMPLE_MASK) 1197fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy 119864e232bd60336591e55e6c95112bac334cb38970Axel Davystatic void 119999537f68db829bd4708eb8e1b1ef0948f3dd3c66Axel Davynine_update_state(struct NineDevice9 *device) 1200fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 12011b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 1202b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct pipe_context *pipe = context->pipe; 1203fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt uint32_t group; 1204fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 1205b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy DBG("changed state groups: %x\n", context->changed.group); 1206fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 1207fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt /* NOTE: We may want to use the cso cache for everything, or let 1208fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * NineDevice9.RestoreNonCSOState actually set the states, then we wouldn't 1209fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * have to care about state being clobbered here and could merge this back 1210fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * into update_textures. Except, we also need to re-validate textures that 1211fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * may be dirty anyway, even if no texture bindings changed. 1212fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt */ 1213fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 1214fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt /* ff_update may change VS/PS dirty bits */ 1215c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy if (unlikely(!context->programmable_vs || !context->ps)) 1216fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt nine_ff_update(device); 1217b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy group = context->changed.group; 1218fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 1219fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy if (group & (NINE_STATE_SHADER_CHANGE_VS | NINE_STATE_SHADER_CHANGE_PS)) { 1220fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy if (group & NINE_STATE_SHADER_CHANGE_VS) 1221fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy group |= prepare_vs(device, (group & NINE_STATE_VS) != 0); /* may set NINE_STATE_RASTERIZER and NINE_STATE_SAMPLER*/ 1222fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy if (group & NINE_STATE_SHADER_CHANGE_PS) 1223fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy group |= prepare_ps(device, (group & NINE_STATE_PS) != 0); 1224fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy } 1225fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 1226fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy if (group & (NINE_STATE_COMMON | NINE_STATE_VS)) { 1227fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy if (group & NINE_STATE_FB) 1228ee31f0fed4bd97e3c9a0c4547ad908d55607f532Axel Davy update_framebuffer(device, FALSE); 1229fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt if (group & NINE_STATE_BLEND) 1230a3f0d21da9a33e58a4be41f65f77eebe1dd85841Axel Davy prepare_blend(device); 1231fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy if (group & NINE_STATE_DSA) 1232fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy prepare_dsa(device); 1233fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy if (group & NINE_STATE_VIEWPORT) 1234fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy update_viewport(device); 123504e22a04a61e0388ccc5d8c65f79bc3cfa5ac3bcAxel Davy if (group & (NINE_STATE_VDECL | NINE_STATE_VS | NINE_STATE_STREAMFREQ)) 1236fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy update_vertex_elements(device); 1237fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy if (group & NINE_STATE_IDXBUF) 1238fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy commit_index_buffer(device); 1239fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy } 1240fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 12413bf02d383fe94a69dfec3ff54ede3e3b2e9dff6bAxel Davy if (likely(group & (NINE_STATE_FREQUENT | NINE_STATE_VS | NINE_STATE_PS | NINE_STATE_SWVP))) { 12429cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy if (group & NINE_STATE_MULTISAMPLE) 12439cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy group |= check_multisample(device); 1244fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt if (group & NINE_STATE_RASTERIZER) 12455a2302b5ece2edf944b474eeb19ad7fc17906e7dAxel Davy prepare_rasterizer(device); 1246fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt if (group & (NINE_STATE_TEXTURE | NINE_STATE_SAMPLER)) 1247fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt update_textures_and_samplers(device); 12482a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy if ((group & (NINE_STATE_VS_CONST | NINE_STATE_VS | NINE_STATE_SWVP)) && context->programmable_vs) 1249f78089b962537364d52ba05aa14dacbe20de995cAxel Davy prepare_vs_constants_userbuf(device); 1250c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy if ((group & (NINE_STATE_PS_CONST | NINE_STATE_PS)) && context->ps) 1251f78089b962537364d52ba05aa14dacbe20de995cAxel Davy prepare_ps_constants_userbuf(device); 1252fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 1253fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy 1254848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy if (context->changed.vtxbuf) 1255fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt update_vertex_buffers(device); 1256fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 12571b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if (context->commit & NINE_STATE_COMMIT_BLEND) 1258a3f0d21da9a33e58a4be41f65f77eebe1dd85841Axel Davy commit_blend(device); 12591b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if (context->commit & NINE_STATE_COMMIT_DSA) 126071616d0c501077a04deb4f2a3cc115b50634763dAxel Davy commit_dsa(device); 12611b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if (context->commit & NINE_STATE_COMMIT_RASTERIZER) 12625a2302b5ece2edf944b474eeb19ad7fc17906e7dAxel Davy commit_rasterizer(device); 12631b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if (context->commit & NINE_STATE_COMMIT_CONST_VS) 1264993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy commit_vs_constants(device); 12651b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if (context->commit & NINE_STATE_COMMIT_CONST_PS) 1266993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy commit_ps_constants(device); 12671b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if (context->commit & NINE_STATE_COMMIT_VS) 126869de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy commit_vs(device); 12691b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if (context->commit & NINE_STATE_COMMIT_PS) 127069de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy commit_ps(device); 127171616d0c501077a04deb4f2a3cc115b50634763dAxel Davy 12721b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->commit = 0; 127371616d0c501077a04deb4f2a3cc115b50634763dAxel Davy 1274a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy if (unlikely(context->changed.ucp)) { 1275a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy pipe->set_clip_state(pipe, &context->clip); 1276a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy context->changed.ucp = FALSE; 1277fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy } 1278fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy 1279fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy if (unlikely(group & NINE_STATE_RARE)) { 1280fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy if (group & NINE_STATE_SCISSOR) 1281fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy commit_scissor(device); 1282fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy if (group & NINE_STATE_BLEND_COLOR) { 1283fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy struct pipe_blend_color color; 128464e232bd60336591e55e6c95112bac334cb38970Axel Davy d3dcolor_to_rgba(&color.color[0], context->rs[D3DRS_BLENDFACTOR]); 1285fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy pipe->set_blend_color(pipe, &color); 1286fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy } 1287fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy if (group & NINE_STATE_SAMPLE_MASK) { 12887f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy if (context->rt[0]->desc.MultiSampleType <= D3DMULTISAMPLE_NONMASKABLE) { 128960624be2033f06b414cf76794c2f3b061dc28332Patrick Rudolph pipe->set_sample_mask(pipe, ~0); 129060624be2033f06b414cf76794c2f3b061dc28332Patrick Rudolph } else { 129164e232bd60336591e55e6c95112bac334cb38970Axel Davy pipe->set_sample_mask(pipe, context->rs[D3DRS_MULTISAMPLEMASK]); 129260624be2033f06b414cf76794c2f3b061dc28332Patrick Rudolph } 1293fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy } 1294fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy if (group & NINE_STATE_STENCIL_REF) { 1295fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy struct pipe_stencil_ref ref; 129664e232bd60336591e55e6c95112bac334cb38970Axel Davy ref.ref_value[0] = context->rs[D3DRS_STENCILREF]; 1297fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy ref.ref_value[1] = ref.ref_value[0]; 1298fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy pipe->set_stencil_ref(pipe, &ref); 1299fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy } 1300fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy } 1301fb6c76f1bac039cddc66cb823e85437981ce8befAxel Davy 1302b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group &= 1303fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt (NINE_STATE_FF | NINE_STATE_VS_CONST | NINE_STATE_PS_CONST); 1304fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 1305fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt DBG("finished\n"); 130664e232bd60336591e55e6c95112bac334cb38970Axel Davy} 130764e232bd60336591e55e6c95112bac334cb38970Axel Davy 130864e232bd60336591e55e6c95112bac334cb38970Axel Davy#define RESZ_CODE 0x7fa05000 130964e232bd60336591e55e6c95112bac334cb38970Axel Davy 131064e232bd60336591e55e6c95112bac334cb38970Axel Davystatic void 131164e232bd60336591e55e6c95112bac334cb38970Axel DavyNineDevice9_ResolveZ( struct NineDevice9 *device ) 131264e232bd60336591e55e6c95112bac334cb38970Axel Davy{ 1313eed47b748f26363c0de063f51b0c67959e7e5b06Axel Davy struct nine_context *context = &device->context; 131464e232bd60336591e55e6c95112bac334cb38970Axel Davy const struct util_format_description *desc; 1315d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy struct NineSurface9 *source = context->ds; 131664e232bd60336591e55e6c95112bac334cb38970Axel Davy struct pipe_resource *src, *dst; 131764e232bd60336591e55e6c95112bac334cb38970Axel Davy struct pipe_blit_info blit; 131864e232bd60336591e55e6c95112bac334cb38970Axel Davy 131964e232bd60336591e55e6c95112bac334cb38970Axel Davy DBG("RESZ resolve\n"); 132064e232bd60336591e55e6c95112bac334cb38970Axel Davy 13217ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy if (!source || !context->texture[0].enabled || 13227ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy context->texture[0].type != D3DRTYPE_TEXTURE) 132364e232bd60336591e55e6c95112bac334cb38970Axel Davy return; 1324fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 132564e232bd60336591e55e6c95112bac334cb38970Axel Davy src = source->base.resource; 13267ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy dst = context->texture[0].resource; 132764e232bd60336591e55e6c95112bac334cb38970Axel Davy 132864e232bd60336591e55e6c95112bac334cb38970Axel Davy if (!src || !dst) 132964e232bd60336591e55e6c95112bac334cb38970Axel Davy return; 133064e232bd60336591e55e6c95112bac334cb38970Axel Davy 133164e232bd60336591e55e6c95112bac334cb38970Axel Davy /* check dst is depth format. we know already for src */ 133264e232bd60336591e55e6c95112bac334cb38970Axel Davy desc = util_format_description(dst->format); 133364e232bd60336591e55e6c95112bac334cb38970Axel Davy if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) 133464e232bd60336591e55e6c95112bac334cb38970Axel Davy return; 133564e232bd60336591e55e6c95112bac334cb38970Axel Davy 133664e232bd60336591e55e6c95112bac334cb38970Axel Davy memset(&blit, 0, sizeof(blit)); 133764e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.src.resource = src; 133864e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.src.level = 0; 133964e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.src.format = src->format; 134064e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.src.box.z = 0; 134164e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.src.box.depth = 1; 134264e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.src.box.x = 0; 134364e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.src.box.y = 0; 134464e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.src.box.width = src->width0; 134564e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.src.box.height = src->height0; 134664e232bd60336591e55e6c95112bac334cb38970Axel Davy 134764e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.dst.resource = dst; 134864e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.dst.level = 0; 134964e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.dst.format = dst->format; 135064e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.dst.box.z = 0; 135164e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.dst.box.depth = 1; 135264e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.dst.box.x = 0; 135364e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.dst.box.y = 0; 135464e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.dst.box.width = dst->width0; 135564e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.dst.box.height = dst->height0; 135664e232bd60336591e55e6c95112bac334cb38970Axel Davy 135764e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.mask = PIPE_MASK_ZS; 135864e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.filter = PIPE_TEX_FILTER_NEAREST; 135964e232bd60336591e55e6c95112bac334cb38970Axel Davy blit.scissor_enable = FALSE; 136064e232bd60336591e55e6c95112bac334cb38970Axel Davy 1361b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy context->pipe->blit(context->pipe, &blit); 136264e232bd60336591e55e6c95112bac334cb38970Axel Davy} 136364e232bd60336591e55e6c95112bac334cb38970Axel Davy 136464e232bd60336591e55e6c95112bac334cb38970Axel Davy#define ALPHA_TO_COVERAGE_ENABLE MAKEFOURCC('A', '2', 'M', '1') 136564e232bd60336591e55e6c95112bac334cb38970Axel Davy#define ALPHA_TO_COVERAGE_DISABLE MAKEFOURCC('A', '2', 'M', '0') 136664e232bd60336591e55e6c95112bac334cb38970Axel Davy 1367ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph/* Nine_context functions. 1368ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph * Serialized through CSMT macros. 1369ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph */ 137064e232bd60336591e55e6c95112bac334cb38970Axel Davy 1371ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphstatic void 1372ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphnine_context_set_texture_apply(struct NineDevice9 *device, 1373ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph DWORD stage, 1374ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph BOOL enabled, 1375ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph BOOL shadow, 1376ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph DWORD lod, 1377ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph D3DRESOURCETYPE type, 1378ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph uint8_t pstype, 1379ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct pipe_resource *res, 1380ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct pipe_sampler_view *view0, 1381ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct pipe_sampler_view *view1); 1382ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphstatic void 1383ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphnine_context_set_stream_source_apply(struct NineDevice9 *device, 1384ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph UINT StreamNumber, 1385ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct pipe_resource *res, 1386ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph UINT OffsetInBytes, 1387ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph UINT Stride); 1388ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 1389ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphstatic void 1390ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphnine_context_set_indices_apply(struct NineDevice9 *device, 1391ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph struct pipe_resource *res, 1392ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph UINT IndexSize, 1393ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph UINT OffsetInBytes); 1394ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 1395ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphstatic void 1396ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolphnine_context_set_pixel_shader_constant_i_transformed(struct NineDevice9 *device, 1397ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph UINT StartRegister, 1398ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph const int *pConstantData, 1399ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph unsigned pConstantData_size, 1400ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph UINT Vector4iCount); 1401ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 1402ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_render_state, 1403ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(D3DRENDERSTATETYPE, State), 1404ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, Value)) 140564e232bd60336591e55e6c95112bac334cb38970Axel Davy{ 140664e232bd60336591e55e6c95112bac334cb38970Axel Davy struct nine_context *context = &device->context; 140764e232bd60336591e55e6c95112bac334cb38970Axel Davy 140864e232bd60336591e55e6c95112bac334cb38970Axel Davy /* Amd hacks (equivalent to GL extensions) */ 140964e232bd60336591e55e6c95112bac334cb38970Axel Davy if (unlikely(State == D3DRS_POINTSIZE)) { 141064e232bd60336591e55e6c95112bac334cb38970Axel Davy if (Value == RESZ_CODE) { 141164e232bd60336591e55e6c95112bac334cb38970Axel Davy NineDevice9_ResolveZ(device); 141264e232bd60336591e55e6c95112bac334cb38970Axel Davy return; 141364e232bd60336591e55e6c95112bac334cb38970Axel Davy } 141464e232bd60336591e55e6c95112bac334cb38970Axel Davy 141564e232bd60336591e55e6c95112bac334cb38970Axel Davy if (Value == ALPHA_TO_COVERAGE_ENABLE || 141664e232bd60336591e55e6c95112bac334cb38970Axel Davy Value == ALPHA_TO_COVERAGE_DISABLE) { 141764e232bd60336591e55e6c95112bac334cb38970Axel Davy context->rs[NINED3DRS_ALPHACOVERAGE] = (Value == ALPHA_TO_COVERAGE_ENABLE); 1418b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_BLEND; 141964e232bd60336591e55e6c95112bac334cb38970Axel Davy return; 142064e232bd60336591e55e6c95112bac334cb38970Axel Davy } 142164e232bd60336591e55e6c95112bac334cb38970Axel Davy } 142264e232bd60336591e55e6c95112bac334cb38970Axel Davy 142364e232bd60336591e55e6c95112bac334cb38970Axel Davy /* NV hack */ 142464e232bd60336591e55e6c95112bac334cb38970Axel Davy if (unlikely(State == D3DRS_ADAPTIVETESS_Y)) { 142564e232bd60336591e55e6c95112bac334cb38970Axel Davy if (Value == D3DFMT_ATOC || (Value == D3DFMT_UNKNOWN && context->rs[NINED3DRS_ALPHACOVERAGE])) { 142664e232bd60336591e55e6c95112bac334cb38970Axel Davy context->rs[NINED3DRS_ALPHACOVERAGE] = (Value == D3DFMT_ATOC) ? 3 : 0; 142764e232bd60336591e55e6c95112bac334cb38970Axel Davy context->rs[NINED3DRS_ALPHACOVERAGE] &= context->rs[D3DRS_ALPHATESTENABLE] ? 3 : 2; 1428b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_BLEND; 142964e232bd60336591e55e6c95112bac334cb38970Axel Davy return; 143064e232bd60336591e55e6c95112bac334cb38970Axel Davy } 143164e232bd60336591e55e6c95112bac334cb38970Axel Davy } 143264e232bd60336591e55e6c95112bac334cb38970Axel Davy if (unlikely(State == D3DRS_ALPHATESTENABLE && (context->rs[NINED3DRS_ALPHACOVERAGE] & 2))) { 143364e232bd60336591e55e6c95112bac334cb38970Axel Davy DWORD alphacoverage_prev = context->rs[NINED3DRS_ALPHACOVERAGE]; 143464e232bd60336591e55e6c95112bac334cb38970Axel Davy context->rs[NINED3DRS_ALPHACOVERAGE] = (Value ? 3 : 2); 143564e232bd60336591e55e6c95112bac334cb38970Axel Davy if (context->rs[NINED3DRS_ALPHACOVERAGE] != alphacoverage_prev) 1436b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_BLEND; 143764e232bd60336591e55e6c95112bac334cb38970Axel Davy } 143864e232bd60336591e55e6c95112bac334cb38970Axel Davy 143964e232bd60336591e55e6c95112bac334cb38970Axel Davy context->rs[State] = nine_fix_render_state_value(State, Value); 1440b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= nine_render_state_group[State]; 144164e232bd60336591e55e6c95112bac334cb38970Axel Davy} 144264e232bd60336591e55e6c95112bac334cb38970Axel Davy 1443ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_texture_apply, 1444ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, stage), 1445ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(BOOL, enabled), 1446ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(BOOL, shadow), 1447ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, lod), 1448ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(D3DRESOURCETYPE, type), 1449ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(uint8_t, pstype), 1450ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_BIND_RES(struct pipe_resource, res), 1451ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_BIND_VIEW(struct pipe_sampler_view, view0), 1452ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_BIND_VIEW(struct pipe_sampler_view, view1)) 14538d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy{ 14548d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy struct nine_context *context = &device->context; 14558d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy 14568d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy context->texture[stage].enabled = enabled; 14578d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy context->samplers_shadow &= ~(1 << stage); 14588d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy context->samplers_shadow |= shadow << stage; 14598d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy context->texture[stage].shadow = shadow; 14608d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy context->texture[stage].lod = lod; 14618d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy context->texture[stage].type = type; 14628d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy context->texture[stage].pstype = pstype; 14638d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy pipe_resource_reference(&context->texture[stage].resource, res); 14648d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy pipe_sampler_view_reference(&context->texture[stage].view[0], view0); 14658d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy pipe_sampler_view_reference(&context->texture[stage].view[1], view1); 14668d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy 14678d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy context->changed.group |= NINE_STATE_TEXTURE; 14688d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy} 14698d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy 147064e232bd60336591e55e6c95112bac334cb38970Axel Davyvoid 14716bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davynine_context_set_texture(struct NineDevice9 *device, 14726bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy DWORD Stage, 14736bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy struct NineBaseTexture9 *tex) 14746bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy{ 14758d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy BOOL enabled = FALSE; 14768d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy BOOL shadow = FALSE; 14778d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy DWORD lod = 0; 14788d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy D3DRESOURCETYPE type = D3DRTYPE_TEXTURE; 14798d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy uint8_t pstype = 0; 14808d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy struct pipe_resource *res = NULL; 14818d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy struct pipe_sampler_view *view0 = NULL, *view1 = NULL; 14826bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy 14837ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy /* For managed pool, the data can be initially incomplete. 14847ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy * In that case, the texture is rebound later 14857ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy * (in NineBaseTexture9_Validate/NineBaseTexture9_UploadSelf). */ 14867ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy if (tex && tex->base.resource) { 14878d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy enabled = TRUE; 14888d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy shadow = tex->shadow; 14898d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy lod = tex->managed.lod; 14908d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy type = tex->base.type; 14918d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy pstype = tex->pstype; 14928d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy res = tex->base.resource; 14938d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy view0 = NineBaseTexture9_GetSamplerView(tex, 0); 14948d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy view1 = NineBaseTexture9_GetSamplerView(tex, 1); 14957ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy } 1496eed47b748f26363c0de063f51b0c67959e7e5b06Axel Davy 14978d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy nine_context_set_texture_apply(device, Stage, enabled, 14988d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy shadow, lod, type, pstype, 14998d967abb98d766e44478e4cc78dc844c29d4d360Axel Davy res, view0, view1); 15006bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy} 15016bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy 1502ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_sampler_state, 1503ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, Sampler), 1504ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(D3DSAMPLERSTATETYPE, Type), 1505ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, Value)) 150693ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy{ 150793ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy struct nine_context *context = &device->context; 150893ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy 150993ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy if (unlikely(!nine_check_sampler_state_value(Type, Value))) 151093ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy return; 151193ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy 151293ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy context->samp[Sampler][Type] = Value; 1513b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_SAMPLER; 151493ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy context->changed.sampler[Sampler] |= 1 << Type; 151593ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy} 151693ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy 1517ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_stream_source_apply, 1518ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, StreamNumber), 1519ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_BIND_RES(struct pipe_resource, res), 1520ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, OffsetInBytes), 1521ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, Stride)) 152208b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy{ 152308b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy struct nine_context *context = &device->context; 152408b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy const unsigned i = StreamNumber; 152508b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy 152608b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy context->vtxbuf[i].stride = Stride; 152708b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy context->vtxbuf[i].buffer_offset = OffsetInBytes; 152808b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy pipe_resource_reference(&context->vtxbuf[i].buffer, res); 152908b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy 153008b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy context->changed.vtxbuf |= 1 << StreamNumber; 153108b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy} 153208b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy 153393ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davyvoid 1534848ffc81e4c91414ec29464ee71560547a12cd64Axel Davynine_context_set_stream_source(struct NineDevice9 *device, 1535848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy UINT StreamNumber, 1536848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy struct NineVertexBuffer9 *pVBuf9, 1537848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy UINT OffsetInBytes, 1538848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy UINT Stride) 1539848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy{ 154008b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy struct pipe_resource *res = NULL; 15418960be0e939bc6c0f9f34c5d4a16891af7e325fdAxel Davy unsigned offset = 0; 1542848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy 154308b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy if (pVBuf9) 15448960be0e939bc6c0f9f34c5d4a16891af7e325fdAxel Davy res = NineVertexBuffer9_GetResource(pVBuf9, &offset); 154508b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy /* in the future when there is internal offset, add it 154608b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy * to OffsetInBytes */ 1547848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy 154808b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy nine_context_set_stream_source_apply(device, StreamNumber, 15498960be0e939bc6c0f9f34c5d4a16891af7e325fdAxel Davy res, offset + OffsetInBytes, 155008b717dfd33cb733ef3558ef3edf2e051396c462Axel Davy Stride); 1551848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy} 1552848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy 1553ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_stream_source_freq, 1554ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, StreamNumber), 1555ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, Setting)) 155663633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy{ 155763633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy struct nine_context *context = &device->context; 155863633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy 155963633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy context->stream_freq[StreamNumber] = Setting; 156063633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy 156163633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy if (Setting & D3DSTREAMSOURCE_INSTANCEDATA) 156263633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy context->stream_instancedata_mask |= 1 << StreamNumber; 156363633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy else 156463633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy context->stream_instancedata_mask &= ~(1 << StreamNumber); 156563633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy 156663633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy if (StreamNumber != 0) 1567b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_STREAMFREQ; 156863633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy} 156963633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy 1570ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_indices_apply, 1571ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_BIND_RES(struct pipe_resource, res), 1572ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, IndexSize), 1573ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, OffsetInBytes)) 157469f447752debda137498c9891ffcbc15a3db301aAxel Davy{ 157569f447752debda137498c9891ffcbc15a3db301aAxel Davy struct nine_context *context = &device->context; 157669f447752debda137498c9891ffcbc15a3db301aAxel Davy 157769f447752debda137498c9891ffcbc15a3db301aAxel Davy context->idxbuf.index_size = IndexSize; 157869f447752debda137498c9891ffcbc15a3db301aAxel Davy context->idxbuf.offset = OffsetInBytes; 157969f447752debda137498c9891ffcbc15a3db301aAxel Davy pipe_resource_reference(&context->idxbuf.buffer, res); 158069f447752debda137498c9891ffcbc15a3db301aAxel Davy context->idxbuf.user_buffer = NULL; 158169f447752debda137498c9891ffcbc15a3db301aAxel Davy 158269f447752debda137498c9891ffcbc15a3db301aAxel Davy context->changed.group |= NINE_STATE_IDXBUF; 158369f447752debda137498c9891ffcbc15a3db301aAxel Davy} 158469f447752debda137498c9891ffcbc15a3db301aAxel Davy 158563633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davyvoid 1586aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davynine_context_set_indices(struct NineDevice9 *device, 1587aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy struct NineIndexBuffer9 *idxbuf) 1588aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy{ 1589aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy const struct pipe_index_buffer *pipe_idxbuf; 159069f447752debda137498c9891ffcbc15a3db301aAxel Davy struct pipe_resource *res = NULL; 159169f447752debda137498c9891ffcbc15a3db301aAxel Davy UINT IndexSize = 0; 159269f447752debda137498c9891ffcbc15a3db301aAxel Davy UINT OffsetInBytes = 0; 1593aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy 1594aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy if (idxbuf) { 1595aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy pipe_idxbuf = NineIndexBuffer9_GetBuffer(idxbuf); 159669f447752debda137498c9891ffcbc15a3db301aAxel Davy IndexSize = pipe_idxbuf->index_size; 159769f447752debda137498c9891ffcbc15a3db301aAxel Davy res = pipe_idxbuf->buffer; 159869f447752debda137498c9891ffcbc15a3db301aAxel Davy OffsetInBytes = pipe_idxbuf->offset; 159969f447752debda137498c9891ffcbc15a3db301aAxel Davy } 1600aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy 160169f447752debda137498c9891ffcbc15a3db301aAxel Davy nine_context_set_indices_apply(device, res, IndexSize, OffsetInBytes); 1602aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy} 1603aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy 1604ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_vertex_declaration, 1605ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_BIND_REF(struct NineVertexDeclaration9, vdecl)) 160643288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy{ 160743288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy struct nine_context *context = &device->context; 16082a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy BOOL was_programmable_vs = context->programmable_vs; 160943288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy 161043288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy nine_bind(&context->vdecl, vdecl); 161143288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy 16122a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy context->programmable_vs = context->vs && !(context->vdecl && context->vdecl->position_t); 16132a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy if (was_programmable_vs != context->programmable_vs) { 161443288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy context->commit |= NINE_STATE_COMMIT_CONST_VS; 1615b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_VS; 161643288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy } 161743288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy 1618b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_VDECL; 161943288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy} 162043288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy 1621ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_vertex_shader, 1622ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_BIND_REF(struct NineVertexShader9, pShader)) 16232a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy{ 16242a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy struct nine_context *context = &device->context; 16252a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy BOOL was_programmable_vs = context->programmable_vs; 16262a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy 16272a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy nine_bind(&context->vs, pShader); 16282a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy 16292a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy context->programmable_vs = context->vs && !(context->vdecl && context->vdecl->position_t); 16302a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy 16312a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy /* ff -> non-ff: commit back non-ff constants */ 16322a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy if (!was_programmable_vs && context->programmable_vs) 16332a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy context->commit |= NINE_STATE_COMMIT_CONST_VS; 16342a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy 1635b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_VS; 16362a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy} 16372a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy 1638ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_vertex_shader_constant_f, 1639ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, StartRegister), 1640ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM(float, pConstantData), 1641ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM_SIZE(unsigned, pConstantData_size), 1642ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, Vector4fCount)) 1643b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy{ 1644b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy struct nine_context *context = &device->context; 1645b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy float *vs_const_f = device->may_swvp ? context->vs_const_f_swvp : context->vs_const_f; 1646b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1647b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(&vs_const_f[StartRegister * 4], 1648b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy pConstantData, 1649ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pConstantData_size); 1650b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1651b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (device->may_swvp) { 1652b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy Vector4fCount = MIN2(StartRegister + Vector4fCount, NINE_MAX_CONST_F) - StartRegister; 1653b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (StartRegister < NINE_MAX_CONST_F) 1654b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(&context->vs_const_f[StartRegister * 4], 1655b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy pConstantData, 1656b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy Vector4fCount * 4 * sizeof(context->vs_const_f[0])); 1657b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 1658b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1659b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.vs_const_f = TRUE; 1660b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_VS_CONST; 1661b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy} 1662b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1663ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_vertex_shader_constant_i, 1664ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, StartRegister), 1665ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM(int, pConstantData), 1666ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM_SIZE(unsigned, pConstantData_size), 1667ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, Vector4iCount)) 1668b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy{ 1669b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy struct nine_context *context = &device->context; 1670b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy int i; 1671b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1672b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (device->driver_caps.vs_integer) { 1673b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(&context->vs_const_i[4 * StartRegister], 1674b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy pConstantData, 1675ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pConstantData_size); 1676b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } else { 1677b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy for (i = 0; i < Vector4iCount; i++) { 1678b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->vs_const_i[4 * (StartRegister + i)] = fui((float)(pConstantData[4 * i])); 1679b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->vs_const_i[4 * (StartRegister + i) + 1] = fui((float)(pConstantData[4 * i + 1])); 1680b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->vs_const_i[4 * (StartRegister + i) + 2] = fui((float)(pConstantData[4 * i + 2])); 1681b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->vs_const_i[4 * (StartRegister + i) + 3] = fui((float)(pConstantData[4 * i + 3])); 1682b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 1683b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 1684b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1685b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.vs_const_i = TRUE; 1686b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_VS_CONST; 1687b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy} 1688b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1689ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_vertex_shader_constant_b, 1690ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, StartRegister), 1691ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM(BOOL, pConstantData), 1692ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM_SIZE(unsigned, pConstantData_size), 1693ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, BoolCount)) 1694b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy{ 1695b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy struct nine_context *context = &device->context; 1696b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy int i; 1697b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy uint32_t bool_true = device->driver_caps.vs_integer ? 0xFFFFFFFF : fui(1.0f); 1698b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1699ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph (void) pConstantData_size; 1700ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 1701b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy for (i = 0; i < BoolCount; i++) 1702b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->vs_const_b[StartRegister + i] = pConstantData[i] ? bool_true : 0; 1703b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1704b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.vs_const_b = TRUE; 1705b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_VS_CONST; 1706b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy} 1707b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1708ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_pixel_shader, 1709ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_BIND_REF(struct NinePixelShader9, ps)) 1710c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy{ 1711c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy struct nine_context *context = &device->context; 1712c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy unsigned old_mask = context->ps ? context->ps->rt_mask : 1; 1713c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy unsigned mask; 1714c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy 1715c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy /* ff -> non-ff: commit back non-ff constants */ 1716c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy if (!context->ps && ps) 1717c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy context->commit |= NINE_STATE_COMMIT_CONST_PS; 1718c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy 1719c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy nine_bind(&context->ps, ps); 1720c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy 1721b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_PS; 1722c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy 1723c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy mask = context->ps ? context->ps->rt_mask : 1; 1724c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy /* We need to update cbufs if the pixel shader would 1725c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy * write to different render targets */ 1726c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy if (mask != old_mask) 1727b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_FB; 1728c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy} 1729c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy 1730ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_pixel_shader_constant_f, 1731ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, StartRegister), 1732ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM(float, pConstantData), 1733ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM_SIZE(unsigned, pConstantData_size), 1734ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, Vector4fCount)) 1735b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy{ 1736b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy struct nine_context *context = &device->context; 1737b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1738b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(&context->ps_const_f[StartRegister * 4], 1739b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy pConstantData, 1740ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pConstantData_size); 1741b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1742b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.ps_const_f = TRUE; 1743b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_PS_CONST; 1744b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy} 1745b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 174697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy/* For stateblocks */ 1747ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_pixel_shader_constant_i_transformed, 1748ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, StartRegister), 1749ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM(int, pConstantData), 1750ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM_SIZE(unsigned, pConstantData_size), 1751ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, Vector4iCount)) 175297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy{ 175397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy struct nine_context *context = &device->context; 175497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 175597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy memcpy(&context->ps_const_i[StartRegister][0], 175697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy pConstantData, 175797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy Vector4iCount * sizeof(context->ps_const_i[0])); 175897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 175997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy context->changed.ps_const_i = TRUE; 176097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy context->changed.group |= NINE_STATE_PS_CONST; 176197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy} 176297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 1763ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_pixel_shader_constant_i, 1764ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, StartRegister), 1765ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM(int, pConstantData), 1766ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM_SIZE(unsigned, pConstantData_size), 1767ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, Vector4iCount)) 1768b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy{ 1769b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy struct nine_context *context = &device->context; 1770b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy int i; 1771b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1772b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (device->driver_caps.ps_integer) { 1773b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(&context->ps_const_i[StartRegister][0], 1774b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy pConstantData, 1775ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph pConstantData_size); 1776b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } else { 1777b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy for (i = 0; i < Vector4iCount; i++) { 1778b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->ps_const_i[StartRegister+i][0] = fui((float)(pConstantData[4*i])); 1779b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->ps_const_i[StartRegister+i][1] = fui((float)(pConstantData[4*i+1])); 1780b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->ps_const_i[StartRegister+i][2] = fui((float)(pConstantData[4*i+2])); 1781b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->ps_const_i[StartRegister+i][3] = fui((float)(pConstantData[4*i+3])); 1782b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 1783b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 1784b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.ps_const_i = TRUE; 1785b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_PS_CONST; 1786b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy} 1787b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1788ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_pixel_shader_constant_b, 1789ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, StartRegister), 1790ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM(BOOL, pConstantData), 1791ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_MEM_SIZE(unsigned, pConstantData_size), 1792ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, BoolCount)) 1793b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy{ 1794b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy struct nine_context *context = &device->context; 1795b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy int i; 1796b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy uint32_t bool_true = device->driver_caps.ps_integer ? 0xFFFFFFFF : fui(1.0f); 1797b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1798ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph (void) pConstantData_size; 1799ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph 1800b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy for (i = 0; i < BoolCount; i++) 1801b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->ps_const_b[StartRegister + i] = pConstantData[i] ? bool_true : 0; 1802b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1803b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.ps_const_b = TRUE; 1804b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_PS_CONST; 1805b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy} 1806b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 1807ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph/* XXX: use resource, as resource might change */ 1808ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_render_target, 1809ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, RenderTargetIndex), 1810ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_BIND_REF(struct NineSurface9, rt)) 18117f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy{ 18127f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy struct nine_context *context = &device->context; 18137f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy const unsigned i = RenderTargetIndex; 18147f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy 18157f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy if (i == 0) { 18164a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy context->viewport.X = 0; 18174a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy context->viewport.Y = 0; 18184a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy context->viewport.Width = rt->desc.Width; 18194a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy context->viewport.Height = rt->desc.Height; 18204a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy context->viewport.MinZ = 0.0f; 18214a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy context->viewport.MaxZ = 1.0f; 18224a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy 18239498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy context->scissor.minx = 0; 18249498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy context->scissor.miny = 0; 18259498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy context->scissor.maxx = rt->desc.Width; 18269498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy context->scissor.maxy = rt->desc.Height; 18279498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy 1828b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_VIEWPORT | NINE_STATE_SCISSOR | NINE_STATE_MULTISAMPLE; 18297f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy 18307f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy if (context->rt[0] && 18317f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy (context->rt[0]->desc.MultiSampleType <= D3DMULTISAMPLE_NONMASKABLE) != 18327f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy (rt->desc.MultiSampleType <= D3DMULTISAMPLE_NONMASKABLE)) 1833b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_SAMPLE_MASK; 18347f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy } 18357f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy 18367f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy if (context->rt[i] != rt) { 18377f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy nine_bind(&context->rt[i], rt); 1838b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_FB; 18397f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy } 18407f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy} 18417f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy 1842ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph/* XXX: use resource instead of ds, as resource might change */ 1843ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_depth_stencil, 1844ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_BIND_REF(struct NineSurface9, ds)) 1845d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy{ 1846d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy struct nine_context *context = &device->context; 1847d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy 1848d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy nine_bind(&context->ds, ds); 1849b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_FB; 1850d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy} 1851d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy 1852ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_viewport, 1853ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_COPY_REF(D3DVIEWPORT9, viewport)) 18544a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy{ 18554a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy struct nine_context *context = &device->context; 18564a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy 18574a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy context->viewport = *viewport; 1858b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_VIEWPORT; 18594a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy} 18604a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy 1861ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_scissor, 1862ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_COPY_REF(struct pipe_scissor_state, scissor)) 18639498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy{ 18649498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy struct nine_context *context = &device->context; 18659498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy 18669498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy context->scissor = *scissor; 1867b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_SCISSOR; 18689498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy} 18699498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy 1870ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_transform, 1871ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(D3DTRANSFORMSTATETYPE, State), 1872ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_COPY_REF(D3DMATRIX, pMatrix)) 18731a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy{ 18741a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy struct nine_context *context = &device->context; 18751a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy D3DMATRIX *M = nine_state_access_transform(&context->ff, State, TRUE); 18761a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 18771a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy *M = *pMatrix; 18781a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.changed.transform[State / 32] |= 1 << (State % 32); 1879b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_FF; 18801a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy} 18811a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 1882ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_material, 1883ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_COPY_REF(D3DMATERIAL9, pMaterial)) 18841a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy{ 18851a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy struct nine_context *context = &device->context; 18861a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 18871a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.material = *pMaterial; 1888b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_FF_MATERIAL; 18891a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy} 18901a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 1891ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_light, 1892ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, Index), 1893ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_COPY_REF(D3DLIGHT9, pLight)) 18941a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy{ 18951a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy struct nine_context *context = &device->context; 18961a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 18971a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy (void)nine_state_set_light(&context->ff, Index, pLight); 1898b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_FF_LIGHTING; 18991a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy} 19001a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 190197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 190297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy/* For stateblocks */ 190397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davystatic void 190497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davynine_context_light_enable_stateblock(struct NineDevice9 *device, 190597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy const uint16_t active_light[NINE_MAX_LIGHTS_ACTIVE], /* TODO: use pointer that convey size for csmt */ 190697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy unsigned int num_lights_active) 190797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy{ 190897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy struct nine_context *context = &device->context; 190997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 1910d43bc05e8ba0f326273c21b10f714e4d2514adaeAxel Davy /* TODO: Use CSMT_* to avoid calling nine_csmt_process */ 1911d43bc05e8ba0f326273c21b10f714e4d2514adaeAxel Davy nine_csmt_process(device); 191297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy memcpy(context->ff.active_light, active_light, NINE_MAX_LIGHTS_ACTIVE * sizeof(context->ff.active_light[0])); 191397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy context->ff.num_lights_active = num_lights_active; 191497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy context->changed.group |= NINE_STATE_FF_LIGHTING; 191597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy} 191697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 1917ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_light_enable, 1918ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, Index), 1919ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(BOOL, Enable)) 19201a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy{ 19211a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy struct nine_context *context = &device->context; 19221a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 1923b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy nine_state_light_enable(&context->ff, &context->changed.group, Index, Enable); 19241a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy} 19251a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 1926ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_texture_stage_state, 1927ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, Stage), 1928ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(D3DTEXTURESTAGESTATETYPE, Type), 1929ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, Value)) 19301a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy{ 19311a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy struct nine_context *context = &device->context; 19321a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy int bumpmap_index = -1; 19331a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 19341a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.tex_stage[Stage][Type] = Value; 19351a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy switch (Type) { 19361a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy case D3DTSS_BUMPENVMAT00: 19371a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy bumpmap_index = 4 * Stage; 19381a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy break; 19391a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy case D3DTSS_BUMPENVMAT01: 19401a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy bumpmap_index = 4 * Stage + 1; 19411a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy break; 19421a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy case D3DTSS_BUMPENVMAT10: 19431a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy bumpmap_index = 4 * Stage + 2; 19441a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy break; 19451a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy case D3DTSS_BUMPENVMAT11: 19461a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy bumpmap_index = 4 * Stage + 3; 19471a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy break; 19481a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy case D3DTSS_BUMPENVLSCALE: 19491a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy bumpmap_index = 4 * 8 + 2 * Stage; 19501a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy break; 19511a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy case D3DTSS_BUMPENVLOFFSET: 19521a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy bumpmap_index = 4 * 8 + 2 * Stage + 1; 19531a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy break; 19541a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy case D3DTSS_TEXTURETRANSFORMFLAGS: 1955b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_PS1X_SHADER; 19561a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy break; 19571a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy default: 19581a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy break; 19591a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy } 19601a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 19611a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy if (bumpmap_index >= 0) { 19621a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->bumpmap_vars[bumpmap_index] = Value; 1963b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_PS_CONST; 19641a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy } 19651a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 1966b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= NINE_STATE_FF_PSSTAGES; 19671a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.changed.tex_stage[Stage][Type / 32] |= 1 << (Type % 32); 19681a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy} 19691a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 1970ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_clip_plane, 1971ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, Index), 1972ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_COPY_REF(struct nine_clipplane, pPlane)) 1973a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy{ 1974a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy struct nine_context *context = &device->context; 1975a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy 1976a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy memcpy(&context->clip.ucp[Index][0], pPlane, sizeof(context->clip.ucp[0])); 1977a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy context->changed.ucp = TRUE; 1978a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy} 1979a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy 1980ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_set_swvp, 1981ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(boolean, swvp)) 1982bb666b0297cb81fc1b8192ba91efd2e0a69835c5Axel Davy{ 1983bb666b0297cb81fc1b8192ba91efd2e0a69835c5Axel Davy struct nine_context *context = &device->context; 1984bb666b0297cb81fc1b8192ba91efd2e0a69835c5Axel Davy 1985bb666b0297cb81fc1b8192ba91efd2e0a69835c5Axel Davy context->swvp = swvp; 1986bb666b0297cb81fc1b8192ba91efd2e0a69835c5Axel Davy context->changed.group |= NINE_STATE_SWVP; 1987bb666b0297cb81fc1b8192ba91efd2e0a69835c5Axel Davy} 1988bb666b0297cb81fc1b8192ba91efd2e0a69835c5Axel Davy 198997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy#if 0 199097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 1991a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davyvoid 19926bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davynine_context_apply_stateblock(struct NineDevice9 *device, 199364e232bd60336591e55e6c95112bac334cb38970Axel Davy const struct nine_state *src) 199464e232bd60336591e55e6c95112bac334cb38970Axel Davy{ 19956bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy struct nine_context *context = &device->context; 199664e232bd60336591e55e6c95112bac334cb38970Axel Davy int i; 199764e232bd60336591e55e6c95112bac334cb38970Axel Davy 1998b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group |= src->changed.group; 1999b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy 200064e232bd60336591e55e6c95112bac334cb38970Axel Davy for (i = 0; i < ARRAY_SIZE(src->changed.rs); ++i) { 200164e232bd60336591e55e6c95112bac334cb38970Axel Davy uint32_t m = src->changed.rs[i]; 200264e232bd60336591e55e6c95112bac334cb38970Axel Davy while (m) { 200364e232bd60336591e55e6c95112bac334cb38970Axel Davy const int r = ffs(m) - 1; 200464e232bd60336591e55e6c95112bac334cb38970Axel Davy m &= ~(1 << r); 20056bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy context->rs[i * 32 + r] = nine_fix_render_state_value(i * 32 + r, src->rs_advertised[i * 32 + r]); 20066bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy } 20076bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy } 20086bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy 20096bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy /* Textures */ 20106bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy if (src->changed.texture) { 20116bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy uint32_t m = src->changed.texture; 20126bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy unsigned s; 20136bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy 20146bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy for (s = 0; m; ++s, m >>= 1) { 20156bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy struct NineBaseTexture9 *tex = src->texture[s]; 20166bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy if (!(m & 1)) 20176bbb7b9fc5bc978ac3236064a1de50376177c735Axel Davy continue; 20187ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy nine_context_set_texture(device, s, tex); 201964e232bd60336591e55e6c95112bac334cb38970Axel Davy } 202064e232bd60336591e55e6c95112bac334cb38970Axel Davy } 2021848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy 202293ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy /* Sampler state */ 202393ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy if (src->changed.group & NINE_STATE_SAMPLER) { 202493ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy unsigned s; 202593ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy 202693ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy for (s = 0; s < NINE_MAX_SAMPLERS; ++s) { 202793ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy uint32_t m = src->changed.sampler[s]; 202893ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy while (m) { 202993ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy const int i = ffs(m) - 1; 203093ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy m &= ~(1 << i); 203193ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy if (nine_check_sampler_state_value(i, src->samp_advertised[s][i])) 203293ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy context->samp[s][i] = src->samp_advertised[s][i]; 203393ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy } 203493ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy context->changed.sampler[s] |= src->changed.sampler[s]; 203593ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy } 203693ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy } 203793ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy 2038848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy /* Vertex buffers */ 2039848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy if (src->changed.vtxbuf | src->changed.stream_freq) { 2040848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy uint32_t m = src->changed.vtxbuf | src->changed.stream_freq; 2041848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy for (i = 0; m; ++i, m >>= 1) { 2042848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy if (src->changed.vtxbuf & (1 << i)) { 2043848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy if (src->stream[i]) { 20448960be0e939bc6c0f9f34c5d4a16891af7e325fdAxel Davy unsigned offset = 0; 2045848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy pipe_resource_reference(&context->vtxbuf[i].buffer, 20468960be0e939bc6c0f9f34c5d4a16891af7e325fdAxel Davy src->stream[i] ? NineVertexBuffer9_GetResource(src->stream[i], &offset) : NULL); 20478960be0e939bc6c0f9f34c5d4a16891af7e325fdAxel Davy context->vtxbuf[i].buffer_offset = src->vtxbuf[i].buffer_offset + offset; 2048848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy context->vtxbuf[i].stride = src->vtxbuf[i].stride; 2049848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy } 2050848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy } 205163633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy if (src->changed.stream_freq & (1 << i)) { 205263633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy context->stream_freq[i] = src->stream_freq[i]; 205363633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy if (src->stream_freq[i] & D3DSTREAMSOURCE_INSTANCEDATA) 205463633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy context->stream_instancedata_mask |= 1 << i; 205563633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy else 205663633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy context->stream_instancedata_mask &= ~(1 << i); 205763633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy } 2058848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy } 2059848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy context->changed.vtxbuf |= src->changed.vtxbuf; 2060848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy } 206143288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy 2062aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy /* Index buffer */ 2063aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy if (src->changed.group & NINE_STATE_IDXBUF) 2064aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy nine_context_set_indices(device, src->idxbuf); 2065aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy 206643288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy /* Vertex declaration */ 206743288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy if ((src->changed.group & NINE_STATE_VDECL) && src->vdecl) 206843288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy nine_context_set_vertex_declaration(device, src->vdecl); 206943288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy 20702a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy /* Vertex shader */ 20712a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy if (src->changed.group & NINE_STATE_VS) 20722a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy nine_bind(&context->vs, src->vs); 20732a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy 20742a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy context->programmable_vs = context->vs && !(context->vdecl && context->vdecl->position_t); 2075b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 2076c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy /* Pixel shader */ 2077c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy if (src->changed.group & NINE_STATE_PS) 2078c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy nine_bind(&context->ps, src->ps); 2079c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy 2080b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy /* Vertex constants */ 2081b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (src->changed.group & NINE_STATE_VS_CONST) { 2082b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy struct nine_range *r; 2083b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (device->may_swvp) { 2084b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy for (r = src->changed.vs_const_f; r; r = r->next) { 2085b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy int bgn = r->bgn; 2086b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy int end = r->end; 2087b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(&context->vs_const_f_swvp[bgn * 4], 2088b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy &src->vs_const_f[bgn * 4], 2089b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy (end - bgn) * 4 * sizeof(float)); 2090b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (bgn < device->max_vs_const_f) { 2091b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy end = MIN2(end, device->max_vs_const_f); 2092b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(&context->vs_const_f[bgn * 4], 2093b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy &src->vs_const_f[bgn * 4], 2094b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy (end - bgn) * 4 * sizeof(float)); 2095b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 2096b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 2097b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } else { 2098b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy for (r = src->changed.vs_const_f; r; r = r->next) { 2099b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(&context->vs_const_f[r->bgn * 4], 2100b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy &src->vs_const_f[r->bgn * 4], 2101b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy (r->end - r->bgn) * 4 * sizeof(float)); 2102b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 2103b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 2104b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy for (r = src->changed.vs_const_i; r; r = r->next) { 2105b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(&context->vs_const_i[r->bgn * 4], 2106b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy &src->vs_const_i[r->bgn * 4], 2107b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy (r->end - r->bgn) * 4 * sizeof(int)); 2108b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 2109b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy for (r = src->changed.vs_const_b; r; r = r->next) { 2110b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(&context->vs_const_b[r->bgn], 2111b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy &src->vs_const_b[r->bgn], 2112b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy (r->end - r->bgn) * sizeof(int)); 2113b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 2114b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.vs_const_f = !!src->changed.vs_const_f; 2115b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.vs_const_i = !!src->changed.vs_const_i; 2116b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.vs_const_b = !!src->changed.vs_const_b; 2117b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 2118b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy 2119b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy /* Pixel constants */ 2120b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (src->changed.group & NINE_STATE_PS_CONST) { 2121b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy struct nine_range *r; 2122b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy for (r = src->changed.ps_const_f; r; r = r->next) { 2123b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(&context->ps_const_f[r->bgn * 4], 2124b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy &src->ps_const_f[r->bgn * 4], 2125b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy (r->end - r->bgn) * 4 * sizeof(float)); 2126b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 2127b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (src->changed.ps_const_i) { 2128b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy uint16_t m = src->changed.ps_const_i; 2129b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy for (i = ffs(m) - 1, m >>= i; m; ++i, m >>= 1) 2130b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (m & 1) 2131b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memcpy(context->ps_const_i[i], src->ps_const_i[i], 4 * sizeof(int)); 2132b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 2133b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (src->changed.ps_const_b) { 2134b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy uint16_t m = src->changed.ps_const_b; 2135b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy for (i = ffs(m) - 1, m >>= i; m; ++i, m >>= 1) 2136b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (m & 1) 2137b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->ps_const_b[i] = src->ps_const_b[i]; 2138b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 2139b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.ps_const_f = !!src->changed.ps_const_f; 2140b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.ps_const_i = !!src->changed.ps_const_i; 2141b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy context->changed.ps_const_b = !!src->changed.ps_const_b; 2142b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy } 21439498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy 21444a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy /* Viewport */ 21454a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy if (src->changed.group & NINE_STATE_VIEWPORT) 21464a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy context->viewport = src->viewport; 21474a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy 21489498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy /* Scissor */ 21499498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy if (src->changed.group & NINE_STATE_SCISSOR) 21509498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy context->scissor = src->scissor; 21511a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 2152a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy /* User Clip Planes */ 2153a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy if (src->changed.ucp) { 2154a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy for (i = 0; i < PIPE_MAX_CLIP_PLANES; ++i) 2155a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy if (src->changed.ucp & (1 << i)) 2156a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy memcpy(context->clip.ucp[i], 2157a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy src->clip.ucp[i], sizeof(src->clip.ucp[0])); 2158a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy context->changed.ucp = TRUE; 2159a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy } 2160a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy 21611a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy if (!(src->changed.group & NINE_STATE_FF)) 21621a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy return; 21631a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 21641a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy /* Fixed function state. */ 21651a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 21661a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy if (src->changed.group & NINE_STATE_FF_MATERIAL) 21671a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.material = src->ff.material; 21681a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 21691a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy if (src->changed.group & NINE_STATE_FF_PSSTAGES) { 21701a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy unsigned s; 21711a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy for (s = 0; s < NINE_MAX_TEXTURE_STAGES; ++s) { 21721a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy for (i = 0; i < NINED3DTSS_COUNT; ++i) 21731a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy if (src->ff.changed.tex_stage[s][i / 32] & (1 << (i % 32))) 21741a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.tex_stage[s][i] = src->ff.tex_stage[s][i]; 21751a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy } 21761a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy } 21771a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy if (src->changed.group & NINE_STATE_FF_LIGHTING) { 21781a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy unsigned num_lights = MAX2(context->ff.num_lights, src->ff.num_lights); 21791a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy /* Can happen if the stateblock had recorded the creation of 21801a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy * new lights. */ 21811a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy if (context->ff.num_lights < num_lights) { 21821a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.light = REALLOC(context->ff.light, 21831a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.num_lights * sizeof(D3DLIGHT9), 21841a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy num_lights * sizeof(D3DLIGHT9)); 21851a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy memset(&context->ff.light[context->ff.num_lights], 0, (num_lights - context->ff.num_lights) * sizeof(D3DLIGHT9)); 21861a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy for (i = context->ff.num_lights; i < num_lights; ++i) 21871a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.light[i].Type = (D3DLIGHTTYPE)NINED3DLIGHT_INVALID; 21881a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.num_lights = num_lights; 21891a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy } 21901a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy /* src->ff.num_lights < num_lights has been handled before */ 21911a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy assert (src->ff.num_lights == num_lights); 21921a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 21931a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy for (i = 0; i < num_lights; ++i) 21941a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy if (src->ff.light[i].Type != NINED3DLIGHT_INVALID) 21951a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.light[i] = src->ff.light[i]; 21961a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 21971a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy memcpy(context->ff.active_light, src->ff.active_light, sizeof(src->ff.active_light) ); 21981a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.num_lights_active = src->ff.num_lights_active; 21991a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy } 22001a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy if (src->changed.group & NINE_STATE_FF_VSTRANSF) { 22011a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy for (i = 0; i < ARRAY_SIZE(src->ff.changed.transform); ++i) { 22021a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy unsigned s; 22031a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy if (!src->ff.changed.transform[i]) 22041a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy continue; 22051a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy for (s = i * 32; s < (i * 32 + 32); ++s) { 22061a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy if (!(src->ff.changed.transform[i] & (1 << (s % 32)))) 22071a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy continue; 22081a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy *nine_state_access_transform(&context->ff, s, TRUE) = 22091a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy *nine_state_access_transform( /* const because !alloc */ 22101a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy (struct nine_ff_state *)&src->ff, s, FALSE); 22111a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy } 22121a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.changed.transform[i] |= src->ff.changed.transform[i]; 22131a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy } 22141a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy } 2215fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 2216fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 221797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy#endif 221897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 221997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy/* Do not write to nine_context directly. Slower, 222097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy * but works with csmt. TODO: write a special csmt version that 222197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy * would record the list of commands as much as possible, 222297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy * and use the version above else. 222397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy */ 222497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davyvoid 222597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davynine_context_apply_stateblock(struct NineDevice9 *device, 222697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy const struct nine_state *src) 222797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy{ 222897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy int i; 222997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 223097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* No need to apply src->changed.group, since all calls do 223197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy * set context->changed.group */ 223297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 223397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (i = 0; i < ARRAY_SIZE(src->changed.rs); ++i) { 223497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy uint32_t m = src->changed.rs[i]; 223597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy while (m) { 223697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy const int r = ffs(m) - 1; 223797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy m &= ~(1 << r); 223897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_render_state(device, i * 32 + r, src->rs_advertised[i * 32 + r]); 223997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 224097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 224197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 224297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* Textures */ 224397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.texture) { 224497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy uint32_t m = src->changed.texture; 224597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy unsigned s; 224697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 224797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (s = 0; m; ++s, m >>= 1) { 224897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy struct NineBaseTexture9 *tex = src->texture[s]; 224997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (!(m & 1)) 225097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy continue; 225197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_texture(device, s, tex); 225297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 225397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 225497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 225597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* Sampler state */ 225697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.group & NINE_STATE_SAMPLER) { 225797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy unsigned s; 225897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 225997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (s = 0; s < NINE_MAX_SAMPLERS; ++s) { 226097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy uint32_t m = src->changed.sampler[s]; 226197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy while (m) { 226297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy const int i = ffs(m) - 1; 226397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy m &= ~(1 << i); 226497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_sampler_state(device, s, i, src->samp_advertised[s][i]); 226597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 226697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 226797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 226897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 226997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* Vertex buffers */ 227097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.vtxbuf | src->changed.stream_freq) { 227197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy uint32_t m = src->changed.vtxbuf | src->changed.stream_freq; 227297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (i = 0; m; ++i, m >>= 1) { 227397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.vtxbuf & (1 << i)) 227497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_stream_source(device, i, src->stream[i], src->vtxbuf[i].buffer_offset, src->vtxbuf[i].stride); 227597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.stream_freq & (1 << i)) 227697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_stream_source_freq(device, i, src->stream_freq[i]); 227797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 227897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 227997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 228097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* Index buffer */ 228197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.group & NINE_STATE_IDXBUF) 228297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_indices(device, src->idxbuf); 228397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 228497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* Vertex declaration */ 228597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if ((src->changed.group & NINE_STATE_VDECL) && src->vdecl) 228697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_vertex_declaration(device, src->vdecl); 228797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 228897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* Vertex shader */ 228997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.group & NINE_STATE_VS) 229097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_vertex_shader(device, src->vs); 229197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 229297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* Pixel shader */ 229397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.group & NINE_STATE_PS) 229497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_pixel_shader(device, src->ps); 229597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 229697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* Vertex constants */ 229797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.group & NINE_STATE_VS_CONST) { 229897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy struct nine_range *r; 229997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (r = src->changed.vs_const_f; r; r = r->next) 230097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_vertex_shader_constant_f(device, r->bgn, 230197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy &src->vs_const_f[r->bgn * 4], 2302ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph sizeof(float[4]) * (r->end - r->bgn), 230397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy r->end - r->bgn); 230497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (r = src->changed.vs_const_i; r; r = r->next) 230597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_vertex_shader_constant_i(device, r->bgn, 230697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy &src->vs_const_i[r->bgn * 4], 2307ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph sizeof(int[4]) * (r->end - r->bgn), 230897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy r->end - r->bgn); 230997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (r = src->changed.vs_const_b; r; r = r->next) 231097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_vertex_shader_constant_b(device, r->bgn, 231197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy &src->vs_const_b[r->bgn * 4], 2312ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph sizeof(BOOL) * (r->end - r->bgn), 231397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy r->end - r->bgn); 231497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 231597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 231697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* Pixel constants */ 231797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.group & NINE_STATE_PS_CONST) { 231897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy struct nine_range *r; 231997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (r = src->changed.ps_const_f; r; r = r->next) 232097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_pixel_shader_constant_f(device, r->bgn, 232197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy &src->ps_const_f[r->bgn * 4], 2322ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph sizeof(float[4]) * (r->end - r->bgn), 232397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy r->end - r->bgn); 232497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.ps_const_i) { 232597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy uint16_t m = src->changed.ps_const_i; 232697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (i = ffs(m) - 1, m >>= i; m; ++i, m >>= 1) 232797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (m & 1) 232897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_pixel_shader_constant_i_transformed(device, i, 2329ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph src->ps_const_i[i], sizeof(int[4]), 1); 233097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 233197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.ps_const_b) { 233297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy uint16_t m = src->changed.ps_const_b; 233397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (i = ffs(m) - 1, m >>= i; m; ++i, m >>= 1) 233497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (m & 1) 233597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_pixel_shader_constant_b(device, i, 2336ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph &src->ps_const_b[i], sizeof(BOOL), 1); 233797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 233897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 233997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 234097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* Viewport */ 234197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.group & NINE_STATE_VIEWPORT) 234297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_viewport(device, &src->viewport); 234397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 234497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* Scissor */ 234597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.group & NINE_STATE_SCISSOR) 234697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_scissor(device, &src->scissor); 234797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 234897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* User Clip Planes */ 234997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.ucp) 235097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (i = 0; i < PIPE_MAX_CLIP_PLANES; ++i) 235197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.ucp & (1 << i)) 23521277ceefd1e8c0c495b75de55cfe661a478d1aaePatrick Rudolph nine_context_set_clip_plane(device, i, (struct nine_clipplane*)&src->clip.ucp[i][0]); 235397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 235497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (!(src->changed.group & NINE_STATE_FF)) 235597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy return; 235697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 235797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy /* Fixed function state. */ 235897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 235997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.group & NINE_STATE_FF_MATERIAL) 236097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_material(device, &src->ff.material); 236197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 236297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.group & NINE_STATE_FF_PSSTAGES) { 236397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy unsigned s; 236497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (s = 0; s < NINE_MAX_TEXTURE_STAGES; ++s) { 236597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (i = 0; i < NINED3DTSS_COUNT; ++i) 236697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->ff.changed.tex_stage[s][i / 32] & (1 << (i % 32))) 236797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_texture_stage_state(device, s, i, src->ff.tex_stage[s][i]); 236897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 236997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 237097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.group & NINE_STATE_FF_LIGHTING) { 237197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (i = 0; i < src->ff.num_lights; ++i) 237297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->ff.light[i].Type != NINED3DLIGHT_INVALID) 237397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_light(device, i, &src->ff.light[i]); 237497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 237597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_light_enable_stateblock(device, src->ff.active_light, src->ff.num_lights_active); 237697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 237797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (src->changed.group & NINE_STATE_FF_VSTRANSF) { 237897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (i = 0; i < ARRAY_SIZE(src->ff.changed.transform); ++i) { 237997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy unsigned s; 238097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (!src->ff.changed.transform[i]) 238197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy continue; 238297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy for (s = i * 32; s < (i * 32 + 32); ++s) { 238397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy if (!(src->ff.changed.transform[i] & (1 << (s % 32)))) 238497e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy continue; 238597e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_context_set_transform(device, s, 238697e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy nine_state_access_transform( 238797e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy (struct nine_ff_state *)&src->ff, 238897e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy s, FALSE)); 238997e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 239097e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 239197e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy } 239297e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy} 239397e4b65e7f7b675ca0d25b6dfe8cf299af2b7a3fAxel Davy 2394f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davystatic void 2395f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davynine_update_state_framebuffer_clear(struct NineDevice9 *device) 2396f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy{ 2397b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy struct nine_context *context = &device->context; 2398f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2399b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy if (context->changed.group & NINE_STATE_FB) 2400f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy update_framebuffer(device, TRUE); 2401f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy} 2402f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2403ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_clear_fb, 2404ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, Count), 2405ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_COPY_REF(D3DRECT, pRects), 2406ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, Flags), 2407ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(D3DCOLOR, Color), 2408ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(float, Z), 2409ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(DWORD, Stencil)) 2410f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy{ 24117f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy struct nine_context *context = &device->context; 24127f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy const int sRGB = context->rs[D3DRS_SRGBWRITEENABLE] ? 1 : 0; 2413f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy struct pipe_surface *cbuf, *zsbuf; 2414b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct pipe_context *pipe = context->pipe; 2415d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy struct NineSurface9 *zsbuf_surf = context->ds; 2416f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy struct NineSurface9 *rt; 2417f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy unsigned bufs = 0; 2418f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy unsigned r, i; 2419f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy union pipe_color_union rgba; 2420f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy unsigned rt_mask = 0; 2421f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy D3DRECT rect; 2422f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2423f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy nine_update_state_framebuffer_clear(device); 2424f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2425f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (Flags & D3DCLEAR_TARGET) bufs |= PIPE_CLEAR_COLOR; 2426f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy /* Ignore Z buffer if not bound */ 242766ad5b1592bb050269216bc64aa7916056cca466Axel Davy if (context->pipe_data.fb.zsbuf != NULL) { 2428f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (Flags & D3DCLEAR_ZBUFFER) bufs |= PIPE_CLEAR_DEPTH; 2429f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (Flags & D3DCLEAR_STENCIL) bufs |= PIPE_CLEAR_STENCIL; 2430f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy } 2431f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (!bufs) 2432f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy return; 2433f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy d3dcolor_to_pipe_color_union(&rgba, Color); 2434f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 24354a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy rect.x1 = context->viewport.X; 24364a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy rect.y1 = context->viewport.Y; 24374a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy rect.x2 = context->viewport.Width + rect.x1; 24384a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy rect.y2 = context->viewport.Height + rect.y1; 2439f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2440f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy /* Both rectangles apply, which is weird, but that's D3D9. */ 24417f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy if (context->rs[D3DRS_SCISSORTESTENABLE]) { 24429498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy rect.x1 = MAX2(rect.x1, context->scissor.minx); 24439498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy rect.y1 = MAX2(rect.y1, context->scissor.miny); 24449498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy rect.x2 = MIN2(rect.x2, context->scissor.maxx); 24459498613607aa9bf42a36db0462f5e38b1d1f4c60Axel Davy rect.y2 = MIN2(rect.y2, context->scissor.maxy); 2446f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy } 2447f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2448f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (Count) { 2449f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy /* Maybe apps like to specify a large rect ? */ 2450f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (pRects[0].x1 <= rect.x1 && pRects[0].x2 >= rect.x2 && 2451f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy pRects[0].y1 <= rect.y1 && pRects[0].y2 >= rect.y2) { 2452f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy DBG("First rect covers viewport.\n"); 2453f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy Count = 0; 2454f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy pRects = NULL; 2455f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy } 2456f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy } 2457f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 245866ad5b1592bb050269216bc64aa7916056cca466Axel Davy if (rect.x1 >= context->pipe_data.fb.width || rect.y1 >= context->pipe_data.fb.height) 2459f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy return; 2460f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2461f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy for (i = 0; i < device->caps.NumSimultaneousRTs; ++i) { 24627f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy if (context->rt[i] && context->rt[i]->desc.Format != D3DFMT_NULL) 2463f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy rt_mask |= 1 << i; 2464f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy } 2465f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2466f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy /* fast path, clears everything at once */ 2467f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (!Count && 24687f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy (!(bufs & PIPE_CLEAR_COLOR) || (rt_mask == context->rt_mask)) && 2469f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy rect.x1 == 0 && rect.y1 == 0 && 2470f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy /* Case we clear only render target. Check clear region vs rt. */ 2471f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy ((!(bufs & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) && 247266ad5b1592bb050269216bc64aa7916056cca466Axel Davy rect.x2 >= context->pipe_data.fb.width && 247366ad5b1592bb050269216bc64aa7916056cca466Axel Davy rect.y2 >= context->pipe_data.fb.height) || 2474f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy /* Case we clear depth buffer (and eventually rt too). 2475f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy * depth buffer size is always >= rt size. Compare to clear region */ 2476f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy ((bufs & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) && 2477f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy rect.x2 >= zsbuf_surf->desc.Width && 2478f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy rect.y2 >= zsbuf_surf->desc.Height))) { 2479f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy DBG("Clear fast path\n"); 2480f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy pipe->clear(pipe, bufs, &rgba, Z, Stencil); 2481f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy return; 2482f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy } 2483f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2484f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (!Count) { 2485f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy Count = 1; 2486f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy pRects = ▭ 2487f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy } 2488f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2489f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy for (i = 0; i < device->caps.NumSimultaneousRTs; ++i) { 24907f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy rt = context->rt[i]; 2491f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (!rt || rt->desc.Format == D3DFMT_NULL || 2492f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy !(bufs & PIPE_CLEAR_COLOR)) 2493f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy continue; /* save space, compiler should hoist this */ 2494f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy cbuf = NineSurface9_GetSurface(rt, sRGB); 2495f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy for (r = 0; r < Count; ++r) { 2496f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy /* Don't trust users to pass these in the right order. */ 2497f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy unsigned x1 = MIN2(pRects[r].x1, pRects[r].x2); 2498f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy unsigned y1 = MIN2(pRects[r].y1, pRects[r].y2); 2499f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy unsigned x2 = MAX2(pRects[r].x1, pRects[r].x2); 2500f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy unsigned y2 = MAX2(pRects[r].y1, pRects[r].y2); 2501f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy#ifndef NINE_LAX 2502f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy /* Drop negative rectangles (like wine expects). */ 2503f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (pRects[r].x1 > pRects[r].x2) continue; 2504f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (pRects[r].y1 > pRects[r].y2) continue; 2505f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy#endif 2506f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2507f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy x1 = MAX2(x1, rect.x1); 2508f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy y1 = MAX2(y1, rect.y1); 2509f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy x2 = MIN3(x2, rect.x2, rt->desc.Width); 2510f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy y2 = MIN3(y2, rect.y2, rt->desc.Height); 2511f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2512f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy DBG("Clearing (%u..%u)x(%u..%u)\n", x1, x2, y1, y2); 2513f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy pipe->clear_render_target(pipe, cbuf, &rgba, 2514f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy x1, y1, x2 - x1, y2 - y1, false); 2515f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy } 2516f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy } 2517f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (!(bufs & PIPE_CLEAR_DEPTHSTENCIL)) 2518f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy return; 2519f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2520f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy bufs &= PIPE_CLEAR_DEPTHSTENCIL; 2521f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2522f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy for (r = 0; r < Count; ++r) { 2523f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy unsigned x1 = MIN2(pRects[r].x1, pRects[r].x2); 2524f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy unsigned y1 = MIN2(pRects[r].y1, pRects[r].y2); 2525f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy unsigned x2 = MAX2(pRects[r].x1, pRects[r].x2); 2526f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy unsigned y2 = MAX2(pRects[r].y1, pRects[r].y2); 2527f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy#ifndef NINE_LAX 2528f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy /* Drop negative rectangles. */ 2529f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (pRects[r].x1 > pRects[r].x2) continue; 2530f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy if (pRects[r].y1 > pRects[r].y2) continue; 2531f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy#endif 2532f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2533f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy x1 = MIN2(x1, rect.x1); 2534f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy y1 = MIN2(y1, rect.y1); 2535f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy x2 = MIN3(x2, rect.x2, zsbuf_surf->desc.Width); 2536f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy y2 = MIN3(y2, rect.y2, zsbuf_surf->desc.Height); 2537f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 2538f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy zsbuf = NineSurface9_GetSurface(zsbuf_surf, 0); 2539f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy assert(zsbuf); 2540f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy pipe->clear_depth_stencil(pipe, zsbuf, bufs, Z, Stencil, 2541f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy x1, y1, x2 - x1, y2 - y1, false); 2542f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy } 2543f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy return; 2544f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy} 2545f72d8719ebecce0937087a56eec24a51bea9e27aAxel Davy 254664e232bd60336591e55e6c95112bac334cb38970Axel Davy 254764e232bd60336591e55e6c95112bac334cb38970Axel Davystatic inline void 254864e232bd60336591e55e6c95112bac334cb38970Axel Davyinit_draw_info(struct pipe_draw_info *info, 254964e232bd60336591e55e6c95112bac334cb38970Axel Davy struct NineDevice9 *dev, D3DPRIMITIVETYPE type, UINT count) 255064e232bd60336591e55e6c95112bac334cb38970Axel Davy{ 255164e232bd60336591e55e6c95112bac334cb38970Axel Davy info->mode = d3dprimitivetype_to_pipe_prim(type); 255264e232bd60336591e55e6c95112bac334cb38970Axel Davy info->count = prim_count_to_vertex_count(type, count); 255364e232bd60336591e55e6c95112bac334cb38970Axel Davy info->start_instance = 0; 255464e232bd60336591e55e6c95112bac334cb38970Axel Davy info->instance_count = 1; 255563633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy if (dev->context.stream_instancedata_mask & dev->context.stream_usage_mask) 255663633e2a08b227025f1e479fe26244e6bf37d7e7Axel Davy info->instance_count = MAX2(dev->context.stream_freq[0] & 0x7FFFFF, 1); 255764e232bd60336591e55e6c95112bac334cb38970Axel Davy info->primitive_restart = FALSE; 255864e232bd60336591e55e6c95112bac334cb38970Axel Davy info->restart_index = 0; 255964e232bd60336591e55e6c95112bac334cb38970Axel Davy info->count_from_stream_output = NULL; 256064e232bd60336591e55e6c95112bac334cb38970Axel Davy info->indirect = NULL; 256164e232bd60336591e55e6c95112bac334cb38970Axel Davy info->indirect_params = NULL; 256264e232bd60336591e55e6c95112bac334cb38970Axel Davy} 256364e232bd60336591e55e6c95112bac334cb38970Axel Davy 2564ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_draw_primitive, 2565ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(D3DPRIMITIVETYPE, PrimitiveType), 2566ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, StartVertex), 2567ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, PrimitiveCount)) 256864e232bd60336591e55e6c95112bac334cb38970Axel Davy{ 2569b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 257064e232bd60336591e55e6c95112bac334cb38970Axel Davy struct pipe_draw_info info; 257164e232bd60336591e55e6c95112bac334cb38970Axel Davy 257264e232bd60336591e55e6c95112bac334cb38970Axel Davy nine_update_state(device); 257364e232bd60336591e55e6c95112bac334cb38970Axel Davy 257464e232bd60336591e55e6c95112bac334cb38970Axel Davy init_draw_info(&info, device, PrimitiveType, PrimitiveCount); 257564e232bd60336591e55e6c95112bac334cb38970Axel Davy info.indexed = FALSE; 257664e232bd60336591e55e6c95112bac334cb38970Axel Davy info.start = StartVertex; 257764e232bd60336591e55e6c95112bac334cb38970Axel Davy info.index_bias = 0; 257864e232bd60336591e55e6c95112bac334cb38970Axel Davy info.min_index = info.start; 257964e232bd60336591e55e6c95112bac334cb38970Axel Davy info.max_index = info.count - 1; 258064e232bd60336591e55e6c95112bac334cb38970Axel Davy 2581b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy context->pipe->draw_vbo(context->pipe, &info); 258264e232bd60336591e55e6c95112bac334cb38970Axel Davy} 258364e232bd60336591e55e6c95112bac334cb38970Axel Davy 2584ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive, 2585ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(D3DPRIMITIVETYPE, PrimitiveType), 2586ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(INT, BaseVertexIndex), 2587ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, MinVertexIndex), 2588ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, NumVertices), 2589ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, StartIndex), 2590ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, PrimitiveCount)) 259164e232bd60336591e55e6c95112bac334cb38970Axel Davy{ 2592b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 259364e232bd60336591e55e6c95112bac334cb38970Axel Davy struct pipe_draw_info info; 259464e232bd60336591e55e6c95112bac334cb38970Axel Davy 259564e232bd60336591e55e6c95112bac334cb38970Axel Davy nine_update_state(device); 259664e232bd60336591e55e6c95112bac334cb38970Axel Davy 259764e232bd60336591e55e6c95112bac334cb38970Axel Davy init_draw_info(&info, device, PrimitiveType, PrimitiveCount); 259864e232bd60336591e55e6c95112bac334cb38970Axel Davy info.indexed = TRUE; 259964e232bd60336591e55e6c95112bac334cb38970Axel Davy info.start = StartIndex; 260064e232bd60336591e55e6c95112bac334cb38970Axel Davy info.index_bias = BaseVertexIndex; 260164e232bd60336591e55e6c95112bac334cb38970Axel Davy /* These don't include index bias: */ 260264e232bd60336591e55e6c95112bac334cb38970Axel Davy info.min_index = MinVertexIndex; 260364e232bd60336591e55e6c95112bac334cb38970Axel Davy info.max_index = MinVertexIndex + NumVertices - 1; 260464e232bd60336591e55e6c95112bac334cb38970Axel Davy 2605b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy context->pipe->draw_vbo(context->pipe, &info); 260664e232bd60336591e55e6c95112bac334cb38970Axel Davy} 260764e232bd60336591e55e6c95112bac334cb38970Axel Davy 2608ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_draw_primitive_from_vtxbuf, 2609ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(D3DPRIMITIVETYPE, PrimitiveType), 2610ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, PrimitiveCount), 2611ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_BIND_BUF(struct pipe_vertex_buffer, vtxbuf)) 261264e232bd60336591e55e6c95112bac334cb38970Axel Davy{ 2613b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 261464e232bd60336591e55e6c95112bac334cb38970Axel Davy struct pipe_draw_info info; 261564e232bd60336591e55e6c95112bac334cb38970Axel Davy 261664e232bd60336591e55e6c95112bac334cb38970Axel Davy nine_update_state(device); 261764e232bd60336591e55e6c95112bac334cb38970Axel Davy 261864e232bd60336591e55e6c95112bac334cb38970Axel Davy init_draw_info(&info, device, PrimitiveType, PrimitiveCount); 261964e232bd60336591e55e6c95112bac334cb38970Axel Davy info.indexed = FALSE; 262064e232bd60336591e55e6c95112bac334cb38970Axel Davy info.start = 0; 262164e232bd60336591e55e6c95112bac334cb38970Axel Davy info.index_bias = 0; 262264e232bd60336591e55e6c95112bac334cb38970Axel Davy info.min_index = 0; 262364e232bd60336591e55e6c95112bac334cb38970Axel Davy info.max_index = info.count - 1; 262464e232bd60336591e55e6c95112bac334cb38970Axel Davy 2625b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy context->pipe->set_vertex_buffers(context->pipe, 0, 1, vtxbuf); 262664e232bd60336591e55e6c95112bac334cb38970Axel Davy 2627b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy context->pipe->draw_vbo(context->pipe, &info); 262864e232bd60336591e55e6c95112bac334cb38970Axel Davy} 262964e232bd60336591e55e6c95112bac334cb38970Axel Davy 2630ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf, 2631ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(D3DPRIMITIVETYPE, PrimitiveType), 2632ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, MinVertexIndex), 2633ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, NumVertices), 2634ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_VAL(UINT, PrimitiveCount), 2635ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_BIND_BUF(struct pipe_vertex_buffer, vbuf), 2636ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_BIND_BUF(struct pipe_index_buffer, ibuf)) 263764e232bd60336591e55e6c95112bac334cb38970Axel Davy{ 2638b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 263964e232bd60336591e55e6c95112bac334cb38970Axel Davy struct pipe_draw_info info; 264064e232bd60336591e55e6c95112bac334cb38970Axel Davy 264164e232bd60336591e55e6c95112bac334cb38970Axel Davy nine_update_state(device); 264264e232bd60336591e55e6c95112bac334cb38970Axel Davy 264364e232bd60336591e55e6c95112bac334cb38970Axel Davy init_draw_info(&info, device, PrimitiveType, PrimitiveCount); 264464e232bd60336591e55e6c95112bac334cb38970Axel Davy info.indexed = TRUE; 264564e232bd60336591e55e6c95112bac334cb38970Axel Davy info.start = 0; 264664e232bd60336591e55e6c95112bac334cb38970Axel Davy info.index_bias = 0; 264764e232bd60336591e55e6c95112bac334cb38970Axel Davy info.min_index = MinVertexIndex; 264864e232bd60336591e55e6c95112bac334cb38970Axel Davy info.max_index = MinVertexIndex + NumVertices - 1; 2649b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy context->pipe->set_vertex_buffers(context->pipe, 0, 1, vbuf); 2650b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy context->pipe->set_index_buffer(context->pipe, ibuf); 265164e232bd60336591e55e6c95112bac334cb38970Axel Davy 2652b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy context->pipe->draw_vbo(context->pipe, &info); 265364e232bd60336591e55e6c95112bac334cb38970Axel Davy} 265464e232bd60336591e55e6c95112bac334cb38970Axel Davy 2655fef23f6712064416f02211f1517e387169735e0bPatrick RudolphCSMT_ITEM_NO_WAIT(nine_context_resource_copy_region, 2656525a1b292a3d65857db06832e175fba840b75ff8Axel Davy ARG_BIND_REF(struct NineUnknown, dst), 2657525a1b292a3d65857db06832e175fba840b75ff8Axel Davy ARG_BIND_REF(struct NineUnknown, src), 2658fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph ARG_BIND_RES(struct pipe_resource, dst_res), 2659fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph ARG_VAL(unsigned, dst_level), 2660fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph ARG_COPY_REF(struct pipe_box, dst_box), 2661fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph ARG_BIND_RES(struct pipe_resource, src_res), 2662fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph ARG_VAL(unsigned, src_level), 2663fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph ARG_COPY_REF(struct pipe_box, src_box)) 2664fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph{ 2665fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph struct nine_context *context = &device->context; 2666fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph 2667525a1b292a3d65857db06832e175fba840b75ff8Axel Davy (void) dst; 2668525a1b292a3d65857db06832e175fba840b75ff8Axel Davy (void) src; 2669525a1b292a3d65857db06832e175fba840b75ff8Axel Davy 2670fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph context->pipe->resource_copy_region(context->pipe, 2671fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph dst_res, dst_level, 2672fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph dst_box->x, dst_box->y, dst_box->z, 2673fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph src_res, src_level, 2674fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph src_box); 2675fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph} 2676fef23f6712064416f02211f1517e387169735e0bPatrick Rudolph 2677c8913a06b454bd0aca813d2ea362e7d06840216fPatrick RudolphCSMT_ITEM_NO_WAIT(nine_context_blit, 2678525a1b292a3d65857db06832e175fba840b75ff8Axel Davy ARG_BIND_REF(struct NineUnknown, dst), 2679525a1b292a3d65857db06832e175fba840b75ff8Axel Davy ARG_BIND_REF(struct NineUnknown, src), 2680c8913a06b454bd0aca813d2ea362e7d06840216fPatrick Rudolph ARG_BIND_BLIT(struct pipe_blit_info, blit)) 2681c8913a06b454bd0aca813d2ea362e7d06840216fPatrick Rudolph{ 2682c8913a06b454bd0aca813d2ea362e7d06840216fPatrick Rudolph struct nine_context *context = &device->context; 2683c8913a06b454bd0aca813d2ea362e7d06840216fPatrick Rudolph 2684525a1b292a3d65857db06832e175fba840b75ff8Axel Davy (void) dst; 2685525a1b292a3d65857db06832e175fba840b75ff8Axel Davy (void) src; 2686525a1b292a3d65857db06832e175fba840b75ff8Axel Davy 2687c8913a06b454bd0aca813d2ea362e7d06840216fPatrick Rudolph context->pipe->blit(context->pipe, blit); 2688c8913a06b454bd0aca813d2ea362e7d06840216fPatrick Rudolph} 2689c8913a06b454bd0aca813d2ea362e7d06840216fPatrick Rudolph 2690884166a251ec45f2bfac0139f18b162d31db241eAxel DavyCSMT_ITEM_NO_WAIT(nine_context_clear_render_target, 2691884166a251ec45f2bfac0139f18b162d31db241eAxel Davy ARG_BIND_REF(struct NineSurface9, surface), 2692884166a251ec45f2bfac0139f18b162d31db241eAxel Davy ARG_VAL(D3DCOLOR, color), 2693884166a251ec45f2bfac0139f18b162d31db241eAxel Davy ARG_VAL(UINT, x), 2694884166a251ec45f2bfac0139f18b162d31db241eAxel Davy ARG_VAL(UINT, y), 2695884166a251ec45f2bfac0139f18b162d31db241eAxel Davy ARG_VAL(UINT, width), 2696884166a251ec45f2bfac0139f18b162d31db241eAxel Davy ARG_VAL(UINT, height)) 2697884166a251ec45f2bfac0139f18b162d31db241eAxel Davy{ 2698884166a251ec45f2bfac0139f18b162d31db241eAxel Davy struct nine_context *context = &device->context; 2699884166a251ec45f2bfac0139f18b162d31db241eAxel Davy struct pipe_surface *surf; 2700884166a251ec45f2bfac0139f18b162d31db241eAxel Davy union pipe_color_union rgba; 2701884166a251ec45f2bfac0139f18b162d31db241eAxel Davy 2702884166a251ec45f2bfac0139f18b162d31db241eAxel Davy d3dcolor_to_pipe_color_union(&rgba, color); 2703884166a251ec45f2bfac0139f18b162d31db241eAxel Davy surf = NineSurface9_GetSurface(surface, 0); 2704884166a251ec45f2bfac0139f18b162d31db241eAxel Davy context->pipe->clear_render_target(context->pipe, surf, &rgba, x, y, width, height, false); 2705884166a251ec45f2bfac0139f18b162d31db241eAxel Davy} 2706884166a251ec45f2bfac0139f18b162d31db241eAxel Davy 27078d3e0f2187d146e7b34abe1f852320ea5e14732eAxel DavyCSMT_ITEM_NO_WAIT(nine_context_gen_mipmap, 2708325324c749c2331162e7889efc335bfcfcd27005Axel Davy ARG_BIND_REF(struct NineUnknown, dst), 27098d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy ARG_BIND_RES(struct pipe_resource, res), 27108d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy ARG_VAL(UINT, base_level), 27118d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy ARG_VAL(UINT, last_level), 27128d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy ARG_VAL(UINT, first_layer), 27138d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy ARG_VAL(UINT, last_layer), 27148d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy ARG_VAL(UINT, filter)) 27158d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy{ 27168d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy struct nine_context *context = &device->context; 27178d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy 2718325324c749c2331162e7889efc335bfcfcd27005Axel Davy /* We just bind dst for the bind count */ 2719325324c749c2331162e7889efc335bfcfcd27005Axel Davy (void)dst; 2720325324c749c2331162e7889efc335bfcfcd27005Axel Davy 27218d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy util_gen_mipmap(context->pipe, res, res->format, base_level, 27228d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy last_level, first_layer, last_layer, filter); 27238d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy} 27248d3e0f2187d146e7b34abe1f852320ea5e14732eAxel Davy 2725a78b5f437865fc976154d226eb87b67ef2f098d2Axel DavyCSMT_ITEM_NO_WAIT_WITH_COUNTER(nine_context_range_upload, 2726a78b5f437865fc976154d226eb87b67ef2f098d2Axel Davy ARG_BIND_RES(struct pipe_resource, res), 2727a78b5f437865fc976154d226eb87b67ef2f098d2Axel Davy ARG_VAL(unsigned, offset), 2728a78b5f437865fc976154d226eb87b67ef2f098d2Axel Davy ARG_VAL(unsigned, size), 2729a78b5f437865fc976154d226eb87b67ef2f098d2Axel Davy ARG_VAL(const void *, data)) 2730a78b5f437865fc976154d226eb87b67ef2f098d2Axel Davy{ 2731a78b5f437865fc976154d226eb87b67ef2f098d2Axel Davy struct nine_context *context = &device->context; 2732a78b5f437865fc976154d226eb87b67ef2f098d2Axel Davy 2733a78b5f437865fc976154d226eb87b67ef2f098d2Axel Davy context->pipe->buffer_subdata(context->pipe, res, 0, offset, size, data); 2734a78b5f437865fc976154d226eb87b67ef2f098d2Axel Davy} 2735a78b5f437865fc976154d226eb87b67ef2f098d2Axel Davy 2736c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel DavyCSMT_ITEM_NO_WAIT_WITH_COUNTER(nine_context_box_upload, 27377089d88199d607d8a135a9605f14ec6393134205Axel Davy ARG_BIND_REF(struct NineUnknown, dst), 2738c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy ARG_BIND_RES(struct pipe_resource, res), 2739c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy ARG_VAL(unsigned, level), 2740c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy ARG_COPY_REF(struct pipe_box, dst_box), 2741c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy ARG_VAL(enum pipe_format, src_format), 2742c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy ARG_VAL(const void *, src), 2743c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy ARG_VAL(unsigned, src_stride), 2744c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy ARG_VAL(unsigned, src_layer_stride), 2745c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy ARG_COPY_REF(struct pipe_box, src_box)) 2746c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy{ 2747c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy struct nine_context *context = &device->context; 2748c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy struct pipe_context *pipe = context->pipe; 2749c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy struct pipe_transfer *transfer = NULL; 2750c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy uint8_t *map; 2751c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy 27527089d88199d607d8a135a9605f14ec6393134205Axel Davy /* We just bind dst for the bind count */ 27537089d88199d607d8a135a9605f14ec6393134205Axel Davy (void)dst; 27547089d88199d607d8a135a9605f14ec6393134205Axel Davy 2755c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy map = pipe->transfer_map(pipe, 2756c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy res, 2757c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy level, 2758c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 2759c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy dst_box, &transfer); 2760c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy if (!map) 2761c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy return; 2762c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy 2763c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy /* Note: if formats are the sames, it will revert 2764c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy * to normal memcpy */ 2765c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy (void) util_format_translate_3d(res->format, 2766c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy map, transfer->stride, 2767c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy transfer->layer_stride, 2768c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy 0, 0, 0, 2769c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy src_format, 2770c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy src, src_stride, 2771c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy src_layer_stride, 2772c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy src_box->x, src_box->y, src_box->z, 2773c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy dst_box->width, dst_box->height, 2774c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy dst_box->depth); 2775c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy 2776c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy pipe_transfer_unmap(pipe, transfer); 2777c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy} 2778c873a2bd0c5a9fcb6e83f23e4494b5f53d71288bAxel Davy 27796a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davystruct pipe_query * 27806a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davynine_context_create_query(struct NineDevice9 *device, unsigned query_type) 27816a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy{ 278231262bbce085c69ef7a654528f509cb37415b41fAxel Davy struct pipe_context *pipe; 278331262bbce085c69ef7a654528f509cb37415b41fAxel Davy struct pipe_query *res; 2784b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy 278531262bbce085c69ef7a654528f509cb37415b41fAxel Davy pipe = nine_context_get_pipe_acquire(device); 278631262bbce085c69ef7a654528f509cb37415b41fAxel Davy res = pipe->create_query(pipe, query_type, 0); 278731262bbce085c69ef7a654528f509cb37415b41fAxel Davy nine_context_get_pipe_release(device); 278831262bbce085c69ef7a654528f509cb37415b41fAxel Davy return res; 27896a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy} 27906a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy 2791ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick RudolphCSMT_ITEM_DO_WAIT(nine_context_destroy_query, 2792ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph ARG_REF(struct pipe_query, query)) 27936a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy{ 2794b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 2795b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy 2796b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy context->pipe->destroy_query(context->pipe, query); 27976a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy} 27986a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy 27999c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel DavyCSMT_ITEM_NO_WAIT_WITH_COUNTER(nine_context_begin_query, 28009c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy ARG_REF(struct pipe_query, query)) 28016a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy{ 2802b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 2803b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy 2804b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy (void) context->pipe->begin_query(context->pipe, query); 28056a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy} 28066a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy 28079c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel DavyCSMT_ITEM_NO_WAIT_WITH_COUNTER(nine_context_end_query, 28089c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy ARG_REF(struct pipe_query, query)) 28096a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy{ 2810b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy struct nine_context *context = &device->context; 2811b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy 2812b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy (void) context->pipe->end_query(context->pipe, query); 28136a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy} 28146a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy 28156a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davyboolean 28166a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davynine_context_get_query_result(struct NineDevice9 *device, struct pipe_query *query, 28179c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy unsigned *counter, boolean flush, boolean wait, 28186a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy union pipe_query_result *result) 28196a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy{ 28209c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy struct pipe_context *pipe; 28219c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy boolean ret; 2822b95205b1f28ba23d88bc24bbb663b1e4938bbb48Axel Davy 2823d43bc05e8ba0f326273c21b10f714e4d2514adaeAxel Davy if (wait) 2824d43bc05e8ba0f326273c21b10f714e4d2514adaeAxel Davy nine_csmt_process(device); 2825d43bc05e8ba0f326273c21b10f714e4d2514adaeAxel Davy else if (p_atomic_read(counter) > 0) { 28269c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy if (flush && device->csmt_active) 28279c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy nine_queue_flush(device->csmt_ctx->pool); 28289c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy DBG("Pending begin/end. Returning\n"); 28299c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy return false; 28309c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy } 28319c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy 28329c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy pipe = nine_context_get_pipe_acquire(device); 28339c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy ret = pipe->get_query_result(pipe, query, wait, result); 28349c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy nine_context_get_pipe_release(device); 28359c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy 28369c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy DBG("Query result %s\n", ret ? "found" : "not yet available"); 28379c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4Axel Davy return ret; 28386a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy} 28396a7541a5aa5ce496cbef4d1b15dc3caeb512606cAxel Davy 284006285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy/* State defaults */ 2841fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 2842fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstatic const DWORD nine_render_state_defaults[NINED3DRS_LAST + 1] = 2843fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 2844fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt /* [D3DRS_ZENABLE] = D3DZB_TRUE; wine: auto_depth_stencil */ 2845fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ZENABLE] = D3DZB_FALSE, 2846fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_FILLMODE] = D3DFILL_SOLID, 2847fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SHADEMODE] = D3DSHADE_GOURAUD, 2848fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt/* [D3DRS_LINEPATTERN] = 0x00000000, */ 2849fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ZWRITEENABLE] = TRUE, 2850fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ALPHATESTENABLE] = FALSE, 2851fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_LASTPIXEL] = TRUE, 2852fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SRCBLEND] = D3DBLEND_ONE, 2853fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_DESTBLEND] = D3DBLEND_ZERO, 2854fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CULLMODE] = D3DCULL_CCW, 2855fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ZFUNC] = D3DCMP_LESSEQUAL, 2856fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ALPHAFUNC] = D3DCMP_ALWAYS, 2857fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ALPHAREF] = 0, 2858fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_DITHERENABLE] = FALSE, 2859fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ALPHABLENDENABLE] = FALSE, 2860fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_FOGENABLE] = FALSE, 2861fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SPECULARENABLE] = FALSE, 2862fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt/* [D3DRS_ZVISIBLE] = 0, */ 2863fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_FOGCOLOR] = 0, 2864fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_FOGTABLEMODE] = D3DFOG_NONE, 2865fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_FOGSTART] = 0x00000000, 2866fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_FOGEND] = 0x3F800000, 2867fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_FOGDENSITY] = 0x3F800000, 2868fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt/* [D3DRS_EDGEANTIALIAS] = FALSE, */ 2869fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_RANGEFOGENABLE] = FALSE, 2870fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILENABLE] = FALSE, 2871fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILFAIL] = D3DSTENCILOP_KEEP, 2872fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILZFAIL] = D3DSTENCILOP_KEEP, 2873fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILPASS] = D3DSTENCILOP_KEEP, 2874fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILREF] = 0, 2875fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILMASK] = 0xFFFFFFFF, 2876fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILFUNC] = D3DCMP_ALWAYS, 2877fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILWRITEMASK] = 0xFFFFFFFF, 2878fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_TEXTUREFACTOR] = 0xFFFFFFFF, 2879fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP0] = 0, 2880fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP1] = 0, 2881fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP2] = 0, 2882fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP3] = 0, 2883fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP4] = 0, 2884fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP5] = 0, 2885fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP6] = 0, 2886fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP7] = 0, 2887fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CLIPPING] = TRUE, 2888fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_LIGHTING] = TRUE, 2889fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_AMBIENT] = 0, 2890fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_FOGVERTEXMODE] = D3DFOG_NONE, 2891fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_COLORVERTEX] = TRUE, 2892fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_LOCALVIEWER] = TRUE, 2893fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_NORMALIZENORMALS] = FALSE, 2894fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_DIFFUSEMATERIALSOURCE] = D3DMCS_COLOR1, 2895fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SPECULARMATERIALSOURCE] = D3DMCS_COLOR2, 2896fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_AMBIENTMATERIALSOURCE] = D3DMCS_MATERIAL, 2897fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_EMISSIVEMATERIALSOURCE] = D3DMCS_MATERIAL, 2898fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_VERTEXBLEND] = D3DVBF_DISABLE, 2899fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CLIPPLANEENABLE] = 0, 2900fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt/* [D3DRS_SOFTWAREVERTEXPROCESSING] = FALSE, */ 2901fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSIZE] = 0x3F800000, 2902fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSIZE_MIN] = 0x3F800000, 2903fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSPRITEENABLE] = FALSE, 2904fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSCALEENABLE] = FALSE, 2905fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSCALE_A] = 0x3F800000, 2906fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSCALE_B] = 0x00000000, 2907fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSCALE_C] = 0x00000000, 2908fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_MULTISAMPLEANTIALIAS] = TRUE, 2909fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_MULTISAMPLEMASK] = 0xFFFFFFFF, 2910fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_PATCHEDGESTYLE] = D3DPATCHEDGE_DISCRETE, 2911fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt/* [D3DRS_PATCHSEGMENTS] = 0x3F800000, */ 2912fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_DEBUGMONITORTOKEN] = 0xDEADCAFE, 2913fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSIZE_MAX] = 0x3F800000, /* depends on cap */ 2914fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_INDEXEDVERTEXBLENDENABLE] = FALSE, 2915fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_COLORWRITEENABLE] = 0x0000000f, 2916fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_TWEENFACTOR] = 0x00000000, 2917fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_BLENDOP] = D3DBLENDOP_ADD, 2918fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POSITIONDEGREE] = D3DDEGREE_CUBIC, 2919fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_NORMALDEGREE] = D3DDEGREE_LINEAR, 2920fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SCISSORTESTENABLE] = FALSE, 2921fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SLOPESCALEDEPTHBIAS] = 0, 2922fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_MINTESSELLATIONLEVEL] = 0x3F800000, 2923fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_MAXTESSELLATIONLEVEL] = 0x3F800000, 2924fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ANTIALIASEDLINEENABLE] = FALSE, 2925fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ADAPTIVETESS_X] = 0x00000000, 2926fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ADAPTIVETESS_Y] = 0x00000000, 2927fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ADAPTIVETESS_Z] = 0x3F800000, 2928fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ADAPTIVETESS_W] = 0x00000000, 2929fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ENABLEADAPTIVETESSELLATION] = FALSE, 2930fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_TWOSIDEDSTENCILMODE] = FALSE, 2931fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CCW_STENCILFAIL] = D3DSTENCILOP_KEEP, 2932fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CCW_STENCILZFAIL] = D3DSTENCILOP_KEEP, 2933fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CCW_STENCILPASS] = D3DSTENCILOP_KEEP, 2934fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CCW_STENCILFUNC] = D3DCMP_ALWAYS, 2935fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_COLORWRITEENABLE1] = 0x0000000F, 2936fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_COLORWRITEENABLE2] = 0x0000000F, 2937fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_COLORWRITEENABLE3] = 0x0000000F, 2938fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_BLENDFACTOR] = 0xFFFFFFFF, 2939fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SRGBWRITEENABLE] = 0, 2940fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_DEPTHBIAS] = 0, 2941fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP8] = 0, 2942fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP9] = 0, 2943fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP10] = 0, 2944fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP11] = 0, 2945fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP12] = 0, 2946fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP13] = 0, 2947fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP14] = 0, 2948fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP15] = 0, 2949fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SEPARATEALPHABLENDENABLE] = FALSE, 2950fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SRCBLENDALPHA] = D3DBLEND_ONE, 2951fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_DESTBLENDALPHA] = D3DBLEND_ZERO, 2952fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_BLENDOPALPHA] = D3DBLENDOP_ADD, 2953fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [NINED3DRS_VSPOINTSIZE] = FALSE, 29540a4aaf1d411360c2a557fb016ffcb41f2701b9a2Axel Davy [NINED3DRS_RTMASK] = 0xf, 29559cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy [NINED3DRS_ALPHACOVERAGE] = FALSE, 29569cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy [NINED3DRS_MULTISAMPLE] = FALSE 2957fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}; 2958fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstatic const DWORD nine_tex_stage_state_defaults[NINED3DTSS_LAST + 1] = 2959fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 2960fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_COLOROP] = D3DTOP_DISABLE, 2961fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_ALPHAOP] = D3DTOP_DISABLE, 2962fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_COLORARG1] = D3DTA_TEXTURE, 2963fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_COLORARG2] = D3DTA_CURRENT, 2964fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_COLORARG0] = D3DTA_CURRENT, 2965fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_ALPHAARG1] = D3DTA_TEXTURE, 2966fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_ALPHAARG2] = D3DTA_CURRENT, 2967fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_ALPHAARG0] = D3DTA_CURRENT, 2968fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_RESULTARG] = D3DTA_CURRENT, 2969fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_BUMPENVMAT00] = 0, 2970fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_BUMPENVMAT01] = 0, 2971fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_BUMPENVMAT10] = 0, 2972fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_BUMPENVMAT11] = 0, 2973fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_BUMPENVLSCALE] = 0, 2974fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_BUMPENVLOFFSET] = 0, 2975fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_TEXCOORDINDEX] = 0, 2976fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DTSS_TEXTURETRANSFORMFLAGS] = D3DTTFF_DISABLE, 2977fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}; 2978fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstatic const DWORD nine_samp_state_defaults[NINED3DSAMP_LAST + 1] = 2979fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 2980fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DSAMP_ADDRESSU] = D3DTADDRESS_WRAP, 2981fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DSAMP_ADDRESSV] = D3DTADDRESS_WRAP, 2982fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DSAMP_ADDRESSW] = D3DTADDRESS_WRAP, 2983fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DSAMP_BORDERCOLOR] = 0, 2984fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DSAMP_MAGFILTER] = D3DTEXF_POINT, 2985fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DSAMP_MINFILTER] = D3DTEXF_POINT, 2986fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DSAMP_MIPFILTER] = D3DTEXF_NONE, 2987fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DSAMP_MIPMAPLODBIAS] = 0, 2988fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DSAMP_MAXMIPLEVEL] = 0, 2989fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DSAMP_MAXANISOTROPY] = 1, 2990fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DSAMP_SRGBTEXTURE] = 0, 2991fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DSAMP_ELEMENTINDEX] = 0, 2992fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DSAMP_DMAPOFFSET] = 0, 2993fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [NINED3DSAMP_MINLOD] = 0, 299409edc0555f91d76001b1ffc0e656b0614abb809aPatrick Rudolph [NINED3DSAMP_SHADOW] = 0, 299509edc0555f91d76001b1ffc0e656b0614abb809aPatrick Rudolph [NINED3DSAMP_CUBETEX] = 0 2996fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}; 2997993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 29984e922c81f616bba71565de8d7fd8f5f6955ce1ccAxel Davy/* Note: The following 4 functions assume there is no 29994e922c81f616bba71565de8d7fd8f5f6955ce1ccAxel Davy * pending commands */ 30004e922c81f616bba71565de8d7fd8f5f6955ce1ccAxel Davy 3001993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davyvoid nine_state_restore_non_cso(struct NineDevice9 *device) 3002993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy{ 30031b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 3004993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 3005b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group = NINE_STATE_ALL; 3006848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy context->changed.vtxbuf = (1ULL << device->caps.MaxStreams) - 1; 3007a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy context->changed.ucp = TRUE; 30081b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->commit |= NINE_STATE_COMMIT_CONST_VS | NINE_STATE_COMMIT_CONST_PS; 3009993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy} 3010993e68fa6a431a7c7c451c738e07d02a84ea40e4Axel Davy 3011fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtvoid 3012e0f75044c8d2793b6a5bd9832c57c5d199822486Axel Davynine_state_set_defaults(struct NineDevice9 *device, const D3DCAPS9 *caps, 3013fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt boolean is_reset) 3014fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 3015e0f75044c8d2793b6a5bd9832c57c5d199822486Axel Davy struct nine_state *state = &device->state; 30161b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_context *context = &device->context; 3017fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt unsigned s; 3018fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 3019fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt /* Initialize defaults. 3020fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt */ 302164e232bd60336591e55e6c95112bac334cb38970Axel Davy memcpy(context->rs, nine_render_state_defaults, sizeof(context->rs)); 3022fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 302347b390fe45e5e6f982c60b58985892438959cd8eJan Vesely for (s = 0; s < ARRAY_SIZE(state->ff.tex_stage); ++s) { 3024fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt memcpy(&state->ff.tex_stage[s], nine_tex_stage_state_defaults, 3025fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt sizeof(state->ff.tex_stage[s])); 3026fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt state->ff.tex_stage[s][D3DTSS_TEXCOORDINDEX] = s; 3027fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 3028fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt state->ff.tex_stage[0][D3DTSS_COLOROP] = D3DTOP_MODULATE; 3029fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt state->ff.tex_stage[0][D3DTSS_ALPHAOP] = D3DTOP_SELECTARG1; 30301a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 30311a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy for (s = 0; s < ARRAY_SIZE(state->ff.tex_stage); ++s) 30321a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy memcpy(&context->ff.tex_stage[s], state->ff.tex_stage[s], 30331a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy sizeof(state->ff.tex_stage[s])); 30341a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy 30351b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy memset(&context->bumpmap_vars, 0, sizeof(context->bumpmap_vars)); 3036fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 303793ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy for (s = 0; s < NINE_MAX_SAMPLERS; ++s) { 303893ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy memcpy(&context->samp[s], nine_samp_state_defaults, 303993ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy sizeof(context->samp[s])); 3040494ace4b851fc3201bdb0297e53ccf8dfde78510Axel Davy memcpy(&state->samp_advertised[s], nine_samp_state_defaults, 3041494ace4b851fc3201bdb0297e53ccf8dfde78510Axel Davy sizeof(state->samp_advertised[s])); 3042fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 3043fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 3044b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memset(state->vs_const_f, 0, VS_CONST_F_SIZE(device)); 3045b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memset(context->vs_const_f, 0, device->vs_const_size); 3046b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy if (context->vs_const_f_swvp) 3047b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memset(context->vs_const_f_swvp, 0, NINE_MAX_CONST_F_SWVP * sizeof(float[4])); 3048b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memset(state->vs_const_i, 0, VS_CONST_I_SIZE(device)); 3049b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memset(context->vs_const_i, 0, VS_CONST_I_SIZE(device)); 3050b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memset(state->vs_const_b, 0, VS_CONST_B_SIZE(device)); 3051b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memset(context->vs_const_b, 0, VS_CONST_B_SIZE(device)); 3052b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memset(state->ps_const_f, 0, device->ps_const_size); 3053b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memset(context->ps_const_f, 0, device->ps_const_size); 3054b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memset(state->ps_const_i, 0, sizeof(state->ps_const_i)); 3055b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memset(context->ps_const_i, 0, sizeof(context->ps_const_i)); 3056b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memset(state->ps_const_b, 0, sizeof(state->ps_const_b)); 3057b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy memset(context->ps_const_b, 0, sizeof(context->ps_const_b)); 3058fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 3059fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt /* Cap dependent initial state: 3060fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt */ 306164e232bd60336591e55e6c95112bac334cb38970Axel Davy context->rs[D3DRS_POINTSIZE_MAX] = fui(caps->MaxPointSize); 3062fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 306364e232bd60336591e55e6c95112bac334cb38970Axel Davy memcpy(state->rs_advertised, context->rs, sizeof(context->rs)); 306456b4222b299ff08da4eda63fcc608dc77fc585f1Axel Davy 3065fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt /* Set changed flags to initialize driver. 3066fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt */ 3067b748b8fd8619ab412517f859dbf9a42b62ef6309Axel Davy context->changed.group = NINE_STATE_ALL; 3068848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy context->changed.vtxbuf = (1ULL << device->caps.MaxStreams) - 1; 3069a0a18920c7cdba1ffc6d642aff039476755c1caeAxel Davy context->changed.ucp = TRUE; 3070fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 30711a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.changed.transform[0] = ~0; 30721a735a99d0ab4d618802e4044f068f926aaf4513Axel Davy context->ff.changed.transform[D3DTS_WORLD / 32] |= 1 << (D3DTS_WORLD % 32); 3073fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 3074fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt if (!is_reset) { 30754a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy state->viewport.MinZ = context->viewport.MinZ = 0.0f; 30764a6d83ebc29546e8a70b4187bf1b66f6d745ef2eAxel Davy state->viewport.MaxZ = context->viewport.MaxZ = 1.0f; 3077fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 3078fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 307993ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy for (s = 0; s < NINE_MAX_SAMPLERS; ++s) 308093ac6dfdcce5260ee06b8c32306cb2af8ee782e3Axel Davy context->changed.sampler[s] = ~0; 308117abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco 308217abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco if (!is_reset) { 30831b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->dummy_vbo_bound_at = -1; 30841b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy context->vbo_bound_done = FALSE; 308517abefa12be1d5e7d436bfbb082c3eba19adf26cTiziano Bacocco } 3086fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 3087fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 3088fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtvoid 3089fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtnine_state_clear(struct nine_state *state, const boolean device) 3090fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 3091fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt unsigned i; 3092fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 309347b390fe45e5e6f982c60b58985892438959cd8eJan Vesely for (i = 0; i < ARRAY_SIZE(state->rt); ++i) 3094fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt nine_bind(&state->rt[i], NULL); 3095fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt nine_bind(&state->ds, NULL); 3096fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt nine_bind(&state->vs, NULL); 3097fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt nine_bind(&state->ps, NULL); 3098fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt nine_bind(&state->vdecl, NULL); 3099848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy for (i = 0; i < PIPE_MAX_ATTRIBS; ++i) 3100fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt nine_bind(&state->stream[i], NULL); 3101848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy 3102fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt nine_bind(&state->idxbuf, NULL); 3103fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt for (i = 0; i < NINE_MAX_SAMPLERS; ++i) { 3104fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt if (device && 3105fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt state->texture[i] && 3106fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt --state->texture[i]->bind_count == 0) 3107fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt list_delinit(&state->texture[i]->list); 3108fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt nine_bind(&state->texture[i], NULL); 3109fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 3110fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 3111fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 3112b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davyvoid 3113eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davynine_context_clear(struct NineDevice9 *device) 3114eed47b748f26363c0de063f51b0c67959e7e5b06Axel Davy{ 3115eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy struct nine_context *context = &device->context; 3116eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy struct pipe_context *pipe = context->pipe; 3117eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy struct cso_context *cso = context->cso; 3118eed47b748f26363c0de063f51b0c67959e7e5b06Axel Davy unsigned i; 3119eed47b748f26363c0de063f51b0c67959e7e5b06Axel Davy 3120eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy /* Early device ctor failure. Nothing to do */ 3121eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy if (!pipe || !cso) 3122eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy return; 3123eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy 3124eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy pipe->bind_vs_state(pipe, NULL); 3125eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy pipe->bind_fs_state(pipe, NULL); 3126eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy 3127eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy /* Don't unbind constant buffers, they're device-private and 3128eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy * do not change on Reset. 3129eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy */ 3130eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy 3131eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy cso_set_samplers(cso, PIPE_SHADER_VERTEX, 0, NULL); 3132eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, 0, NULL); 3133eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy 3134eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy cso_set_sampler_views(cso, PIPE_SHADER_VERTEX, 0, NULL); 3135eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, 0, NULL); 3136eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy 3137eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy pipe->set_vertex_buffers(pipe, 0, device->caps.MaxStreams, NULL); 3138eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy pipe->set_index_buffer(pipe, NULL); 3139eb884a4ac2579a8c15a0548e0a72cf9cc07530e0Axel Davy 31407f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy for (i = 0; i < ARRAY_SIZE(context->rt); ++i) 31417f6e01052b77ee825ec681ee5d9b65f5d182ca4fAxel Davy nine_bind(&context->rt[i], NULL); 3142d671190df907b7643ba00143b2fbf0a1f5bee6c4Axel Davy nine_bind(&context->ds, NULL); 31432a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy nine_bind(&context->vs, NULL); 3144c6ca7c747e47127bb0ced0c7ca38beaa760376a4Axel Davy nine_bind(&context->ps, NULL); 314543288cf376a280f1f7757e2c47f6ddcaad0c384fAxel Davy nine_bind(&context->vdecl, NULL); 3146848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy for (i = 0; i < PIPE_MAX_ATTRIBS; ++i) 3147848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy pipe_resource_reference(&context->vtxbuf[i].buffer, NULL); 3148aafbd62955f279172b0b57c3fd2b82da54f8035fAxel Davy pipe_resource_reference(&context->idxbuf.buffer, NULL); 3149848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy 31507ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy for (i = 0; i < NINE_MAX_SAMPLERS; ++i) { 31517ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy context->texture[i].enabled = FALSE; 31527ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy pipe_resource_reference(&context->texture[i].resource, 31537ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy NULL); 31547ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy pipe_sampler_view_reference(&context->texture[i].view[0], 31557ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy NULL); 31567ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy pipe_sampler_view_reference(&context->texture[i].view[1], 31577ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy NULL); 31587ebdbb573b6d784068d92993d1f5f81986cfe279Axel Davy } 3159eed47b748f26363c0de063f51b0c67959e7e5b06Axel Davy} 3160eed47b748f26363c0de063f51b0c67959e7e5b06Axel Davy 3161eed47b748f26363c0de063f51b0c67959e7e5b06Axel Davyvoid 3162b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davynine_state_init_sw(struct NineDevice9 *device) 3163b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy{ 3164b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_context *pipe_sw = device->pipe_sw; 3165b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_rasterizer_state rast; 3166b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_blend_state blend; 3167b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_depth_stencil_alpha_state dsa; 3168b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_framebuffer_state fb; 3169b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3170b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy /* Only used with Streamout */ 3171b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy memset(&rast, 0, sizeof(rast)); 3172b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy rast.rasterizer_discard = true; 3173b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy rast.point_quad_rasterization = 1; /* to make llvmpipe happy */ 3174b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cso_set_rasterizer(device->cso_sw, &rast); 3175b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3176b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy /* dummy settings */ 3177b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy memset(&blend, 0, sizeof(blend)); 3178b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy memset(&dsa, 0, sizeof(dsa)); 3179b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy memset(&fb, 0, sizeof(fb)); 3180b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cso_set_blend(device->cso_sw, &blend); 3181b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cso_set_depth_stencil_alpha(device->cso_sw, &dsa); 3182b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cso_set_framebuffer(device->cso_sw, &fb); 3183b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cso_set_viewport_dims(device->cso_sw, 1.0, 1.0, false); 3184b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cso_set_fragment_shader_handle(device->cso_sw, util_make_empty_fragment_shader(pipe_sw)); 3185b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy} 3186b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3187b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy/* There is duplication with update_vertex_elements. 3188b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy * TODO: Share the code */ 3189b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3190b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davystatic void 3191b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davyupdate_vertex_elements_sw(struct NineDevice9 *device) 3192b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy{ 3193b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct nine_state *state = &device->state; 3194b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy const struct NineVertexDeclaration9 *vdecl = device->state.vdecl; 3195b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy const struct NineVertexShader9 *vs; 3196b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy unsigned n, b, i; 3197b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy int index; 3198b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy char vdecl_index_map[16]; /* vs->num_inputs <= 16 */ 3199b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy char used_streams[device->caps.MaxStreams]; 3200b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy int dummy_vbo_stream = -1; 3201b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy BOOL need_dummy_vbo = FALSE; 3202b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_vertex_element ve[PIPE_MAX_ATTRIBS]; 32032a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy bool programmable_vs = state->vs && !(state->vdecl && state->vdecl->position_t); 3204b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3205b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy memset(vdecl_index_map, -1, 16); 3206b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy memset(used_streams, 0, device->caps.MaxStreams); 32072a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy vs = programmable_vs ? device->state.vs : device->ff.vs; 3208b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3209b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (vdecl) { 3210b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy for (n = 0; n < vs->num_inputs; ++n) { 3211b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy DBG("looking up input %u (usage %u) from vdecl(%p)\n", 3212b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy n, vs->input_map[n].ndecl, vdecl); 3213b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3214b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy for (i = 0; i < vdecl->nelems; i++) { 3215b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (vdecl->usage_map[i] == vs->input_map[n].ndecl) { 3216b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy vdecl_index_map[n] = i; 3217b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy used_streams[vdecl->elems[i].vertex_buffer_index] = 1; 3218b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy break; 3219b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3220b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3221b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (vdecl_index_map[n] < 0) 3222b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy need_dummy_vbo = TRUE; 3223b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3224b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } else { 3225b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy /* No vertex declaration. Likely will never happen in practice, 3226b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy * but we need not crash on this */ 3227b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy need_dummy_vbo = TRUE; 3228b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3229b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3230b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (need_dummy_vbo) { 3231b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy for (i = 0; i < device->caps.MaxStreams; i++ ) { 3232b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (!used_streams[i]) { 3233b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy dummy_vbo_stream = i; 3234b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy break; 3235b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3236b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3237b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 32381b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy /* TODO handle dummy_vbo */ 32391b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy assert (!need_dummy_vbo); 3240b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3241b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy for (n = 0; n < vs->num_inputs; ++n) { 3242b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy index = vdecl_index_map[n]; 3243b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (index >= 0) { 3244b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy ve[n] = vdecl->elems[index]; 3245b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy b = ve[n].vertex_buffer_index; 3246b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy /* XXX wine just uses 1 here: */ 3247b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (state->stream_freq[b] & D3DSTREAMSOURCE_INSTANCEDATA) 3248b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy ve[n].instance_divisor = state->stream_freq[b] & 0x7FFFFF; 3249b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } else { 3250b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy /* if the vertex declaration is incomplete compared to what the 3251b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy * vertex shader needs, we bind a dummy vbo with 0 0 0 0. 3252b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy * This is not precised by the spec, but is the behaviour 3253b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy * tested on win */ 3254b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy ve[n].vertex_buffer_index = dummy_vbo_stream; 3255b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy ve[n].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 3256b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy ve[n].src_offset = 0; 3257b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy ve[n].instance_divisor = 0; 3258b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3259b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3260b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3261b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cso_set_vertex_elements(device->cso_sw, vs->num_inputs, ve); 3262b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy} 3263b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3264b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davystatic void 3265b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davyupdate_vertex_buffers_sw(struct NineDevice9 *device, int start_vertice, int num_vertices) 3266b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy{ 326731262bbce085c69ef7a654528f509cb37415b41fAxel Davy struct pipe_context *pipe = nine_context_get_pipe_acquire(device); 3268b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_context *pipe_sw = device->pipe_sw; 3269b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct nine_state *state = &device->state; 32701b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_state_sw_internal *sw_internal = &device->state_sw_internal; 3271b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_vertex_buffer vtxbuf; 3272b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy uint32_t mask = 0xf; 3273b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy unsigned i; 3274b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3275b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy DBG("mask=%x\n", mask); 3276b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3277b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy /* TODO: handle dummy_vbo_bound_at */ 3278b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3279b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy for (i = 0; mask; mask >>= 1, ++i) { 3280b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (mask & 1) { 3281848ffc81e4c91414ec29464ee71560547a12cd64Axel Davy if (state->stream[i]) { 32828960be0e939bc6c0f9f34c5d4a16891af7e325fdAxel Davy unsigned offset; 3283b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_resource *buf; 3284b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_box box; 3285b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3286b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy vtxbuf = state->vtxbuf[i]; 32878960be0e939bc6c0f9f34c5d4a16891af7e325fdAxel Davy vtxbuf.buffer = NineVertexBuffer9_GetResource(state->stream[i], &offset); 3288b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3289b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy DBG("Locking %p (offset %d, length %d)\n", vtxbuf.buffer, 3290b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy vtxbuf.buffer_offset, num_vertices * vtxbuf.stride); 3291b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 32928960be0e939bc6c0f9f34c5d4a16891af7e325fdAxel Davy u_box_1d(vtxbuf.buffer_offset + offset + start_vertice * vtxbuf.stride, 3293b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy num_vertices * vtxbuf.stride, &box); 3294b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy buf = vtxbuf.buffer; 3295b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy vtxbuf.user_buffer = pipe->transfer_map(pipe, buf, 0, PIPE_TRANSFER_READ, &box, 32961b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy &(sw_internal->transfers_so[i])); 3297b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy vtxbuf.buffer = NULL; 3298b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (!device->driver_caps.user_sw_vbufs) { 3299b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy u_upload_data(device->vertex_sw_uploader, 3300b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 0, 3301b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy box.width, 3302b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 16, 3303b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy vtxbuf.user_buffer, 3304b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy &(vtxbuf.buffer_offset), 3305b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy &(vtxbuf.buffer)); 3306b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy u_upload_unmap(device->vertex_sw_uploader); 3307b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy vtxbuf.user_buffer = NULL; 3308b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3309b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_sw->set_vertex_buffers(pipe_sw, i, 1, &vtxbuf); 3310b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (vtxbuf.buffer) 3311b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_resource_reference(&vtxbuf.buffer, NULL); 3312b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } else 3313b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_sw->set_vertex_buffers(pipe_sw, i, 1, NULL); 3314b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3315b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 331631262bbce085c69ef7a654528f509cb37415b41fAxel Davy nine_context_get_pipe_release(device); 3317b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy} 3318b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3319b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davystatic void 3320b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davyupdate_vs_constants_sw(struct NineDevice9 *device) 3321b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy{ 3322b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct nine_state *state = &device->state; 3323b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_context *pipe_sw = device->pipe_sw; 3324b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3325b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy DBG("updating\n"); 3326b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3327b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy { 3328b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_constant_buffer cb; 3329b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy const void *buf; 3330b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3331b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer = NULL; 3332b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer_offset = 0; 3333b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer_size = 4096 * sizeof(float[4]); 3334b13b217243f1700e9c88bfc91a4d85cc2c17ab60Axel Davy cb.user_buffer = state->vs_const_f; 3335b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3336b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (state->vs->lconstf.ranges) { 3337b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy const struct nine_lconstf *lconstf = &device->state.vs->lconstf; 3338b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy const struct nine_range *r = lconstf->ranges; 3339b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy unsigned n = 0; 3340b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy float *dst = device->state.vs_lconstf_temp; 3341b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy float *src = (float *)cb.user_buffer; 3342b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy memcpy(dst, src, 8192 * sizeof(float[4])); 3343b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy while (r) { 3344b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy unsigned p = r->bgn; 3345b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy unsigned c = r->end - r->bgn; 3346b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy memcpy(&dst[p * 4], &lconstf->data[n * 4], c * 4 * sizeof(float)); 3347b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy n += c; 3348b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy r = r->next; 3349b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3350b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer = dst; 3351b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3352b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3353b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy buf = cb.user_buffer; 3354b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (!device->driver_caps.user_sw_cbufs) { 3355b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy u_upload_data(device->constbuf_sw_uploader, 3356b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 0, 3357b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer_size, 3358b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 16, 3359b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer, 3360b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy &(cb.buffer_offset), 3361b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy &(cb.buffer)); 3362b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy u_upload_unmap(device->constbuf_sw_uploader); 3363b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer = NULL; 3364b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3365b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3366b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_sw->set_constant_buffer(pipe_sw, PIPE_SHADER_VERTEX, 0, &cb); 3367b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (cb.buffer) 3368b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_resource_reference(&cb.buffer, NULL); 3369b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3370b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer = (char *)buf + 4096 * sizeof(float[4]); 3371b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (!device->driver_caps.user_sw_cbufs) { 3372b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy u_upload_data(device->constbuf_sw_uploader, 3373b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 0, 3374b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer_size, 3375b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 16, 3376b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer, 3377b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy &(cb.buffer_offset), 3378b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy &(cb.buffer)); 3379b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy u_upload_unmap(device->constbuf_sw_uploader); 3380b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer = NULL; 3381b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3382b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3383b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_sw->set_constant_buffer(pipe_sw, PIPE_SHADER_VERTEX, 1, &cb); 3384b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (cb.buffer) 3385b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_resource_reference(&cb.buffer, NULL); 3386b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3387b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3388b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy { 3389b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_constant_buffer cb; 3390b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3391b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer = NULL; 3392b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer_offset = 0; 3393b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer_size = 2048 * sizeof(float[4]); 3394b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer = state->vs_const_i; 3395b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3396b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (!device->driver_caps.user_sw_cbufs) { 3397b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy u_upload_data(device->constbuf_sw_uploader, 3398b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 0, 3399b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer_size, 3400b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 16, 3401b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer, 3402b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy &(cb.buffer_offset), 3403b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy &(cb.buffer)); 3404b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy u_upload_unmap(device->constbuf_sw_uploader); 3405b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer = NULL; 3406b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3407b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3408b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_sw->set_constant_buffer(pipe_sw, PIPE_SHADER_VERTEX, 2, &cb); 3409b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (cb.buffer) 3410b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_resource_reference(&cb.buffer, NULL); 3411b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3412b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3413b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy { 3414b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_constant_buffer cb; 3415b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3416b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer = NULL; 3417b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer_offset = 0; 3418b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer_size = 512 * sizeof(float[4]); 3419b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer = state->vs_const_b; 3420b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3421b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (!device->driver_caps.user_sw_cbufs) { 3422b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy u_upload_data(device->constbuf_sw_uploader, 3423b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 0, 3424b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer_size, 3425b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 16, 3426b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer, 3427b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy &(cb.buffer_offset), 3428b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy &(cb.buffer)); 3429b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy u_upload_unmap(device->constbuf_sw_uploader); 3430b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer = NULL; 3431b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3432b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3433b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_sw->set_constant_buffer(pipe_sw, PIPE_SHADER_VERTEX, 3, &cb); 3434b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (cb.buffer) 3435b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_resource_reference(&cb.buffer, NULL); 3436b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3437b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3438b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy { 3439b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_constant_buffer cb; 3440b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy const D3DVIEWPORT9 *vport = &device->state.viewport; 3441b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy float viewport_data[8] = {(float)vport->Width * 0.5f, 3442b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy (float)vport->Height * -0.5f, vport->MaxZ - vport->MinZ, 0.f, 3443b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy (float)vport->Width * 0.5f + (float)vport->X, 3444b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy (float)vport->Height * 0.5f + (float)vport->Y, 3445b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy vport->MinZ, 0.f}; 3446b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3447b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer = NULL; 3448b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer_offset = 0; 3449b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer_size = 2 * sizeof(float[4]); 3450b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer = viewport_data; 3451b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3452b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy { 3453b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy u_upload_data(device->constbuf_sw_uploader, 3454b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 0, 3455b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.buffer_size, 3456b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 16, 3457b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer, 3458b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy &(cb.buffer_offset), 3459b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy &(cb.buffer)); 3460b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy u_upload_unmap(device->constbuf_sw_uploader); 3461b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cb.user_buffer = NULL; 3462b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3463b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3464b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_sw->set_constant_buffer(pipe_sw, PIPE_SHADER_VERTEX, 4, &cb); 3465b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (cb.buffer) 3466b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_resource_reference(&cb.buffer, NULL); 3467b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 3468b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3469b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy} 3470b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3471b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davyvoid 3472b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davynine_state_prepare_draw_sw(struct NineDevice9 *device, struct NineVertexDeclaration9 *vdecl_out, 3473b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy int start_vertice, int num_vertices, struct pipe_stream_output_info *so) 3474b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy{ 3475b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct nine_state *state = &device->state; 34762a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy bool programmable_vs = state->vs && !(state->vdecl && state->vdecl->position_t); 34772a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy struct NineVertexShader9 *vs = programmable_vs ? device->state.vs : device->ff.vs; 3478b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 34792a698c3df2a940a693d39c77692b32d946ccec1dAxel Davy assert(programmable_vs); 3480b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3481b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy DBG("Preparing draw\n"); 3482b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy cso_set_vertex_shader_handle(device->cso_sw, 3483b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy NineVertexShader9_GetVariantProcessVertices(vs, vdecl_out, so)); 3484b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy update_vertex_elements_sw(device); 3485b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy update_vertex_buffers_sw(device, start_vertice, num_vertices); 3486b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy update_vs_constants_sw(device); 3487b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy DBG("Preparation succeeded\n"); 3488b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy} 3489b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3490b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davyvoid 3491b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davynine_state_after_draw_sw(struct NineDevice9 *device) 3492b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy{ 34931b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy struct nine_state_sw_internal *sw_internal = &device->state_sw_internal; 349431262bbce085c69ef7a654528f509cb37415b41fAxel Davy struct pipe_context *pipe = nine_context_get_pipe_acquire(device); 3495b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_context *pipe_sw = device->pipe_sw; 3496b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy int i; 3497b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3498b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy for (i = 0; i < 4; i++) { 3499b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy pipe_sw->set_vertex_buffers(pipe_sw, i, 1, NULL); 35001b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy if (sw_internal->transfers_so[i]) 35011b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy pipe->transfer_unmap(pipe, sw_internal->transfers_so[i]); 35021b24d5e1f5450e51d79c22679fed5d4b9731004cAxel Davy sw_internal->transfers_so[i] = NULL; 3503b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 350431262bbce085c69ef7a654528f509cb37415b41fAxel Davy nine_context_get_pipe_release(device); 3505b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy} 3506b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3507b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davyvoid 3508b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davynine_state_destroy_sw(struct NineDevice9 *device) 3509b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy{ 3510b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy (void) device; 3511b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy /* Everything destroyed with cso */ 3512b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy} 3513b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 3514fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt/* 3515fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstatic const DWORD nine_render_states_pixel[] = 3516fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 3517fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_ALPHABLENDENABLE, 3518fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_ALPHAFUNC, 3519fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_ALPHAREF, 3520fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_ALPHATESTENABLE, 3521fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_ANTIALIASEDLINEENABLE, 3522fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_BLENDFACTOR, 3523fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_BLENDOP, 3524fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_BLENDOPALPHA, 3525fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_CCW_STENCILFAIL, 3526fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_CCW_STENCILPASS, 3527fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_CCW_STENCILZFAIL, 3528fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_COLORWRITEENABLE, 3529fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_COLORWRITEENABLE1, 3530fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_COLORWRITEENABLE2, 3531fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_COLORWRITEENABLE3, 3532fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_DEPTHBIAS, 3533fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_DESTBLEND, 3534fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_DESTBLENDALPHA, 3535fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_DITHERENABLE, 3536fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_FILLMODE, 3537fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_FOGDENSITY, 3538fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_FOGEND, 3539fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_FOGSTART, 3540fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_LASTPIXEL, 3541fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_SCISSORTESTENABLE, 3542fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_SEPARATEALPHABLENDENABLE, 3543fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_SHADEMODE, 3544fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_SLOPESCALEDEPTHBIAS, 3545fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_SRCBLEND, 3546fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_SRCBLENDALPHA, 3547fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_SRGBWRITEENABLE, 3548fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_STENCILENABLE, 3549fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_STENCILFAIL, 3550fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_STENCILFUNC, 3551fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_STENCILMASK, 3552fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_STENCILPASS, 3553fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_STENCILREF, 3554fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_STENCILWRITEMASK, 3555fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_STENCILZFAIL, 3556fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TEXTUREFACTOR, 3557fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TWOSIDEDSTENCILMODE, 3558fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP0, 3559fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP1, 3560fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP10, 3561fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP11, 3562fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP12, 3563fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP13, 3564fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP14, 3565fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP15, 3566fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP2, 3567fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP3, 3568fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP4, 3569fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP5, 3570fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP6, 3571fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP7, 3572fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP8, 3573fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_WRAP9, 3574fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_ZENABLE, 3575fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_ZFUNC, 3576fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_ZWRITEENABLE 3577fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}; 3578fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt*/ 3579fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtconst uint32_t nine_render_states_pixel[(NINED3DRS_LAST + 31) / 32] = 3580fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 3581fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 0x0f99c380, 0x1ff00070, 0x00000000, 0x00000000, 3582fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 0x000000ff, 0xde01c900, 0x0003ffcf 3583fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}; 3584fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 3585fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt/* 3586fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstatic const DWORD nine_render_states_vertex[] = 3587fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 3588fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_ADAPTIVETESS_W, 3589fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_ADAPTIVETESS_X, 3590fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_ADAPTIVETESS_Y, 3591fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_ADAPTIVETESS_Z, 3592fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_AMBIENT, 3593fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_AMBIENTMATERIALSOURCE, 3594fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_CLIPPING, 3595fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_CLIPPLANEENABLE, 3596fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_COLORVERTEX, 3597fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_CULLMODE, 3598fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_DIFFUSEMATERIALSOURCE, 3599fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_EMISSIVEMATERIALSOURCE, 3600fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_ENABLEADAPTIVETESSELLATION, 3601fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_FOGCOLOR, 3602fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_FOGDENSITY, 3603fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_FOGENABLE, 3604fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_FOGEND, 3605fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_FOGSTART, 3606fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_FOGTABLEMODE, 3607fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_FOGVERTEXMODE, 3608fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_INDEXEDVERTEXBLENDENABLE, 3609fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_LIGHTING, 3610fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_LOCALVIEWER, 3611fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_MAXTESSELLATIONLEVEL, 3612fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_MINTESSELLATIONLEVEL, 3613fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_MULTISAMPLEANTIALIAS, 3614fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_MULTISAMPLEMASK, 3615fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_NORMALDEGREE, 3616fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_NORMALIZENORMALS, 3617fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_PATCHEDGESTYLE, 3618fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_POINTSCALE_A, 3619fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_POINTSCALE_B, 3620fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_POINTSCALE_C, 3621fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_POINTSCALEENABLE, 3622fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_POINTSIZE, 3623fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_POINTSIZE_MAX, 3624fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_POINTSIZE_MIN, 3625fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_POINTSPRITEENABLE, 3626fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_POSITIONDEGREE, 3627fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_RANGEFOGENABLE, 3628fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_SHADEMODE, 3629fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_SPECULARENABLE, 3630fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_SPECULARMATERIALSOURCE, 3631fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TWEENFACTOR, 3632fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_VERTEXBLEND 3633fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}; 3634fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt*/ 3635fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtconst uint32_t nine_render_states_vertex[(NINED3DRS_LAST + 31) / 32] = 3636fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 3637fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 0x30400200, 0x0001007c, 0x00000000, 0x00000000, 3638fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 0xfd9efb00, 0x01fc34cf, 0x00000000 3639fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}; 3640fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 3641fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt/* TODO: put in the right values */ 3642fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtconst uint32_t nine_render_state_group[NINED3DRS_LAST + 1] = 3643fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 36449cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy [D3DRS_ZENABLE] = NINE_STATE_DSA | NINE_STATE_MULTISAMPLE, 3645fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_FILLMODE] = NINE_STATE_RASTERIZER, 3646fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SHADEMODE] = NINE_STATE_RASTERIZER, 3647fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ZWRITEENABLE] = NINE_STATE_DSA, 3648fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ALPHATESTENABLE] = NINE_STATE_DSA, 3649fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_LASTPIXEL] = NINE_STATE_RASTERIZER, 3650fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SRCBLEND] = NINE_STATE_BLEND, 3651fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_DESTBLEND] = NINE_STATE_BLEND, 3652fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CULLMODE] = NINE_STATE_RASTERIZER, 3653fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ZFUNC] = NINE_STATE_DSA, 3654fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ALPHAREF] = NINE_STATE_DSA, 3655fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ALPHAFUNC] = NINE_STATE_DSA, 365634708783833bb99e9e42cd40a745fed1354317f2Axel Davy [D3DRS_DITHERENABLE] = NINE_STATE_BLEND, 3657fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ALPHABLENDENABLE] = NINE_STATE_BLEND, 36588f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy [D3DRS_FOGENABLE] = NINE_STATE_FF_OTHER | NINE_STATE_FOG_SHADER | NINE_STATE_PS_CONST, 3659fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SPECULARENABLE] = NINE_STATE_FF_LIGHTING, 36608f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy [D3DRS_FOGCOLOR] = NINE_STATE_FF_OTHER | NINE_STATE_PS_CONST, 36618f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy [D3DRS_FOGTABLEMODE] = NINE_STATE_FF_OTHER | NINE_STATE_FOG_SHADER | NINE_STATE_PS_CONST, 36628f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy [D3DRS_FOGSTART] = NINE_STATE_FF_OTHER | NINE_STATE_PS_CONST, 36638f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy [D3DRS_FOGEND] = NINE_STATE_FF_OTHER | NINE_STATE_PS_CONST, 36648f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy [D3DRS_FOGDENSITY] = NINE_STATE_FF_OTHER | NINE_STATE_PS_CONST, 3665fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_RANGEFOGENABLE] = NINE_STATE_FF_OTHER, 36669cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy [D3DRS_STENCILENABLE] = NINE_STATE_DSA | NINE_STATE_MULTISAMPLE, 3667fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILFAIL] = NINE_STATE_DSA, 3668fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILZFAIL] = NINE_STATE_DSA, 3669fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILPASS] = NINE_STATE_DSA, 3670fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILFUNC] = NINE_STATE_DSA, 3671fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILREF] = NINE_STATE_STENCIL_REF, 3672fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILMASK] = NINE_STATE_DSA, 3673fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_STENCILWRITEMASK] = NINE_STATE_DSA, 3674fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_TEXTUREFACTOR] = NINE_STATE_FF_PSSTAGES, 3675fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP0] = NINE_STATE_UNHANDLED, /* cylindrical wrap is crazy */ 3676fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP1] = NINE_STATE_UNHANDLED, 3677fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP2] = NINE_STATE_UNHANDLED, 3678fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP3] = NINE_STATE_UNHANDLED, 3679fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP4] = NINE_STATE_UNHANDLED, 3680fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP5] = NINE_STATE_UNHANDLED, 3681fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP6] = NINE_STATE_UNHANDLED, 3682fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP7] = NINE_STATE_UNHANDLED, 3683fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CLIPPING] = 0, /* software vertex processing only */ 3684fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_LIGHTING] = NINE_STATE_FF_LIGHTING, 3685fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_AMBIENT] = NINE_STATE_FF_LIGHTING | NINE_STATE_FF_MATERIAL, 3686fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_FOGVERTEXMODE] = NINE_STATE_FF_OTHER, 3687fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_COLORVERTEX] = NINE_STATE_FF_LIGHTING, 3688fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_LOCALVIEWER] = NINE_STATE_FF_LIGHTING, 3689fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_NORMALIZENORMALS] = NINE_STATE_FF_OTHER, 3690fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_DIFFUSEMATERIALSOURCE] = NINE_STATE_FF_LIGHTING, 3691fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SPECULARMATERIALSOURCE] = NINE_STATE_FF_LIGHTING, 3692fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_AMBIENTMATERIALSOURCE] = NINE_STATE_FF_LIGHTING, 3693fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_EMISSIVEMATERIALSOURCE] = NINE_STATE_FF_LIGHTING, 3694fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_VERTEXBLEND] = NINE_STATE_FF_OTHER, 3695fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CLIPPLANEENABLE] = NINE_STATE_RASTERIZER, 3696fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSIZE] = NINE_STATE_RASTERIZER, 369789344a80fc4479fa3ac466cb17706cf12070afe1Axel Davy [D3DRS_POINTSIZE_MIN] = NINE_STATE_RASTERIZER | NINE_STATE_POINTSIZE_SHADER, 3698fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSPRITEENABLE] = NINE_STATE_RASTERIZER, 3699fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSCALEENABLE] = NINE_STATE_FF_OTHER, 3700fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSCALE_A] = NINE_STATE_FF_OTHER, 3701fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSCALE_B] = NINE_STATE_FF_OTHER, 3702fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POINTSCALE_C] = NINE_STATE_FF_OTHER, 37039cae3cdc890b2aa261d635667a5850929a0913f5Axel Davy [D3DRS_MULTISAMPLEANTIALIAS] = NINE_STATE_MULTISAMPLE, 3704fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_MULTISAMPLEMASK] = NINE_STATE_SAMPLE_MASK, 3705fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_PATCHEDGESTYLE] = NINE_STATE_UNHANDLED, 3706fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_DEBUGMONITORTOKEN] = NINE_STATE_UNHANDLED, 370789344a80fc4479fa3ac466cb17706cf12070afe1Axel Davy [D3DRS_POINTSIZE_MAX] = NINE_STATE_RASTERIZER | NINE_STATE_POINTSIZE_SHADER, 3708fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_INDEXEDVERTEXBLENDENABLE] = NINE_STATE_FF_OTHER, 3709fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_COLORWRITEENABLE] = NINE_STATE_BLEND, 3710fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_TWEENFACTOR] = NINE_STATE_FF_OTHER, 3711fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_BLENDOP] = NINE_STATE_BLEND, 3712fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_POSITIONDEGREE] = NINE_STATE_UNHANDLED, 3713fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_NORMALDEGREE] = NINE_STATE_UNHANDLED, 3714fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SCISSORTESTENABLE] = NINE_STATE_RASTERIZER, 3715fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SLOPESCALEDEPTHBIAS] = NINE_STATE_RASTERIZER, 3716fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ANTIALIASEDLINEENABLE] = NINE_STATE_RASTERIZER, 3717fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_MINTESSELLATIONLEVEL] = NINE_STATE_UNHANDLED, 3718fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_MAXTESSELLATIONLEVEL] = NINE_STATE_UNHANDLED, 3719fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ADAPTIVETESS_X] = NINE_STATE_UNHANDLED, 3720fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ADAPTIVETESS_Y] = NINE_STATE_UNHANDLED, 3721fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ADAPTIVETESS_Z] = NINE_STATE_UNHANDLED, 3722fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ADAPTIVETESS_W] = NINE_STATE_UNHANDLED, 3723fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_ENABLEADAPTIVETESSELLATION] = NINE_STATE_UNHANDLED, 3724fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_TWOSIDEDSTENCILMODE] = NINE_STATE_DSA, 3725fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CCW_STENCILFAIL] = NINE_STATE_DSA, 3726fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CCW_STENCILZFAIL] = NINE_STATE_DSA, 3727fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CCW_STENCILPASS] = NINE_STATE_DSA, 3728fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_CCW_STENCILFUNC] = NINE_STATE_DSA, 3729fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_COLORWRITEENABLE1] = NINE_STATE_BLEND, 3730fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_COLORWRITEENABLE2] = NINE_STATE_BLEND, 3731fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_COLORWRITEENABLE3] = NINE_STATE_BLEND, 3732fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_BLENDFACTOR] = NINE_STATE_BLEND_COLOR, 3733fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SRGBWRITEENABLE] = NINE_STATE_FB, 3734fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_DEPTHBIAS] = NINE_STATE_RASTERIZER, 3735fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP8] = NINE_STATE_UNHANDLED, /* cylwrap has to be done via GP */ 3736fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP9] = NINE_STATE_UNHANDLED, 3737fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP10] = NINE_STATE_UNHANDLED, 3738fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP11] = NINE_STATE_UNHANDLED, 3739fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP12] = NINE_STATE_UNHANDLED, 3740fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP13] = NINE_STATE_UNHANDLED, 3741fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP14] = NINE_STATE_UNHANDLED, 3742fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_WRAP15] = NINE_STATE_UNHANDLED, 3743fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SEPARATEALPHABLENDENABLE] = NINE_STATE_BLEND, 3744fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_SRCBLENDALPHA] = NINE_STATE_BLEND, 3745fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_DESTBLENDALPHA] = NINE_STATE_BLEND, 3746fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt [D3DRS_BLENDOPALPHA] = NINE_STATE_BLEND 3747fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}; 3748fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 374906285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy/* Misc */ 375006285530566ea3387b6eb3f8e1a0443132c3659bAxel Davy 3751fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim SindholtD3DMATRIX * 3752c5af96aebd2be165e29124c1e5d5bb3b7021bb30Axel Davynine_state_access_transform(struct nine_ff_state *ff_state, D3DTRANSFORMSTATETYPE t, 3753fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt boolean alloc) 3754fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 3755fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt static D3DMATRIX Identity = { .m[0] = { 1, 0, 0, 0 }, 3756fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt .m[1] = { 0, 1, 0, 0 }, 3757fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt .m[2] = { 0, 0, 1, 0 }, 3758fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt .m[3] = { 0, 0, 0, 1 } }; 3759fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt unsigned index; 3760fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 3761fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt switch (t) { 3762fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt case D3DTS_VIEW: index = 0; break; 3763fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt case D3DTS_PROJECTION: index = 1; break; 3764fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt case D3DTS_TEXTURE0: index = 2; break; 3765fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt case D3DTS_TEXTURE1: index = 3; break; 3766fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt case D3DTS_TEXTURE2: index = 4; break; 3767fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt case D3DTS_TEXTURE3: index = 5; break; 3768fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt case D3DTS_TEXTURE4: index = 6; break; 3769fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt case D3DTS_TEXTURE5: index = 7; break; 3770fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt case D3DTS_TEXTURE6: index = 8; break; 3771fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt case D3DTS_TEXTURE7: index = 9; break; 3772fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt default: 3773fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt if (!(t >= D3DTS_WORLDMATRIX(0) && t <= D3DTS_WORLDMATRIX(255))) 3774fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt return NULL; 3775fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt index = 10 + (t - D3DTS_WORLDMATRIX(0)); 3776fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt break; 3777fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 3778fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 3779c5af96aebd2be165e29124c1e5d5bb3b7021bb30Axel Davy if (index >= ff_state->num_transforms) { 3780fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt unsigned N = index + 1; 3781c5af96aebd2be165e29124c1e5d5bb3b7021bb30Axel Davy unsigned n = ff_state->num_transforms; 3782fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 3783fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt if (!alloc) 3784fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt return &Identity; 3785c5af96aebd2be165e29124c1e5d5bb3b7021bb30Axel Davy ff_state->transform = REALLOC(ff_state->transform, 3786fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt n * sizeof(D3DMATRIX), 3787fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt N * sizeof(D3DMATRIX)); 3788fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt for (; n < N; ++n) 3789c5af96aebd2be165e29124c1e5d5bb3b7021bb30Axel Davy ff_state->transform[n] = Identity; 3790c5af96aebd2be165e29124c1e5d5bb3b7021bb30Axel Davy ff_state->num_transforms = N; 3791fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 3792c5af96aebd2be165e29124c1e5d5bb3b7021bb30Axel Davy return &ff_state->transform[index]; 3793fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 3794fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 3795cbe370020e4e2b6293230bf0908f3f199c2468ebAxel DavyHRESULT 3796cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davynine_state_set_light(struct nine_ff_state *ff_state, DWORD Index, 3797cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy const D3DLIGHT9 *pLight) 3798cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy{ 3799cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy if (Index >= ff_state->num_lights) { 3800cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy unsigned n = ff_state->num_lights; 3801cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy unsigned N = Index + 1; 3802cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy 3803cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy ff_state->light = REALLOC(ff_state->light, n * sizeof(D3DLIGHT9), 3804cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy N * sizeof(D3DLIGHT9)); 3805cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy if (!ff_state->light) 3806cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy return E_OUTOFMEMORY; 3807cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy ff_state->num_lights = N; 3808cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy 3809cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy for (; n < Index; ++n) { 3810cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy memset(&ff_state->light[n], 0, sizeof(D3DLIGHT9)); 3811cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy ff_state->light[n].Type = (D3DLIGHTTYPE)NINED3DLIGHT_INVALID; 3812cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy } 3813cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy } 3814cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy ff_state->light[Index] = *pLight; 3815cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy 3816cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy if (pLight->Type == D3DLIGHT_SPOT && pLight->Theta >= pLight->Phi) { 3817cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy DBG("Warning: clamping D3DLIGHT9.Theta\n"); 3818cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy ff_state->light[Index].Theta = ff_state->light[Index].Phi; 3819cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy } 3820cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy return D3D_OK; 3821cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy} 3822cbe370020e4e2b6293230bf0908f3f199c2468ebAxel Davy 3823bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel DavyHRESULT 3824bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davynine_state_light_enable(struct nine_ff_state *ff_state, uint32_t *change_group, 3825bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy DWORD Index, BOOL Enable) 3826bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy{ 3827bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy unsigned i; 3828bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy 3829bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy user_assert(Index < ff_state->num_lights, D3DERR_INVALIDCALL); 3830bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy 3831bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy for (i = 0; i < ff_state->num_lights_active; ++i) { 3832bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy if (ff_state->active_light[i] == Index) 3833bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy break; 3834bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy } 3835bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy 3836bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy if (Enable) { 3837bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy if (i < ff_state->num_lights_active) 3838bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy return D3D_OK; 3839bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy /* XXX wine thinks this should still succeed: 3840bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy */ 3841bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy user_assert(i < NINE_MAX_LIGHTS_ACTIVE, D3DERR_INVALIDCALL); 3842bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy 3843bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy ff_state->active_light[i] = Index; 3844bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy ff_state->num_lights_active++; 3845bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy } else { 3846bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy if (i == ff_state->num_lights_active) 3847bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy return D3D_OK; 3848bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy --ff_state->num_lights_active; 3849bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy for (; i < ff_state->num_lights_active; ++i) 3850bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy ff_state->active_light[i] = ff_state->active_light[i + 1]; 3851bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy } 3852bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy 3853bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy *change_group |= NINE_STATE_FF_LIGHTING; 3854bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy 3855bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy return D3D_OK; 3856bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy} 3857bb62ea925a9aaebb053f0df14a9b7c995fdb6537Axel Davy 3858fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#define D3DRS_TO_STRING_CASE(n) case D3DRS_##n: return "D3DRS_"#n 3859fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtconst char *nine_d3drs_to_string(DWORD State) 3860fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 3861fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt switch (State) { 3862fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(ZENABLE); 3863fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(FILLMODE); 3864fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(SHADEMODE); 3865fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(ZWRITEENABLE); 3866fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(ALPHATESTENABLE); 3867fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(LASTPIXEL); 3868fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(SRCBLEND); 3869fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(DESTBLEND); 3870fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(CULLMODE); 3871fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(ZFUNC); 3872fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(ALPHAREF); 3873fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(ALPHAFUNC); 3874fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(DITHERENABLE); 3875fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(ALPHABLENDENABLE); 3876fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(FOGENABLE); 3877fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(SPECULARENABLE); 3878fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(FOGCOLOR); 3879fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(FOGTABLEMODE); 3880fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(FOGSTART); 3881fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(FOGEND); 3882fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(FOGDENSITY); 3883fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(RANGEFOGENABLE); 3884fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(STENCILENABLE); 3885fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(STENCILFAIL); 3886fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(STENCILZFAIL); 3887fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(STENCILPASS); 3888fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(STENCILFUNC); 3889fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(STENCILREF); 3890fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(STENCILMASK); 3891fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(STENCILWRITEMASK); 3892fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(TEXTUREFACTOR); 3893fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP0); 3894fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP1); 3895fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP2); 3896fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP3); 3897fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP4); 3898fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP5); 3899fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP6); 3900fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP7); 3901fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(CLIPPING); 3902fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(LIGHTING); 3903fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(AMBIENT); 3904fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(FOGVERTEXMODE); 3905fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(COLORVERTEX); 3906fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(LOCALVIEWER); 3907fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(NORMALIZENORMALS); 3908fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(DIFFUSEMATERIALSOURCE); 3909fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(SPECULARMATERIALSOURCE); 3910fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(AMBIENTMATERIALSOURCE); 3911fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(EMISSIVEMATERIALSOURCE); 3912fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(VERTEXBLEND); 3913fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(CLIPPLANEENABLE); 3914fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(POINTSIZE); 3915fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(POINTSIZE_MIN); 3916fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(POINTSPRITEENABLE); 3917fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(POINTSCALEENABLE); 3918fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(POINTSCALE_A); 3919fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(POINTSCALE_B); 3920fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(POINTSCALE_C); 3921fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(MULTISAMPLEANTIALIAS); 3922fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(MULTISAMPLEMASK); 3923fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(PATCHEDGESTYLE); 3924fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(DEBUGMONITORTOKEN); 3925fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(POINTSIZE_MAX); 3926fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(INDEXEDVERTEXBLENDENABLE); 3927fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(COLORWRITEENABLE); 3928fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(TWEENFACTOR); 3929fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(BLENDOP); 3930fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(POSITIONDEGREE); 3931fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(NORMALDEGREE); 3932fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(SCISSORTESTENABLE); 3933fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(SLOPESCALEDEPTHBIAS); 3934fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(ANTIALIASEDLINEENABLE); 3935fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(MINTESSELLATIONLEVEL); 3936fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(MAXTESSELLATIONLEVEL); 3937fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(ADAPTIVETESS_X); 3938fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(ADAPTIVETESS_Y); 3939fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(ADAPTIVETESS_Z); 3940fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(ADAPTIVETESS_W); 3941fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(ENABLEADAPTIVETESSELLATION); 3942fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(TWOSIDEDSTENCILMODE); 3943fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(CCW_STENCILFAIL); 3944fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(CCW_STENCILZFAIL); 3945fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(CCW_STENCILPASS); 3946fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(CCW_STENCILFUNC); 3947fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(COLORWRITEENABLE1); 3948fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(COLORWRITEENABLE2); 3949fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(COLORWRITEENABLE3); 3950fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(BLENDFACTOR); 3951fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(SRGBWRITEENABLE); 3952fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(DEPTHBIAS); 3953fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP8); 3954fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP9); 3955fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP10); 3956fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP11); 3957fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP12); 3958fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP13); 3959fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP14); 3960fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(WRAP15); 3961fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(SEPARATEALPHABLENDENABLE); 3962fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(SRCBLENDALPHA); 3963fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(DESTBLENDALPHA); 3964fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt D3DRS_TO_STRING_CASE(BLENDOPALPHA); 3965fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt default: 3966fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt return "(invalid)"; 3967fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 3968fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 3969