[D3D8][D3D9][DDRAW][WINED3D] Sync with Wine Staging 3.3. CORE-14434
[reactos.git] / dll / directx / wine / d3d8 / d3d8_main.c
index 144817a..0e68630 100644 (file)
  *
  */
 
+#include "config.h"
+#include "initguid.h"
 #include "d3d8_private.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(d3d8);
 
 HRESULT WINAPI D3D8GetSWInfo(void) {
     FIXME("(void): stub\n");
@@ -36,13 +41,13 @@ IDirect3D8 * WINAPI DECLSPEC_HOTPATCH Direct3DCreate8(UINT sdk_version)
 
     TRACE("sdk_version %#x.\n", sdk_version);
 
-    if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
+    if (!(object = heap_alloc_zero(sizeof(*object))))
         return NULL;
 
     if (!d3d8_init(object))
     {
         WARN("Failed to initialize d3d8.\n");
-        HeapFree(GetProcessHeap(), 0, object);
+        heap_free(object);
         return NULL;
     }
 
@@ -53,75 +58,73 @@ IDirect3D8 * WINAPI DECLSPEC_HOTPATCH Direct3DCreate8(UINT sdk_version)
 
 /***********************************************************************
  *              ValidateVertexShader (D3D8.@)
- *
- * I've seen reserved1 and reserved2 always passed as 0's
- * bool seems always passed as 0 or 1, but other values work as well...
- * toto       result?
  */
-HRESULT WINAPI ValidateVertexShader(DWORD* vertexshader, DWORD* reserved1, DWORD* reserved2, BOOL bool, DWORD* toto)
+HRESULT WINAPI ValidateVertexShader(DWORD *vertexshader, DWORD *reserved1, DWORD *reserved2,
+                                    BOOL return_error, char **errors)
 {
-  HRESULT ret;
-  static BOOL warned;
-
-  if (TRACE_ON(d3d8) || !warned) {
-      FIXME("(%p %p %p %d %p): stub\n", vertexshader, reserved1, reserved2, bool, toto);
-      warned = TRUE;
-  }
+    const char *message = "";
+    HRESULT hr = E_FAIL;
 
-  if (!vertexshader)
-      return E_FAIL;
+    TRACE("(%p %p %p %d %p): semi-stub\n", vertexshader, reserved1, reserved2, return_error, errors);
 
-  if (reserved1 || reserved2)
-      return E_FAIL;
+    if (!vertexshader)
+    {
+        message = "(Global Validation Error) Version Token: Code pointer cannot be NULL.\n";
+        goto done;
+    }
 
-  switch(*vertexshader) {
+    switch (*vertexshader)
+    {
         case 0xFFFE0101:
         case 0xFFFE0100:
-            ret=S_OK;
+            hr = S_OK;
             break;
+
         default:
             WARN("Invalid shader version token %#x.\n", *vertexshader);
-            ret=E_FAIL;
-        }
+            message = "(Global Validation Error) Version Token: Unsupported vertex shader version.\n";
+    }
 
-  return ret;
+done:
+    if (!return_error) message = "";
+    if (errors && (*errors = HeapAlloc(GetProcessHeap(), 0, strlen(message) + 1)))
+        strcpy(*errors, message);
+
+    return hr;
 }
 
 /***********************************************************************
  *              ValidatePixelShader (D3D8.@)
- *
- * PARAMS
- * toto       result?
  */
-HRESULT WINAPI ValidatePixelShader(DWORD* pixelshader, DWORD* reserved1, BOOL bool, DWORD* toto)
+HRESULT WINAPI ValidatePixelShader(DWORD *pixelshader, DWORD *reserved1, BOOL return_error, char **errors)
 {
-  HRESULT ret;
-  static BOOL warned;
-
-  if (TRACE_ON(d3d8) || !warned) {
-      FIXME("(%p %p %d %p): stub\n", pixelshader, reserved1, bool, toto);
-      warned = TRUE;
-  }
+    const char *message = "";
+    HRESULT hr = E_FAIL;
 
-  if (!pixelshader)
-      return E_FAIL;
+    TRACE("(%p %p %d %p): semi-stub\n", pixelshader, reserved1, return_error, errors);
 
-  if (reserved1)
-      return E_FAIL;
+    if (!pixelshader)
+        return E_FAIL;
 
-  switch(*pixelshader) {
+   switch (*pixelshader)
+   {
         case 0xFFFF0100:
         case 0xFFFF0101:
         case 0xFFFF0102:
         case 0xFFFF0103:
         case 0xFFFF0104:
-            ret=S_OK;
+            hr = S_OK;
             break;
         default:
             WARN("Invalid shader version token %#x.\n", *pixelshader);
-            ret=E_FAIL;
-        }
-  return ret;
+            message = "(Global Validation Error) Version Token: Unsupported pixel shader version.\n";
+    }
+
+    if (!return_error) message = "";
+    if (errors && (*errors = HeapAlloc(GetProcessHeap(), 0, strlen(message) + 1)))
+        strcpy(*errors, message);
+
+    return hr;
 }
 
 void d3d8_resource_cleanup(struct d3d8_resource *resource)