| /* |
| * Copyright 2008-2009 Henri Verbeet for CodeWeavers |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| * |
| */ |
| |
| #include "config.h" |
| #include "wine/port.h" |
| |
| #include "d3d10_private.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(d3d10); |
| |
| #define WINE_D3D10_TO_STR(x) case x: return #x |
| |
| const char *debug_d3d10_driver_type(D3D10_DRIVER_TYPE driver_type) |
| { |
| switch(driver_type) |
| { |
| WINE_D3D10_TO_STR(D3D10_DRIVER_TYPE_HARDWARE); |
| WINE_D3D10_TO_STR(D3D10_DRIVER_TYPE_REFERENCE); |
| WINE_D3D10_TO_STR(D3D10_DRIVER_TYPE_NULL); |
| WINE_D3D10_TO_STR(D3D10_DRIVER_TYPE_SOFTWARE); |
| WINE_D3D10_TO_STR(D3D10_DRIVER_TYPE_WARP); |
| default: |
| FIXME("Unrecognized D3D10_DRIVER_TYPE %#x\n", driver_type); |
| return "unrecognized"; |
| } |
| } |
| |
| const char *debug_d3d10_shader_variable_class(D3D10_SHADER_VARIABLE_CLASS c) |
| { |
| switch (c) |
| { |
| WINE_D3D10_TO_STR(D3D10_SVC_SCALAR); |
| WINE_D3D10_TO_STR(D3D10_SVC_VECTOR); |
| WINE_D3D10_TO_STR(D3D10_SVC_MATRIX_ROWS); |
| WINE_D3D10_TO_STR(D3D10_SVC_MATRIX_COLUMNS); |
| WINE_D3D10_TO_STR(D3D10_SVC_OBJECT); |
| WINE_D3D10_TO_STR(D3D10_SVC_STRUCT); |
| default: |
| FIXME("Unrecognized D3D10_SHADER_VARIABLE_CLASS %#x.\n", c); |
| return "unrecognized"; |
| } |
| } |
| |
| const char *debug_d3d10_shader_variable_type(D3D10_SHADER_VARIABLE_TYPE t) |
| { |
| switch (t) |
| { |
| WINE_D3D10_TO_STR(D3D10_SVT_VOID); |
| WINE_D3D10_TO_STR(D3D10_SVT_BOOL); |
| WINE_D3D10_TO_STR(D3D10_SVT_INT); |
| WINE_D3D10_TO_STR(D3D10_SVT_FLOAT); |
| WINE_D3D10_TO_STR(D3D10_SVT_STRING); |
| WINE_D3D10_TO_STR(D3D10_SVT_TEXTURE); |
| WINE_D3D10_TO_STR(D3D10_SVT_TEXTURE1D); |
| WINE_D3D10_TO_STR(D3D10_SVT_TEXTURE2D); |
| WINE_D3D10_TO_STR(D3D10_SVT_TEXTURE3D); |
| WINE_D3D10_TO_STR(D3D10_SVT_TEXTURECUBE); |
| WINE_D3D10_TO_STR(D3D10_SVT_SAMPLER); |
| WINE_D3D10_TO_STR(D3D10_SVT_PIXELSHADER); |
| WINE_D3D10_TO_STR(D3D10_SVT_VERTEXSHADER); |
| WINE_D3D10_TO_STR(D3D10_SVT_UINT); |
| WINE_D3D10_TO_STR(D3D10_SVT_UINT8); |
| WINE_D3D10_TO_STR(D3D10_SVT_GEOMETRYSHADER); |
| WINE_D3D10_TO_STR(D3D10_SVT_RASTERIZER); |
| WINE_D3D10_TO_STR(D3D10_SVT_DEPTHSTENCIL); |
| WINE_D3D10_TO_STR(D3D10_SVT_BLEND); |
| WINE_D3D10_TO_STR(D3D10_SVT_BUFFER); |
| WINE_D3D10_TO_STR(D3D10_SVT_CBUFFER); |
| WINE_D3D10_TO_STR(D3D10_SVT_TBUFFER); |
| WINE_D3D10_TO_STR(D3D10_SVT_TEXTURE1DARRAY); |
| WINE_D3D10_TO_STR(D3D10_SVT_TEXTURE2DARRAY); |
| WINE_D3D10_TO_STR(D3D10_SVT_RENDERTARGETVIEW); |
| WINE_D3D10_TO_STR(D3D10_SVT_DEPTHSTENCILVIEW); |
| WINE_D3D10_TO_STR(D3D10_SVT_TEXTURE2DMS); |
| WINE_D3D10_TO_STR(D3D10_SVT_TEXTURE2DMSARRAY); |
| WINE_D3D10_TO_STR(D3D10_SVT_TEXTURECUBEARRAY); |
| default: |
| FIXME("Unrecognized D3D10_SHADER_VARIABLE_TYPE %#x.\n", t); |
| return "unrecognized"; |
| } |
| } |
| |
| const char *debug_d3d10_device_state_types(D3D10_DEVICE_STATE_TYPES t) |
| { |
| switch (t) |
| { |
| WINE_D3D10_TO_STR(D3D10_DST_SO_BUFFERS); |
| WINE_D3D10_TO_STR(D3D10_DST_OM_RENDER_TARGETS); |
| WINE_D3D10_TO_STR(D3D10_DST_DEPTH_STENCIL_STATE); |
| WINE_D3D10_TO_STR(D3D10_DST_BLEND_STATE); |
| WINE_D3D10_TO_STR(D3D10_DST_VS); |
| WINE_D3D10_TO_STR(D3D10_DST_VS_SAMPLERS); |
| WINE_D3D10_TO_STR(D3D10_DST_VS_SHADER_RESOURCES); |
| WINE_D3D10_TO_STR(D3D10_DST_VS_CONSTANT_BUFFERS); |
| WINE_D3D10_TO_STR(D3D10_DST_GS); |
| WINE_D3D10_TO_STR(D3D10_DST_GS_SAMPLERS); |
| WINE_D3D10_TO_STR(D3D10_DST_GS_SHADER_RESOURCES); |
| WINE_D3D10_TO_STR(D3D10_DST_GS_CONSTANT_BUFFERS); |
| WINE_D3D10_TO_STR(D3D10_DST_PS); |
| WINE_D3D10_TO_STR(D3D10_DST_PS_SAMPLERS); |
| WINE_D3D10_TO_STR(D3D10_DST_PS_SHADER_RESOURCES); |
| WINE_D3D10_TO_STR(D3D10_DST_PS_CONSTANT_BUFFERS); |
| WINE_D3D10_TO_STR(D3D10_DST_IA_VERTEX_BUFFERS); |
| WINE_D3D10_TO_STR(D3D10_DST_IA_INDEX_BUFFER); |
| WINE_D3D10_TO_STR(D3D10_DST_IA_INPUT_LAYOUT); |
| WINE_D3D10_TO_STR(D3D10_DST_IA_PRIMITIVE_TOPOLOGY); |
| WINE_D3D10_TO_STR(D3D10_DST_RS_VIEWPORTS); |
| WINE_D3D10_TO_STR(D3D10_DST_RS_SCISSOR_RECTS); |
| WINE_D3D10_TO_STR(D3D10_DST_RS_RASTERIZER_STATE); |
| WINE_D3D10_TO_STR(D3D10_DST_PREDICATION); |
| default: |
| FIXME("Unrecognized D3D10_DEVICE_STATE_TYPES %#x.\n", t); |
| return "unrecognized"; |
| } |
| } |
| |
| #undef WINE_D3D10_TO_STR |
| |
| void skip_dword_unknown(const char *location, const char **ptr, unsigned int count) |
| { |
| unsigned int i; |
| DWORD d; |
| |
| FIXME("Skipping %u unknown DWORDs (%s):\n", count, location); |
| for (i = 0; i < count; ++i) |
| { |
| read_dword(ptr, &d); |
| FIXME("\t0x%08x\n", d); |
| } |
| } |
| |
| void write_dword_unknown(char **ptr, DWORD d) |
| { |
| FIXME("Writing unknown DWORD 0x%08x\n", d); |
| write_dword(ptr, d); |
| } |
| |
| HRESULT parse_dxbc(const char *data, SIZE_T data_size, |
| HRESULT (*chunk_handler)(const char *data, DWORD data_size, DWORD tag, void *ctx), void *ctx) |
| { |
| const char *ptr = data; |
| HRESULT hr = S_OK; |
| DWORD chunk_count; |
| DWORD total_size; |
| unsigned int i; |
| DWORD tag; |
| |
| if (!data) |
| { |
| WARN("No data supplied.\n"); |
| return E_FAIL; |
| } |
| |
| read_dword(&ptr, &tag); |
| TRACE("tag: %s.\n", debugstr_an((const char *)&tag, 4)); |
| |
| if (tag != TAG_DXBC) |
| { |
| WARN("Wrong tag.\n"); |
| return E_FAIL; |
| } |
| |
| /* checksum? */ |
| skip_dword_unknown("DXBC header", &ptr, 4); |
| |
| skip_dword_unknown("DXBC header", &ptr, 1); |
| |
| read_dword(&ptr, &total_size); |
| TRACE("total size: %#x\n", total_size); |
| |
| if (data_size != total_size) |
| { |
| WARN("Wrong size supplied.\n"); |
| return E_FAIL; |
| } |
| |
| read_dword(&ptr, &chunk_count); |
| TRACE("chunk count: %#x\n", chunk_count); |
| |
| for (i = 0; i < chunk_count; ++i) |
| { |
| DWORD chunk_tag, chunk_size; |
| const char *chunk_ptr; |
| DWORD chunk_offset; |
| |
| read_dword(&ptr, &chunk_offset); |
| TRACE("chunk %u at offset %#x\n", i, chunk_offset); |
| |
| if (chunk_offset >= data_size || !require_space(chunk_offset, 2, sizeof(DWORD), data_size)) |
| { |
| WARN("Invalid chunk offset %#x (data size %#lx).\n", chunk_offset, data_size); |
| return E_FAIL; |
| } |
| |
| chunk_ptr = data + chunk_offset; |
| |
| read_dword(&chunk_ptr, &chunk_tag); |
| read_dword(&chunk_ptr, &chunk_size); |
| |
| if (!require_space(chunk_ptr - data, 1, chunk_size, data_size)) |
| { |
| WARN("Invalid chunk size %#x (data size %#lx, chunk offset %#x).\n", chunk_size, data_size, chunk_offset); |
| return E_FAIL; |
| } |
| |
| hr = chunk_handler(chunk_ptr, chunk_size, chunk_tag, ctx); |
| if (FAILED(hr)) break; |
| } |
| |
| return hr; |
| } |