diff --git a/rpcs3/Emu/RSX/D3D12/D3D12.h b/rpcs3/Emu/RSX/D3D12/D3D12.h
new file mode 100644
index 0000000000..5582cc0e41
--- /dev/null
+++ b/rpcs3/Emu/RSX/D3D12/D3D12.h
@@ -0,0 +1,27 @@
+#pragma once
+#if defined(DX12_SUPPORT)
+
+#include <d3d12.h>
+
+inline
+void check(HRESULT hr)
+{
+	if (hr != 0)
+		abort();
+}
+
+/**
+ * Send data to dst pointer without polluting cache.
+ * Usefull to write to mapped memory from upload heap.
+ */
+inline
+void streamToBuffer(void* dst, void* src, size_t sizeInBytes)
+{
+	for (unsigned i = 0; i < sizeInBytes / 16; i++)
+	{
+		__m128i *srcPtr = (__m128i*) ((char*)src + i * 16);
+		_mm_stream_si128((__m128i*)((char*)dst + i * 16), *srcPtr);
+	}
+}
+
+#endif
\ No newline at end of file
diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp
index 176e759292..9f99cbd4c7 100644
--- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp
+++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp
@@ -15,13 +15,6 @@ void SetGetD3DGSFrameCallback(GetGSFrameCb2 value)
 	GetGSFrame = value;
 }
 
-static void check(HRESULT hr)
-{
-	if (hr != 0)
-		abort();
-}
-
-
 void D3D12GSRender::ResourceStorage::Reset()
 {
 	m_currentVertexBuffersHeapOffset = 0;
@@ -622,7 +615,7 @@ void D3D12GSRender::setScaleOffset()
 
 	void *scaleOffsetMap;
 	check(scaleOffsetBuffer->Map(0, nullptr, &scaleOffsetMap));
-	memcpy((char*)scaleOffsetMap, scaleOffsetMat, 16 * sizeof(float));
+	streamToBuffer(scaleOffsetMap, scaleOffsetMat, 16 * sizeof(float));
 	scaleOffsetBuffer->Unmap(0, nullptr);
 
 	D3D12_CONSTANT_BUFFER_VIEW_DESC constantBufferViewDesc = {};
@@ -669,7 +662,7 @@ void D3D12GSRender::FillVertexShaderConstantsBuffer()
 
 	void *constantsBufferMap;
 	check(constantsBuffer->Map(0, nullptr, &constantsBufferMap));
-	memcpy(constantsBufferMap, vertexConstantShadowCopy, 512 * 4 * sizeof(float));
+	streamToBuffer(constantsBufferMap, vertexConstantShadowCopy, 512 * 4 * sizeof(float));
 	constantsBuffer->Unmap(0, nullptr);
 
 	D3D12_CONSTANT_BUFFER_VIEW_DESC constantBufferViewDesc = {};
@@ -769,7 +762,7 @@ void D3D12GSRender::FillPixelShaderConstantsBuffer()
 			vector[3] = c3;
 		}
 
-		memcpy((char*)constantsBufferMap + offset, vector, 4 * sizeof(u32));
+		streamToBuffer((char*)constantsBufferMap + offset, vector, 4 * sizeof(u32));
 		offset += 4 * sizeof(u32);
 	}
 
diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h
index 00c11413d8..0f864646a7 100644
--- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h
+++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h
@@ -1,7 +1,7 @@
 #pragma once
 #if defined(DX12_SUPPORT)
 
-#include <d3d12.h>
+#include "D3D12.h"
 #include "rpcs3/Ini.h"
 #include "Utilities/rPlatform.h" // only for rImage
 #include "Utilities/File.h"
diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp
index edb91c9592..e855ad7554 100644
--- a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp
+++ b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp
@@ -3,12 +3,6 @@
 #include "D3D12GSRender.h"
 // For clarity this code deals with texture but belongs to D3D12GSRender class
 
-static void check(HRESULT hr)
-{
-	if (hr != 0)
-		abort();
-}
-
 size_t D3D12GSRender::UploadTextures()
 {
 	size_t usedTexture = 0;
@@ -67,9 +61,7 @@ size_t D3D12GSRender::UploadTextures()
 		rowPitch = (rowPitch + 255) & ~255;
 		// Upload with correct rowpitch
 		for (unsigned row = 0; row < m_textures[i].GetHeight(); row++)
-		{
-			memcpy((char*)textureData + row * rowPitch, pixels + row * m_textures[i].m_pitch, m_textures[i].m_pitch);
-		}
+			streamToBuffer((char*)textureData + row * rowPitch, (char*)pixels + row * m_textures[i].m_pitch, m_textures[i].m_pitch);
 		Texture->Unmap(0, nullptr);
 
 		D3D12_RESOURCE_DESC vramTextureDesc = {};
diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj
index 8dccd27240..db6314a0ce 100644
--- a/rpcs3/emucore.vcxproj
+++ b/rpcs3/emucore.vcxproj
@@ -505,6 +505,7 @@
     <ClInclude Include="Emu\RSX\Common\ProgramStateCache.h" />
     <ClInclude Include="Emu\RSX\Common\ShaderParam.h" />
     <ClInclude Include="Emu\RSX\Common\VertexProgramDecompiler.h" />
+    <ClInclude Include="Emu\RSX\D3D12\D3D12.h" />
     <ClInclude Include="Emu\RSX\D3D12\D3D12Buffer.h" />
     <ClInclude Include="Emu\RSX\D3D12\D3D12FragmentProgramDecompiler.h" />
     <ClInclude Include="Emu\RSX\D3D12\D3D12GSRender.h" />
diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters
index 204f2cc488..fbc8a96a59 100644
--- a/rpcs3/emucore.vcxproj.filters
+++ b/rpcs3/emucore.vcxproj.filters
@@ -1873,5 +1873,8 @@
     <ClInclude Include="Emu\RSX\D3D12\D3D12Texture.h">
       <Filter>Emu\GPU\RSX\D3D12</Filter>
     </ClInclude>
+    <ClInclude Include="Emu\RSX\D3D12\D3D12.h">
+      <Filter>Emu\GPU\RSX\D3D12</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>
\ No newline at end of file