HRESULT NinePixelShader9_ctor( struct NinePixelShader9 *This, struct NineUnknownParams *pParams, const DWORD *pFunction, void *cso ) { struct NineDevice9 *device; struct nine_shader_info info; struct pipe_context *pipe; HRESULT hr; DBG("This=%p pParams=%p pFunction=%p cso=%p\n", This, pParams, pFunction, cso); hr = NineUnknown_ctor(&This->base, pParams); if (FAILED(hr)) return hr; if (cso) { This->ff_cso = cso; return D3D_OK; } device = This->base.device; info.type = PIPE_SHADER_FRAGMENT; info.byte_code = pFunction; info.const_i_base = NINE_CONST_I_BASE(device->max_ps_const_f) / 16; info.const_b_base = NINE_CONST_B_BASE(device->max_ps_const_f) / 16; info.sampler_mask_shadow = 0x0; info.sampler_ps1xtypes = 0x0; info.fog_enable = 0; info.projected = 0; info.process_vertices = false; pipe = nine_context_get_pipe_acquire(device); hr = nine_translate_shader(device, &info, pipe); nine_context_get_pipe_release(device); if (FAILED(hr)) return hr; This->byte_code.version = info.version; This->byte_code.tokens = mem_dup(pFunction, info.byte_size); if (!This->byte_code.tokens) return E_OUTOFMEMORY; This->byte_code.size = info.byte_size; This->variant.cso = info.cso; This->last_cso = info.cso; This->last_key = 0; This->sampler_mask = info.sampler_mask; This->rt_mask = info.rt_mask; This->const_used_size = info.const_used_size; This->bumpenvmat_needed = info.bumpenvmat_needed; /* no constant relative addressing for ps */ assert(info.lconstf.data == NULL); assert(info.lconstf.ranges == NULL); return D3D_OK; }
HRESULT NinePixelShader9_ctor( struct NinePixelShader9 *This, struct NineUnknownParams *pParams, const DWORD *pFunction, void *cso ) { struct NineDevice9 *device; struct nine_shader_info info; HRESULT hr; hr = NineUnknown_ctor(&This->base, pParams); if (FAILED(hr)) return hr; if (cso) { This->variant.cso = cso; return D3D_OK; } device = This->base.device; info.type = PIPE_SHADER_FRAGMENT; info.byte_code = pFunction; info.const_i_base = NINE_CONST_I_BASE(device->max_ps_const_f) / 16; info.const_b_base = NINE_CONST_B_BASE(device->max_ps_const_f) / 16; info.sampler_mask_shadow = 0x0; info.sampler_ps1xtypes = 0x0; hr = nine_translate_shader(device, &info); if (FAILED(hr)) return hr; This->byte_code.version = info.version; This->byte_code.tokens = mem_dup(pFunction, info.byte_size); if (!This->byte_code.tokens) return E_OUTOFMEMORY; This->byte_code.size = info.byte_size; This->variant.cso = info.cso; This->sampler_mask = info.sampler_mask; This->rt_mask = info.rt_mask; This->const_used_size = info.const_used_size; if (info.const_used_size == ~0) This->const_used_size = NINE_CONSTBUF_SIZE(device->max_ps_const_f); This->lconstf = info.lconstf; return D3D_OK; }
void * NinePixelShader9_GetVariant( struct NinePixelShader9 *This ) { /* GetVariant is called from nine_context, thus we can * get pipe directly */ struct pipe_context *pipe = This->base.device->context.pipe; void *cso; uint64_t key; key = This->next_key; if (key == This->last_key) return This->last_cso; cso = nine_shader_variant_get(&This->variant, key); if (!cso) { struct NineDevice9 *device = This->base.device; struct nine_shader_info info; HRESULT hr; info.type = PIPE_SHADER_FRAGMENT; info.const_i_base = NINE_CONST_I_BASE(device->max_ps_const_f) / 16; info.const_b_base = NINE_CONST_B_BASE(device->max_ps_const_f) / 16; info.byte_code = This->byte_code.tokens; info.sampler_mask_shadow = key & 0xffff; info.sampler_ps1xtypes = key; info.fog_enable = device->context.rs[D3DRS_FOGENABLE]; info.fog_mode = device->context.rs[D3DRS_FOGTABLEMODE]; info.force_color_in_centroid = key >> 34 & 1; info.projected = (key >> 48) & 0xffff; info.process_vertices = false; hr = nine_translate_shader(This->base.device, &info, pipe); if (FAILED(hr)) return NULL; nine_shader_variant_add(&This->variant, key, info.cso); cso = info.cso; } This->last_key = key; This->last_cso = cso; return cso; }
void * NineVertexShader9_GetVariant( struct NineVertexShader9 *This ) { void *cso; uint64_t key; key = This->next_key; if (key == This->last_key) return This->last_cso; cso = nine_shader_variant_get(&This->variant, key); if (!cso) { struct NineDevice9 *device = This->base.device; struct nine_shader_info info; HRESULT hr; info.type = PIPE_SHADER_VERTEX; info.const_i_base = NINE_CONST_I_BASE(device->max_vs_const_f) / 16; info.const_b_base = NINE_CONST_B_BASE(device->max_vs_const_f) / 16; info.byte_code = This->byte_code.tokens; info.sampler_mask_shadow = key & 0xf; info.fog_enable = device->state.rs[D3DRS_FOGENABLE]; info.point_size_min = asfloat(device->state.rs[D3DRS_POINTSIZE_MIN]); info.point_size_max = asfloat(device->state.rs[D3DRS_POINTSIZE_MAX]); info.swvp_on = device->swvp; info.process_vertices = false; hr = nine_translate_shader(This->base.device, &info); if (FAILED(hr)) return NULL; nine_shader_variant_add(&This->variant, key, info.cso); cso = info.cso; } This->last_key = key; This->last_cso = cso; return cso; }
HRESULT NineVertexShader9_ctor( struct NineVertexShader9 *This, struct NineUnknownParams *pParams, const DWORD *pFunction, void *cso ) { struct NineDevice9 *device; struct nine_shader_info info; HRESULT hr; unsigned i; DBG("This=%p pParams=%p pFunction=%p cso=%p\n", This, pParams, pFunction, cso); hr = NineUnknown_ctor(&This->base, pParams); if (FAILED(hr)) return hr; if (cso) { This->ff_cso = cso; return D3D_OK; } device = This->base.device; info.type = PIPE_SHADER_VERTEX; info.byte_code = pFunction; info.const_i_base = NINE_CONST_I_BASE(device->max_vs_const_f) / 16; info.const_b_base = NINE_CONST_B_BASE(device->max_vs_const_f) / 16; info.sampler_mask_shadow = 0x0; info.sampler_ps1xtypes = 0x0; info.fog_enable = 0; info.point_size_min = 0; info.point_size_max = 0; info.swvp_on = !!(device->params.BehaviorFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING); info.process_vertices = false; hr = nine_translate_shader(device, &info); if (hr == D3DERR_INVALIDCALL && (device->params.BehaviorFlags & D3DCREATE_MIXED_VERTEXPROCESSING)) { /* Retry with a swvp shader. It will require swvp to be on. */ info.swvp_on = true; hr = nine_translate_shader(device, &info); } if (hr == D3DERR_INVALIDCALL) ERR("Encountered buggy shader\n"); if (FAILED(hr)) return hr; This->byte_code.version = info.version; This->swvp_only = info.swvp_on; This->byte_code.tokens = mem_dup(pFunction, info.byte_size); if (!This->byte_code.tokens) return E_OUTOFMEMORY; This->byte_code.size = info.byte_size; This->variant.cso = info.cso; This->last_cso = info.cso; This->last_key = (uint32_t) (info.swvp_on << 9); This->const_used_size = info.const_used_size; This->lconstf = info.lconstf; This->sampler_mask = info.sampler_mask; This->position_t = info.position_t; This->point_size = info.point_size; for (i = 0; i < info.num_inputs && i < ARRAY_SIZE(This->input_map); ++i) This->input_map[i].ndecl = info.input_map[i]; This->num_inputs = i; return D3D_OK; }