Commit 622422e6 authored by Jactry Zeng's avatar Jactry Zeng Committed by Alexandre Julliard

d3dcompiler: Implement D3DReadFileToBlob().

parent 4e4a1098
...@@ -466,9 +466,55 @@ HRESULT WINAPI D3DStripShader(const void *data, SIZE_T data_size, UINT flags, ID ...@@ -466,9 +466,55 @@ HRESULT WINAPI D3DStripShader(const void *data, SIZE_T data_size, UINT flags, ID
HRESULT WINAPI D3DReadFileToBlob(const WCHAR *filename, ID3DBlob **contents) HRESULT WINAPI D3DReadFileToBlob(const WCHAR *filename, ID3DBlob **contents)
{ {
FIXME("filename %s, contents %p\n", debugstr_w(filename), contents); struct d3dcompiler_blob *object;
SIZE_T data_size;
DWORD read_size;
HANDLE file;
HRESULT hr;
return E_NOTIMPL; TRACE("filename %s, contents %p.\n", debugstr_w(filename), contents);
file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (file == INVALID_HANDLE_VALUE)
return HRESULT_FROM_WIN32(GetLastError());
data_size = GetFileSize(file, NULL);
if (data_size == INVALID_FILE_SIZE)
{
CloseHandle(file);
return HRESULT_FROM_WIN32(GetLastError());
}
if (!(object = heap_alloc_zero(sizeof(*object))))
{
CloseHandle(file);
return E_OUTOFMEMORY;
}
if (FAILED(hr = d3dcompiler_blob_init(object, data_size)))
{
WARN("Failed to initialize blob, hr %#x.\n", hr);
CloseHandle(file);
heap_free(object);
return hr;
}
if (!ReadFile(file, object->data, data_size, &read_size, NULL) || (read_size != data_size))
{
WARN("Failed to read file contents.\n");
CloseHandle(file);
heap_free(object->data);
heap_free(object);
return E_FAIL;
}
CloseHandle(file);
object->size = read_size;
*contents = &object->ID3DBlob_iface;
TRACE("Returning ID3DBlob %p.\n", *contents);
return S_OK;
} }
HRESULT WINAPI D3DWriteBlobToFile(ID3DBlob* blob, const WCHAR *filename, BOOL overwrite) HRESULT WINAPI D3DWriteBlobToFile(ID3DBlob* blob, const WCHAR *filename, BOOL overwrite)
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "wine/debug.h" #include "wine/debug.h"
#include "wine/list.h" #include "wine/list.h"
#include "wine/rbtree.h" #include "wine/rbtree.h"
#include "wine/heap.h"
#define COBJMACROS #define COBJMACROS
#include "windef.h" #include "windef.h"
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
static HRESULT (WINAPI *pD3DCreateBlob)(SIZE_T, ID3DBlob **); static HRESULT (WINAPI *pD3DCreateBlob)(SIZE_T, ID3DBlob **);
static HRESULT (WINAPI *pD3DGetBlobPart)(const void *, SIZE_T, D3D_BLOB_PART, UINT, ID3DBlob **); static HRESULT (WINAPI *pD3DGetBlobPart)(const void *, SIZE_T, D3D_BLOB_PART, UINT, ID3DBlob **);
static HRESULT (WINAPI *pD3DReadFileToBlob)(const WCHAR *, ID3DBlob **);
static HRESULT (WINAPI *pD3DStripShader)(const void *, SIZE_T, UINT, ID3DBlob **); static HRESULT (WINAPI *pD3DStripShader)(const void *, SIZE_T, UINT, ID3DBlob **);
#define MAKE_TAG(ch0, ch1, ch2, ch3) \ #define MAKE_TAG(ch0, ch1, ch2, ch3) \
...@@ -740,7 +741,7 @@ static void test_get_blob_part2(void) ...@@ -740,7 +741,7 @@ static void test_get_blob_part2(void)
ok(!refcount, "ID3DBlob has %u references left\n", refcount); ok(!refcount, "ID3DBlob has %u references left\n", refcount);
} }
static BOOL load_d3dcompiler(void) static BOOL load_d3dcompiler_43(void)
{ {
HMODULE module; HMODULE module;
...@@ -752,15 +753,134 @@ static BOOL load_d3dcompiler(void) ...@@ -752,15 +753,134 @@ static BOOL load_d3dcompiler(void)
return TRUE; return TRUE;
} }
static BOOL load_d3dcompiler_47(void)
{
HMODULE module;
if (!(module = LoadLibraryA("d3dcompiler_47.dll")))
return FALSE;
pD3DReadFileToBlob = (void *)GetProcAddress(module, "D3DReadFileToBlob");
return TRUE;
}
static BOOL create_file(WCHAR *filename, const DWORD *data, DWORD data_size)
{
static WCHAR temp_dir[MAX_PATH];
DWORD written;
HANDLE file;
if (!temp_dir[0])
GetTempPathW(ARRAY_SIZE(temp_dir), temp_dir);
GetTempFileNameW(temp_dir, NULL, 0, filename);
file = CreateFileW(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
if (file == INVALID_HANDLE_VALUE)
return FALSE;
if (data)
{
WriteFile(file, data, data_size, &written, NULL);
if (written != data_size)
{
CloseHandle(file);
DeleteFileW(filename);
return FALSE;
}
}
CloseHandle(file);
return TRUE;
}
/* test_cso_data - fxc.exe file.hlsl /Fo file.cso */
static const DWORD test_cso_data[] =
{
#if 0
struct PSInput
{
float4 value : SV_POSITION;
};
PSInput main(float4 position : POSITION)
{
PSInput result;
result.value = position;
return result;
}
#endif
0xfffe0200, 0x0014fffe, 0x42415443, 0x0000001c, 0x00000023, 0xfffe0200, 0x00000000, 0x00000000,
0x00000100, 0x0000001c, 0x325f7376, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820,
0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x30312072, 0xab00312e, 0x0200001f, 0x80000000,
0x900f0000, 0x02000001, 0xc00f0000, 0x90e40000, 0x0000ffff
};
static void test_D3DReadFileToBlob(void)
{
WCHAR filename[MAX_PATH] = {'n','o','n','e','x','i','s','t','e','n','t',0};
ID3DBlob *blob = NULL;
SIZE_T data_size;
DWORD *data;
HRESULT hr;
hr = pD3DReadFileToBlob(filename, NULL);
ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Got unexpected hr %#x.\n", hr);
hr = pD3DReadFileToBlob(filename, &blob);
ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Got unexpected hr %#x.\n", hr);
if (0)
{
/* Crashes on Windows. */
create_file(filename, test_cso_data, ARRAY_SIZE(test_cso_data));
pD3DReadFileToBlob(filename, NULL);
DeleteFileW(filename);
}
if (!create_file(filename, NULL, 0))
{
win_skip("File creation failed.\n");
return;
}
hr = pD3DReadFileToBlob(filename, &blob);
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
data_size = ID3D10Blob_GetBufferSize(blob);
ok(!data_size, "Got unexpected data size.\n");
DeleteFileW(filename);
ID3D10Blob_Release(blob);
if (!create_file(filename, test_cso_data, ARRAY_SIZE(test_cso_data)))
{
win_skip("File creation failed.\n");
return;
}
hr = pD3DReadFileToBlob(filename, &blob);
ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
data_size = ID3D10Blob_GetBufferSize(blob);
ok(data_size == ARRAY_SIZE(test_cso_data), "Got unexpected data size.\n");
data = ID3D10Blob_GetBufferPointer(blob);
ok(!memcmp(data, test_cso_data, ARRAY_SIZE(test_cso_data)), "Got unexpected data.\n");
DeleteFileW(filename);
ID3D10Blob_Release(blob);
}
START_TEST(blob) START_TEST(blob)
{ {
if (!load_d3dcompiler()) if (load_d3dcompiler_43())
{
test_create_blob();
test_get_blob_part();
test_get_blob_part2();
}
else
{ {
win_skip("Could not load d3dcompiler_43.dll\n"); win_skip("Could not load d3dcompiler_43.dll\n");
return;
} }
test_create_blob(); if (load_d3dcompiler_47())
test_get_blob_part(); {
test_get_blob_part2(); test_D3DReadFileToBlob();
}
else
{
win_skip("Could not load d3dcompiler_47.dll.\n");
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment