Lines Matching refs:shader

227         ERR("Failed to allocate shader buffer memory.\n");
249 ERR("The buffer allocated for the shader program string "
287 static void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device,
290 shader->ref = 1;
291 shader->device = (IWineD3DDevice *)device;
292 shader->parent = parent;
293 shader->parent_ops = parent_ops;
294 list_init(&shader->linked_programs);
295 list_add_head(&device->shaders, &shader->shader_list_entry);
337 static void shader_record_register_usage(IWineD3DBaseShaderImpl *shader, struct shader_reg_maps *reg_maps,
362 ((IWineD3DPixelShaderImpl *)shader)->input_reg_used[i] = TRUE;
367 ((IWineD3DPixelShaderImpl *)shader)->input_reg_used[reg->idx] = TRUE;
390 if (reg->idx < ((IWineD3DVertexShaderImpl *)shader)->min_rel_offset)
392 ((IWineD3DVertexShaderImpl *)shader)->min_rel_offset = reg->idx;
394 if (reg->idx > ((IWineD3DVertexShaderImpl *)shader)->max_rel_offset)
396 ((IWineD3DVertexShaderImpl *)shader)->max_rel_offset = reg->idx;
450 IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
452 void *fe_data = shader->baseShader.frontend_data;
461 shader_delete_constant_list(&shader->baseShader.constantsF);
462 shader_delete_constant_list(&shader->baseShader.constantsB);
463 shader_delete_constant_list(&shader->baseShader.constantsI);
513 /* Vertex shader: mark 3.0 output registers used, save token. */
544 /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */
558 list_add_head(&shader->baseShader.constantsF, &lconst->entry);
574 list_add_head(&shader->baseShader.constantsI, &lconst->entry);
591 list_add_head(&shader->baseShader.constantsB, &lconst->entry);
594 /* If there's a loop in the shader. */
648 shader_record_register_usage(shader, reg_maps, &dst_param.reg, shader_version.type);
661 IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)shader;
666 * COLOROUT 0. If we know this in advance, the ARB shader backend can skip
680 /* Also drop the MOV marker if the source register is overwritten prior to the shader
744 shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type);
748 shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type);
754 IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)shader;
767 shader->baseShader.functionLength = ((const char *)ptr - (const char *)byte_code);
1093 /* Shared code in order to generate the bulk of the shader string.
1098 IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
1099 IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
1100 const struct wined3d_shader_frontend *fe = shader->baseShader.frontend;
1101 void *fe_data = shader->baseShader.frontend_data;
1113 ctx.shader = iface;
1122 shader->baseShader.parse_state.current_row = 0;
1230 FIXME("Unhandled shader type %#x.\n", shader_version.type);
1398 IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
1400 ((IWineD3DDeviceImpl *)shader->baseShader.device)->shader_backend->shader_destroy(iface);
1401 HeapFree(GetProcessHeap(), 0, shader->baseShader.reg_maps.constf);
1402 HeapFree(GetProcessHeap(), 0, shader->baseShader.function);
1403 shader_delete_constant_list(&shader->baseShader.constantsF);
1404 shader_delete_constant_list(&shader->baseShader.constantsB);
1405 shader_delete_constant_list(&shader->baseShader.constantsI);
1406 list_remove(&shader->baseShader.shader_list_entry);
1408 if (shader->baseShader.frontend && shader->baseShader.frontend_data)
1410 shader->baseShader.frontend->shader_free(shader->baseShader.frontend_data);
1429 /* Set the shader caps to 0 for the none shader backend */
1471 static void shader_get_parent(IWineD3DBaseShaderImpl *shader, IUnknown **parent)
1473 *parent = shader->baseShader.parent;
1475 TRACE("shader %p, returning %p.\n", shader, *parent);
1478 static HRESULT shader_get_function(IWineD3DBaseShaderImpl *shader, void *data, UINT *data_size)
1482 *data_size = shader->baseShader.functionLength;
1486 if (*data_size < shader->baseShader.functionLength)
1494 memcpy(data, shader->baseShader.function, shader->baseShader.functionLength);
1499 static HRESULT shader_set_function(IWineD3DBaseShaderImpl *shader, const DWORD *byte_code,
1502 struct shader_reg_maps *reg_maps = &shader->baseShader.reg_maps;
1506 TRACE("shader %p, byte_code %p, output_signature %p, float_const_count %u.\n",
1507 shader, byte_code, output_signature, float_const_count);
1512 FIXME("Unable to find frontend for shader.\n");
1515 shader->baseShader.frontend = fe;
1516 shader->baseShader.frontend_data = fe->shader_init(byte_code, output_signature);
1517 if (!shader->baseShader.frontend_data)
1523 /* First pass: trace shader. */
1524 if (TRACE_ON(d3d_shader)) shader_trace_init(fe, shader->baseShader.frontend_data, byte_code);
1527 list_init(&shader->baseShader.constantsF);
1528 list_init(&shader->baseShader.constantsB);
1529 list_init(&shader->baseShader.constantsI);
1532 hr = shader_get_registers_used((IWineD3DBaseShader *)shader, fe,
1533 reg_maps, shader->baseShader.input_signature, shader->baseShader.output_signature,
1537 shader->baseShader.function = HeapAlloc(GetProcessHeap(), 0, shader->baseShader.functionLength);
1538 if (!shader->baseShader.function) return E_OUTOFMEMORY;
1539 memcpy(shader->baseShader.function, byte_code, shader->baseShader.functionLength);
1566 IWineD3DVertexShaderImpl *shader = (IWineD3DVertexShaderImpl *)iface;
1567 ULONG refcount = InterlockedIncrement(&shader->baseShader.ref);
1569 TRACE("%p increasing refcount to %u.\n", shader, refcount);
1580 IWineD3DVertexShaderImpl *shader = (IWineD3DVertexShaderImpl *)iface;
1581 ULONG refcount = InterlockedDecrement(&shader->baseShader.ref);
1583 TRACE("%p decreasing refcount to %u.\n", shader, refcount);
1588 shader_chache_put(&((IWineD3DDeviceImpl*)shader->baseShader.device)->vshaderCache, (IWineD3DBaseShaderImpl*)shader);
1591 shader->baseShader.parent_ops->wined3d_object_destroyed(shader->baseShader.parent);
1592 HeapFree(GetProcessHeap(), 0, shader);
1619 IWineD3DVertexShaderImpl *shader =(IWineD3DVertexShaderImpl *)iface;
1620 IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
1639 list_add_head(&shader->baseShader.constantsF, &lconst->entry);
1659 void find_vs_compile_args(IWineD3DVertexShaderImpl *shader,
1665 args->swizzle_map = ((IWineD3DDeviceImpl *)shader->baseShader.device)->strided_streams.swizzle_map;
1680 IWineD3DVertexShaderImpl *shader = (IWineD3DVertexShaderImpl *)iface;
1681 WORD map = shader->baseShader.reg_maps.input_registers;
1688 if (match_usage(shader->attributes[i].usage,
1689 shader->attributes[i].usage_idx, usage_req, usage_idx_req))
1698 static void vertexshader_set_limits(IWineD3DVertexShaderImpl *shader)
1700 DWORD shader_version = WINED3D_SHADER_VERSION(shader->baseShader.reg_maps.shader_version.major,
1701 shader->baseShader.reg_maps.shader_version.minor);
1702 IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
1704 shader->baseShader.limits.texcoord = 0;
1705 shader->baseShader.limits.attributes = 16;
1706 shader->baseShader.limits.packed_input = 0;
1712 shader->baseShader.limits.temporary = 12;
1713 shader->baseShader.limits.constant_bool = 0;
1714 shader->baseShader.limits.constant_int = 0;
1715 shader->baseShader.limits.address = 1;
1716 shader->baseShader.limits.packed_output = 0;
1717 shader->baseShader.limits.sampler = 0;
1718 shader->baseShader.limits.label = 0;
1720 * a vs_1_1 shader is used on a vs_3_0 capable card that has 256
1722 shader->baseShader.limits.constant_float = min(256, device->d3d_vshader_constantF);
1727 shader->baseShader.limits.temporary = 12;
1728 shader->baseShader.limits.constant_bool = 16;
1729 shader->baseShader.limits.constant_int = 16;
1730 shader->baseShader.limits.address = 1;
1731 shader->baseShader.limits.packed_output = 0;
1732 shader->baseShader.limits.sampler = 0;
1733 shader->baseShader.limits.label = 16;
1734 shader->baseShader.limits.constant_float = min(256, device->d3d_vshader_constantF);
1738 FIXME("Using 3.0 limits for 4.0 shader.\n");
1742 shader->baseShader.limits.temporary = 32;
1743 shader->baseShader.limits.constant_bool = 32;
1744 shader->baseShader.limits.constant_int = 32;
1745 shader->baseShader.limits.address = 1;
1746 shader->baseShader.limits.packed_output = 12;
1747 shader->baseShader.limits.sampler = 4;
1748 shader->baseShader.limits.label = 16; /* FIXME: 2048 */
1754 shader->baseShader.limits.constant_float = min(256, device->d3d_vshader_constantF);
1758 shader->baseShader.limits.temporary = 12;
1759 shader->baseShader.limits.constant_bool = 16;
1760 shader->baseShader.limits.constant_int = 16;
1761 shader->baseShader.limits.address = 1;
1762 shader->baseShader.limits.packed_output = 0;
1763 shader->baseShader.limits.sampler = 0;
1764 shader->baseShader.limits.label = 16;
1765 shader->baseShader.limits.constant_float = min(256, device->d3d_vshader_constantF);
1766 FIXME("Unrecognized vertex shader version \"%u.%u\".\n",
1767 shader->baseShader.reg_maps.shader_version.major,
1768 shader->baseShader.reg_maps.shader_version.minor);
1772 HRESULT vertexshader_init(IWineD3DVertexShaderImpl *shader, IWineD3DDeviceImpl *device,
1777 struct shader_reg_maps *reg_maps = &shader->baseShader.reg_maps;
1784 shader->lpVtbl = &IWineD3DVertexShader_Vtbl;
1785 shader_init(&shader->baseShader, device, parent, parent_ops);
1787 hr = shader_set_function((IWineD3DBaseShaderImpl *)shader, byte_code,
1792 shader_cleanup((IWineD3DBaseShader *)shader);
1796 map = shader->baseShader.reg_maps.input_registers;
1799 if (!(map & 1) || !shader->baseShader.input_signature[i].semantic_name) continue;
1801 shader->attributes[i].usage =
1802 shader_usage_from_semantic_name(shader->baseShader.input_signature[i].semantic_name);
1803 shader->attributes[i].usage_idx = shader->baseShader.input_signature[i].semantic_idx;
1812 shader->baseShader.output_signature[e->register_idx] = *e;
1816 vertexshader_set_limits(shader);
1820 && shader->min_rel_offset <= shader->max_rel_offset)
1822 if (shader->max_rel_offset - shader->min_rel_offset > 127)
1826 FIXME("Min: %d, Max: %d.\n", shader->min_rel_offset, shader->max_rel_offset);
1828 else if (shader->max_rel_offset - shader->min_rel_offset > 63)
1830 shader->rel_offset = shader->min_rel_offset + 63;
1832 else if (shader->max_rel_offset > 63)
1834 shader->rel_offset = shader->min_rel_offset;
1838 shader->rel_offset = 0;
1842 shader->baseShader.load_local_constsF = shader->baseShader.reg_maps.usesrelconstF
1843 && !list_empty(&shader->baseShader.constantsF);
1871 struct wined3d_geometryshader *shader = (struct wined3d_geometryshader *)iface;
1872 ULONG refcount = InterlockedIncrement(&shader->base_shader.ref);
1874 TRACE("%p increasing refcount to %u.\n", shader, refcount);
1881 struct wined3d_geometryshader *shader = (struct wined3d_geometryshader *)iface;
1882 ULONG refcount = InterlockedDecrement(&shader->base_shader.ref);
1884 TRACE("%p decreasing refcount to %u.\n", shader, refcount);
1889 shader->base_shader.parent_ops->wined3d_object_destroyed(shader->base_shader.parent);
1890 HeapFree(GetProcessHeap(), 0, shader);
1924 HRESULT geometryshader_init(struct wined3d_geometryshader *shader, IWineD3DDeviceImpl *device,
1930 shader->vtbl = &wined3d_geometryshader_vtbl;
1931 shader_init(&shader->base_shader, device, parent, parent_ops);
1933 hr = shader_set_function((IWineD3DBaseShaderImpl *)shader, byte_code, output_signature, 0);
1937 shader_cleanup((IWineD3DBaseShader *)shader);
1941 shader->base_shader.load_local_constsF = FALSE;
1968 IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)iface;
1969 ULONG refcount = InterlockedIncrement(&shader->baseShader.ref);
1971 TRACE("%p increasing refcount to %u.\n", shader, refcount);
1978 IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)iface;
1979 ULONG refcount = InterlockedDecrement(&shader->baseShader.ref);
1981 TRACE("%p decreasing refcount to %u.\n", shader, refcount);
1986 shader_chache_put(&((IWineD3DDeviceImpl*)shader->baseShader.device)->pshaderCache, (IWineD3DBaseShaderImpl*)shader);
1989 shader->baseShader.parent_ops->wined3d_object_destroyed(shader->baseShader.parent);
1990 HeapFree(GetProcessHeap(), 0, shader);
2025 void find_ps_compile_args(IWineD3DPixelShaderImpl *shader,
2036 if (shader->baseShader.reg_maps.shader_version.major==1
2037 && shader->baseShader.reg_maps.shader_version.minor<=3)
2053 if (!shader->baseShader.reg_maps.sampler_type[i]) continue;
2073 if (shader->baseShader.reg_maps.shader_version.major >= 3)
2075 if (((IWineD3DDeviceImpl *)shader->baseShader.device)->strided_streams.position_transformed)
2097 if (((IWineD3DDeviceImpl *)shader->baseShader.device)->strided_streams.position_transformed
2125 static void pixelshader_set_limits(IWineD3DPixelShaderImpl *shader)
2127 DWORD shader_version = WINED3D_SHADER_VERSION(shader->baseShader.reg_maps.shader_version.major,
2128 shader->baseShader.reg_maps.shader_version.minor);
2130 shader->baseShader.limits.attributes = 0;
2131 shader->baseShader.limits.address = 0;
2132 shader->baseShader.limits.packed_output = 0;
2140 shader->baseShader.limits.temporary = 2;
2141 shader->baseShader.limits.constant_float = 8;
2142 shader->baseShader.limits.constant_int = 0;
2143 shader->baseShader.limits.constant_bool = 0;
2144 shader->baseShader.limits.texcoord = 4;
2145 shader->baseShader.limits.sampler = 4;
2146 shader->baseShader.limits.packed_input = 0;
2147 shader->baseShader.limits.label = 0;
2151 shader->baseShader.limits.temporary = 6;
2152 shader->baseShader.limits.constant_float = 8;
2153 shader->baseShader.limits.constant_int = 0;
2154 shader->baseShader.limits.constant_bool = 0;
2155 shader->baseShader.limits.texcoord = 6;
2156 shader->baseShader.limits.sampler = 6;
2157 shader->baseShader.limits.packed_input = 0;
2158 shader->baseShader.limits.label = 0;
2163 shader->baseShader.limits.temporary = 32;
2164 shader->baseShader.limits.constant_float = 32;
2165 shader->baseShader.limits.constant_int = 16;
2166 shader->baseShader.limits.constant_bool = 16;
2167 shader->baseShader.limits.texcoord = 8;
2168 shader->baseShader.limits.sampler = 16;
2169 shader->baseShader.limits.packed_input = 0;
2173 shader->baseShader.limits.temporary = 32;
2174 shader->baseShader.limits.constant_float = 32;
2175 shader->baseShader.limits.constant_int = 16;
2176 shader->baseShader.limits.constant_bool = 16;
2177 shader->baseShader.limits.texcoord = 8;
2178 shader->baseShader.limits.sampler = 16;
2179 shader->baseShader.limits.packed_input = 0;
2180 shader->baseShader.limits.label = 16;
2184 FIXME("Using 3.0 limits for 4.0 shader.\n");
2188 shader->baseShader.limits.temporary = 32;
2189 shader->baseShader.limits.constant_float = 224;
2190 shader->baseShader.limits.constant_int = 16;
2191 shader->baseShader.limits.constant_bool = 16;
2192 shader->baseShader.limits.texcoord = 0;
2193 shader->baseShader.limits.sampler = 16;
2194 shader->baseShader.limits.packed_input = 12;
2195 shader->baseShader.limits.label = 16; /* FIXME: 2048 */
2199 shader->baseShader.limits.temporary = 32;
2200 shader->baseShader.limits.constant_float = 32;
2201 shader->baseShader.limits.constant_int = 16;
2202 shader->baseShader.limits.constant_bool = 16;
2203 shader->baseShader.limits.texcoord = 8;
2204 shader->baseShader.limits.sampler = 16;
2205 shader->baseShader.limits.packed_input = 0;
2206 shader->baseShader.limits.label = 0;
2207 FIXME("Unrecognized pixel shader version %u.%u\n",
2208 shader->baseShader.reg_maps.shader_version.major,
2209 shader->baseShader.reg_maps.shader_version.minor);
2213 HRESULT pixelshader_init(IWineD3DPixelShaderImpl *shader, IWineD3DDeviceImpl *device,
2223 shader->lpVtbl = &IWineD3DPixelShader_Vtbl;
2224 shader_init(&shader->baseShader, device, parent, parent_ops);
2226 hr = shader_set_function((IWineD3DBaseShaderImpl *)shader, byte_code,
2231 shader_cleanup((IWineD3DBaseShader *)shader);
2235 pixelshader_set_limits(shader);
2239 if (shader->input_reg_used[i])
2261 shader->input_reg_map[i] = i;
2264 shader->declared_in_count = highest_reg_used + 1;
2268 shader->declared_in_count = 0;
2271 if (shader->input_reg_used[i]) shader->input_reg_map[i] = shader->declared_in_count++;
2272 else shader->input_reg_map[i] = ~0U;
2276 shader->baseShader.load_local_constsF = FALSE;
2328 static void shader_reinit(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device,
2331 shader->ref = 1;
2332 shader->device = (IWineD3DDevice *)device;
2333 shader->parent = parent;
2334 shader->parent_ops = parent_ops;
2339 if (&tstShader->baseShader == shader)
2342 ERR("shader not in list!");
2438 /* we can not do a IWineD3DBaseShader_Release here since this would result in putting a shader to the cache */