shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1 | #include "precompiled.h" |
| 2 | // |
| 3 | // Copyright (c) 2013 The ANGLE Project Authors. All rights reserved. |
| 4 | // Use of this source code is governed by a BSD-style license that can be |
| 5 | // found in the LICENSE file. |
| 6 | // |
| 7 | |
| 8 | // formatutils11.cpp: Queries for GL image formats and their translations to D3D11 |
| 9 | // formats. |
| 10 | |
Geoff Lang | d47e0fc | 2013-08-29 11:40:43 -0400 | [diff] [blame] | 11 | #include "libGLESv2/renderer/d3d11/formatutils11.h" |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 12 | #include "libGLESv2/renderer/generatemip.h" |
| 13 | #include "libGLESv2/renderer/loadimage.h" |
Geoff Lang | fe28ca0 | 2013-06-04 10:10:48 -0400 | [diff] [blame] | 14 | #include "libGLESv2/renderer/copyimage.h" |
Geoff Lang | 00f6bc3 | 2013-09-20 14:59:06 -0400 | [diff] [blame] | 15 | #include "libGLESv2/renderer/Renderer.h" |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 16 | #include "libGLESv2/renderer/copyvertex.h" |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 17 | |
| 18 | namespace rx |
| 19 | { |
| 20 | |
| 21 | struct D3D11ES3FormatInfo |
| 22 | { |
| 23 | DXGI_FORMAT mTexFormat; |
| 24 | DXGI_FORMAT mSRVFormat; |
| 25 | DXGI_FORMAT mRTVFormat; |
| 26 | DXGI_FORMAT mDSVFormat; |
| 27 | |
| 28 | D3D11ES3FormatInfo() |
| 29 | : mTexFormat(DXGI_FORMAT_UNKNOWN), mDSVFormat(DXGI_FORMAT_UNKNOWN), mRTVFormat(DXGI_FORMAT_UNKNOWN), mSRVFormat(DXGI_FORMAT_UNKNOWN) |
| 30 | { } |
| 31 | |
| 32 | D3D11ES3FormatInfo(DXGI_FORMAT texFormat, DXGI_FORMAT srvFormat, DXGI_FORMAT rtvFormat, DXGI_FORMAT dsvFormat) |
| 33 | : mTexFormat(texFormat), mDSVFormat(dsvFormat), mRTVFormat(rtvFormat), mSRVFormat(srvFormat) |
| 34 | { } |
| 35 | }; |
| 36 | |
| 37 | // For sized GL internal formats, there is only one corresponding D3D11 format. This map type allows |
| 38 | // querying for the DXGI texture formats to use for textures, SRVs, RTVs and DSVs given a GL internal |
| 39 | // format. |
Geoff Lang | 005df41 | 2013-10-16 14:12:50 -0400 | [diff] [blame] | 40 | typedef std::pair<GLenum, D3D11ES3FormatInfo> D3D11ES3FormatPair; |
| 41 | typedef std::map<GLenum, D3D11ES3FormatInfo> D3D11ES3FormatMap; |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 42 | |
Geoff Lang | 18591b7 | 2013-06-07 12:00:15 -0400 | [diff] [blame] | 43 | static D3D11ES3FormatMap BuildD3D11ES3FormatMap() |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 44 | { |
| 45 | D3D11ES3FormatMap map; |
| 46 | |
| 47 | // | GL internal format | | D3D11 texture format | D3D11 SRV format | D3D11 RTV format | D3D11 DSV format | |
| 48 | map.insert(D3D11ES3FormatPair(GL_NONE, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | a32a2ba | 2013-05-30 00:14:40 +0000 | [diff] [blame] | 49 | map.insert(D3D11ES3FormatPair(GL_R8, D3D11ES3FormatInfo(DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | 36d0be9 | 2013-05-30 00:15:59 +0000 | [diff] [blame] | 50 | map.insert(D3D11ES3FormatPair(GL_R8_SNORM, D3D11ES3FormatInfo(DXGI_FORMAT_R8_SNORM, DXGI_FORMAT_R8_SNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | a32a2ba | 2013-05-30 00:14:40 +0000 | [diff] [blame] | 51 | map.insert(D3D11ES3FormatPair(GL_RG8, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | 36d0be9 | 2013-05-30 00:15:59 +0000 | [diff] [blame] | 52 | map.insert(D3D11ES3FormatPair(GL_RG8_SNORM, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8_SNORM, DXGI_FORMAT_R8G8_SNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 53 | map.insert(D3D11ES3FormatPair(GL_RGB8, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | 36d0be9 | 2013-05-30 00:15:59 +0000 | [diff] [blame] | 54 | map.insert(D3D11ES3FormatPair(GL_RGB8_SNORM, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 55 | map.insert(D3D11ES3FormatPair(GL_RGB565, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN))); |
| 56 | map.insert(D3D11ES3FormatPair(GL_RGBA4, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN))); |
| 57 | map.insert(D3D11ES3FormatPair(GL_RGB5_A1, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN))); |
| 58 | map.insert(D3D11ES3FormatPair(GL_RGBA8, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | 36d0be9 | 2013-05-30 00:15:59 +0000 | [diff] [blame] | 59 | map.insert(D3D11ES3FormatPair(GL_RGBA8_SNORM, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | 5d4468e | 2013-05-30 00:13:56 +0000 | [diff] [blame] | 60 | map.insert(D3D11ES3FormatPair(GL_RGB10_A2, D3D11ES3FormatInfo(DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | a05127a | 2013-05-30 00:16:07 +0000 | [diff] [blame] | 61 | map.insert(D3D11ES3FormatPair(GL_RGB10_A2UI, D3D11ES3FormatInfo(DXGI_FORMAT_R10G10B10A2_UINT, DXGI_FORMAT_R10G10B10A2_UINT, DXGI_FORMAT_R10G10B10A2_UINT, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | 96c6291 | 2013-05-30 00:17:00 +0000 | [diff] [blame] | 62 | map.insert(D3D11ES3FormatPair(GL_SRGB8, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 63 | map.insert(D3D11ES3FormatPair(GL_SRGB8_ALPHA8, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | a32a2ba | 2013-05-30 00:14:40 +0000 | [diff] [blame] | 64 | map.insert(D3D11ES3FormatPair(GL_R16F, D3D11ES3FormatInfo(DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_UNKNOWN))); |
| 65 | map.insert(D3D11ES3FormatPair(GL_RG16F, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16_FLOAT, DXGI_FORMAT_R16G16_FLOAT, DXGI_FORMAT_R16G16_FLOAT, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 66 | map.insert(D3D11ES3FormatPair(GL_RGB16F, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN))); |
| 67 | map.insert(D3D11ES3FormatPair(GL_RGBA16F, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | a32a2ba | 2013-05-30 00:14:40 +0000 | [diff] [blame] | 68 | map.insert(D3D11ES3FormatPair(GL_R32F, D3D11ES3FormatInfo(DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_UNKNOWN))); |
| 69 | map.insert(D3D11ES3FormatPair(GL_RG32F, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32_FLOAT, DXGI_FORMAT_R32G32_FLOAT, DXGI_FORMAT_R32G32_FLOAT, DXGI_FORMAT_UNKNOWN))); |
Geoff Lang | 1c3192e | 2013-07-22 13:59:24 -0400 | [diff] [blame] | 70 | map.insert(D3D11ES3FormatPair(GL_RGB32F, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 71 | map.insert(D3D11ES3FormatPair(GL_RGBA32F, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN))); |
Geoff Lang | 1ec57f8 | 2013-10-16 11:43:23 -0400 | [diff] [blame] | 72 | map.insert(D3D11ES3FormatPair(GL_R11F_G11F_B10F, D3D11ES3FormatInfo(DXGI_FORMAT_R11G11B10_FLOAT, DXGI_FORMAT_R11G11B10_FLOAT, DXGI_FORMAT_R11G11B10_FLOAT, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | 92b9cd5 | 2013-05-30 00:14:48 +0000 | [diff] [blame] | 73 | map.insert(D3D11ES3FormatPair(GL_RGB9_E5, D3D11ES3FormatInfo(DXGI_FORMAT_R9G9B9E5_SHAREDEXP, DXGI_FORMAT_R9G9B9E5_SHAREDEXP, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | a05127a | 2013-05-30 00:16:07 +0000 | [diff] [blame] | 74 | map.insert(D3D11ES3FormatPair(GL_R8I, D3D11ES3FormatInfo(DXGI_FORMAT_R8_SINT, DXGI_FORMAT_R8_SINT, DXGI_FORMAT_R8_SINT, DXGI_FORMAT_UNKNOWN))); |
| 75 | map.insert(D3D11ES3FormatPair(GL_R8UI, D3D11ES3FormatInfo(DXGI_FORMAT_R8_UINT, DXGI_FORMAT_R8_UINT, DXGI_FORMAT_R8_UINT, DXGI_FORMAT_UNKNOWN))); |
| 76 | map.insert(D3D11ES3FormatPair(GL_R16I, D3D11ES3FormatInfo(DXGI_FORMAT_R16_SINT, DXGI_FORMAT_R16_SINT, DXGI_FORMAT_R16_SINT, DXGI_FORMAT_UNKNOWN))); |
| 77 | map.insert(D3D11ES3FormatPair(GL_R16UI, D3D11ES3FormatInfo(DXGI_FORMAT_R16_UINT, DXGI_FORMAT_R16_UINT, DXGI_FORMAT_R16_UINT, DXGI_FORMAT_UNKNOWN))); |
| 78 | map.insert(D3D11ES3FormatPair(GL_R32I, D3D11ES3FormatInfo(DXGI_FORMAT_R32_SINT, DXGI_FORMAT_R32_SINT, DXGI_FORMAT_R32_SINT, DXGI_FORMAT_UNKNOWN))); |
| 79 | map.insert(D3D11ES3FormatPair(GL_R32UI, D3D11ES3FormatInfo(DXGI_FORMAT_R32_UINT, DXGI_FORMAT_R32_UINT, DXGI_FORMAT_R32_UINT, DXGI_FORMAT_UNKNOWN))); |
| 80 | map.insert(D3D11ES3FormatPair(GL_RG8I, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8_SINT, DXGI_FORMAT_R8G8_SINT, DXGI_FORMAT_R8G8_SINT, DXGI_FORMAT_UNKNOWN))); |
| 81 | map.insert(D3D11ES3FormatPair(GL_RG8UI, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8_UINT, DXGI_FORMAT_R8G8_UINT, DXGI_FORMAT_R8G8_UINT, DXGI_FORMAT_UNKNOWN))); |
| 82 | map.insert(D3D11ES3FormatPair(GL_RG16I, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16_SINT, DXGI_FORMAT_R16G16_SINT, DXGI_FORMAT_R16G16_SINT, DXGI_FORMAT_UNKNOWN))); |
| 83 | map.insert(D3D11ES3FormatPair(GL_RG16UI, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16_UINT, DXGI_FORMAT_R16G16_UINT, DXGI_FORMAT_R16G16_UINT, DXGI_FORMAT_UNKNOWN))); |
| 84 | map.insert(D3D11ES3FormatPair(GL_RG32I, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32_SINT, DXGI_FORMAT_R32G32_SINT, DXGI_FORMAT_R32G32_SINT, DXGI_FORMAT_UNKNOWN))); |
| 85 | map.insert(D3D11ES3FormatPair(GL_RG32UI, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32_UINT, DXGI_FORMAT_R32G32_UINT, DXGI_FORMAT_R32G32_UINT, DXGI_FORMAT_UNKNOWN))); |
| 86 | map.insert(D3D11ES3FormatPair(GL_RGB8I, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_UNKNOWN))); |
| 87 | map.insert(D3D11ES3FormatPair(GL_RGB8UI, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_UNKNOWN))); |
| 88 | map.insert(D3D11ES3FormatPair(GL_RGB16I, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_UNKNOWN))); |
| 89 | map.insert(D3D11ES3FormatPair(GL_RGB16UI, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_UNKNOWN))); |
Jamie Madill | 0fd7786 | 2013-09-09 16:24:06 -0400 | [diff] [blame] | 90 | map.insert(D3D11ES3FormatPair(GL_RGB32I, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_SINT, DXGI_FORMAT_R32G32B32A32_SINT, DXGI_FORMAT_R32G32B32A32_SINT, DXGI_FORMAT_UNKNOWN))); |
| 91 | map.insert(D3D11ES3FormatPair(GL_RGB32UI, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | a05127a | 2013-05-30 00:16:07 +0000 | [diff] [blame] | 92 | map.insert(D3D11ES3FormatPair(GL_RGBA8I, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_UNKNOWN))); |
| 93 | map.insert(D3D11ES3FormatPair(GL_RGBA8UI, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_UNKNOWN))); |
| 94 | map.insert(D3D11ES3FormatPair(GL_RGBA16I, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_UNKNOWN))); |
| 95 | map.insert(D3D11ES3FormatPair(GL_RGBA16UI, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_UNKNOWN))); |
| 96 | map.insert(D3D11ES3FormatPair(GL_RGBA32I, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_SINT, DXGI_FORMAT_R32G32B32A32_SINT, DXGI_FORMAT_R32G32B32A32_SINT, DXGI_FORMAT_UNKNOWN))); |
| 97 | map.insert(D3D11ES3FormatPair(GL_RGBA32UI, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 98 | |
| 99 | // Unsized formats, TODO: Are types of float and half float allowed for the unsized types? Would it change the DXGI format? |
Geoff Lang | 0d56c43 | 2013-06-05 14:54:16 -0400 | [diff] [blame] | 100 | map.insert(D3D11ES3FormatPair(GL_ALPHA, D3D11ES3FormatInfo(DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_UNKNOWN))); |
| 101 | map.insert(D3D11ES3FormatPair(GL_LUMINANCE, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN))); |
| 102 | map.insert(D3D11ES3FormatPair(GL_LUMINANCE_ALPHA, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN))); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 103 | map.insert(D3D11ES3FormatPair(GL_RGB, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN))); |
| 104 | map.insert(D3D11ES3FormatPair(GL_RGBA, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN))); |
| 105 | map.insert(D3D11ES3FormatPair(GL_BGRA_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN))); |
| 106 | |
| 107 | // From GL_EXT_texture_storage |
Geoff Lang | 0d56c43 | 2013-06-05 14:54:16 -0400 | [diff] [blame] | 108 | // | GL internal format | | D3D11 texture format | D3D11 SRV format | D3D11 RTV format | D3D11 DSV format | |
| 109 | map.insert(D3D11ES3FormatPair(GL_ALPHA8_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_UNKNOWN ))); |
| 110 | map.insert(D3D11ES3FormatPair(GL_LUMINANCE8_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN ))); |
| 111 | map.insert(D3D11ES3FormatPair(GL_ALPHA32F_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN ))); |
Geoff Lang | 95f9f98 | 2013-10-21 17:09:19 -0400 | [diff] [blame] | 112 | map.insert(D3D11ES3FormatPair(GL_LUMINANCE32F_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN ))); |
Geoff Lang | 0d56c43 | 2013-06-05 14:54:16 -0400 | [diff] [blame] | 113 | map.insert(D3D11ES3FormatPair(GL_ALPHA16F_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN ))); |
Geoff Lang | b69d39b | 2014-05-06 11:49:22 -0400 | [diff] [blame] | 114 | map.insert(D3D11ES3FormatPair(GL_LUMINANCE16F_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN ))); |
Geoff Lang | 0d56c43 | 2013-06-05 14:54:16 -0400 | [diff] [blame] | 115 | map.insert(D3D11ES3FormatPair(GL_LUMINANCE8_ALPHA8_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN ))); |
| 116 | map.insert(D3D11ES3FormatPair(GL_LUMINANCE_ALPHA32F_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN ))); |
| 117 | map.insert(D3D11ES3FormatPair(GL_LUMINANCE_ALPHA16F_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN ))); |
| 118 | map.insert(D3D11ES3FormatPair(GL_BGRA8_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN ))); |
| 119 | map.insert(D3D11ES3FormatPair(GL_BGRA4_ANGLEX, D3D11ES3FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN ))); |
| 120 | map.insert(D3D11ES3FormatPair(GL_BGR5_A1_ANGLEX, D3D11ES3FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN ))); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 121 | |
| 122 | // Depth stencil formats |
Geoff Lang | 0d56c43 | 2013-06-05 14:54:16 -0400 | [diff] [blame] | 123 | map.insert(D3D11ES3FormatPair(GL_DEPTH_COMPONENT16, D3D11ES3FormatInfo(DXGI_FORMAT_R16_TYPELESS, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D16_UNORM ))); |
| 124 | map.insert(D3D11ES3FormatPair(GL_DEPTH_COMPONENT24, D3D11ES3FormatInfo(DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_R24_UNORM_X8_TYPELESS, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT ))); |
| 125 | map.insert(D3D11ES3FormatPair(GL_DEPTH_COMPONENT32F, D3D11ES3FormatInfo(DXGI_FORMAT_R32_TYPELESS, DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D32_FLOAT ))); |
| 126 | map.insert(D3D11ES3FormatPair(GL_DEPTH24_STENCIL8, D3D11ES3FormatInfo(DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_R24_UNORM_X8_TYPELESS, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT ))); |
| 127 | map.insert(D3D11ES3FormatPair(GL_DEPTH32F_STENCIL8, D3D11ES3FormatInfo(DXGI_FORMAT_R32G8X24_TYPELESS, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D32_FLOAT_S8X24_UINT))); |
Shannon Woods | 9e73b21 | 2013-07-08 10:32:19 -0400 | [diff] [blame] | 128 | map.insert(D3D11ES3FormatPair(GL_STENCIL_INDEX8, D3D11ES3FormatInfo(DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_X24_TYPELESS_G8_UINT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT ))); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 129 | |
| 130 | // From GL_ANGLE_depth_texture |
Geoff Lang | 0d56c43 | 2013-06-05 14:54:16 -0400 | [diff] [blame] | 131 | map.insert(D3D11ES3FormatPair(GL_DEPTH_COMPONENT32_OES, D3D11ES3FormatInfo(DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_R24_UNORM_X8_TYPELESS, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT ))); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 132 | |
| 133 | // Compressed formats, From ES 3.0.1 spec, table 3.16 |
| 134 | // | GL internal format | | D3D11 texture format | D3D11 SRV format | D3D11 RTV format | D3D11 DSV format | |
| 135 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_R11_EAC, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 136 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_SIGNED_R11_EAC, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 137 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RG11_EAC, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 138 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_SIGNED_RG11_EAC, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 139 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGB8_ETC2, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 140 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_SRGB8_ETC2, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 141 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 142 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 143 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGBA8_ETC2_EAC, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 144 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 145 | |
| 146 | // From GL_EXT_texture_compression_dxt1 |
| 147 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGB_S3TC_DXT1_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 148 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 149 | |
| 150 | // From GL_ANGLE_texture_compression_dxt3 |
| 151 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, D3D11ES3FormatInfo(DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 152 | |
| 153 | // From GL_ANGLE_texture_compression_dxt5 |
| 154 | map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, D3D11ES3FormatInfo(DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN))); |
| 155 | |
| 156 | return map; |
| 157 | } |
| 158 | |
Geoff Lang | 005df41 | 2013-10-16 14:12:50 -0400 | [diff] [blame] | 159 | static bool GetD3D11ES3FormatInfo(GLenum internalFormat, GLuint clientVersion, D3D11ES3FormatInfo *outFormatInfo) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 160 | { |
Geoff Lang | 18591b7 | 2013-06-07 12:00:15 -0400 | [diff] [blame] | 161 | static const D3D11ES3FormatMap formatMap = BuildD3D11ES3FormatMap(); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 162 | D3D11ES3FormatMap::const_iterator iter = formatMap.find(internalFormat); |
| 163 | if (iter != formatMap.end()) |
| 164 | { |
| 165 | if (outFormatInfo) |
| 166 | { |
| 167 | *outFormatInfo = iter->second; |
| 168 | } |
| 169 | return true; |
| 170 | } |
| 171 | else |
| 172 | { |
| 173 | return false; |
| 174 | } |
| 175 | } |
| 176 | |
| 177 | // ES3 image loading functions vary based on the internal format and data type given, |
| 178 | // this map type determines the loading function from the internal format and type supplied |
shannonwoods@chromium.org | 5d4468e | 2013-05-30 00:13:56 +0000 | [diff] [blame] | 179 | // to glTex*Image*D and the destination DXGI_FORMAT. Source formats and types are taken from |
| 180 | // Tables 3.2 and 3.3 of the ES 3 spec. |
Geoff Lang | 005df41 | 2013-10-16 14:12:50 -0400 | [diff] [blame] | 181 | typedef std::pair<GLenum, GLenum> InternalFormatTypePair; |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 182 | typedef std::pair<InternalFormatTypePair, LoadImageFunction> D3D11LoadFunctionPair; |
| 183 | typedef std::map<InternalFormatTypePair, LoadImageFunction> D3D11LoadFunctionMap; |
| 184 | |
| 185 | static void UnimplementedLoadFunction(int width, int height, int depth, |
| 186 | const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch, |
| 187 | void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch) |
| 188 | { |
| 189 | UNIMPLEMENTED(); |
| 190 | } |
| 191 | |
Geoff Lang | d3ff216 | 2013-06-07 15:10:59 -0400 | [diff] [blame] | 192 | static void UnreachableLoadFunction(int width, int height, int depth, |
| 193 | const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch, |
| 194 | void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch) |
| 195 | { |
| 196 | UNREACHABLE(); |
| 197 | } |
| 198 | |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 199 | // A helper function to insert data into the D3D11LoadFunctionMap with fewer characters. |
Geoff Lang | 005df41 | 2013-10-16 14:12:50 -0400 | [diff] [blame] | 200 | static inline void insertLoadFunction(D3D11LoadFunctionMap *map, GLenum internalFormat, GLenum type, |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 201 | LoadImageFunction loadFunc) |
| 202 | { |
| 203 | map->insert(D3D11LoadFunctionPair(InternalFormatTypePair(internalFormat, type), loadFunc)); |
| 204 | } |
| 205 | |
| 206 | D3D11LoadFunctionMap buildD3D11LoadFunctionMap() |
| 207 | { |
| 208 | D3D11LoadFunctionMap map; |
| 209 | |
| 210 | // | Internal format | Type | Load function | |
shannonwoods@chromium.org | 8d46e91 | 2013-05-30 00:14:32 +0000 | [diff] [blame] | 211 | insertLoadFunction(&map, GL_RGBA8, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 4> ); |
Geoff Lang | 9c5808c | 2013-06-07 15:16:58 -0400 | [diff] [blame] | 212 | insertLoadFunction(&map, GL_RGB5_A1, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 4> ); |
| 213 | insertLoadFunction(&map, GL_RGBA4, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 4> ); |
shannonwoods@chromium.org | 8d46e91 | 2013-05-30 00:14:32 +0000 | [diff] [blame] | 214 | insertLoadFunction(&map, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 4> ); |
shannonwoods@chromium.org | 36d0be9 | 2013-05-30 00:15:59 +0000 | [diff] [blame] | 215 | insertLoadFunction(&map, GL_RGBA8_SNORM, GL_BYTE, loadToNative<GLbyte, 4> ); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 216 | insertLoadFunction(&map, GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4, loadRGBA4444DataToRGBA ); |
shannonwoods@chromium.org | 8d46e91 | 2013-05-30 00:14:32 +0000 | [diff] [blame] | 217 | insertLoadFunction(&map, GL_RGB10_A2, GL_UNSIGNED_INT_2_10_10_10_REV, loadToNative<GLuint, 1> ); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 218 | insertLoadFunction(&map, GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1, loadRGBA5551DataToRGBA ); |
shannonwoods@chromium.org | 5d4468e | 2013-05-30 00:13:56 +0000 | [diff] [blame] | 219 | insertLoadFunction(&map, GL_RGB5_A1, GL_UNSIGNED_INT_2_10_10_10_REV, loadRGBA2101010ToRGBA ); |
shannonwoods@chromium.org | 8d46e91 | 2013-05-30 00:14:32 +0000 | [diff] [blame] | 220 | insertLoadFunction(&map, GL_RGBA16F, GL_HALF_FLOAT, loadToNative<GLhalf, 4> ); |
| 221 | insertLoadFunction(&map, GL_RGBA32F, GL_FLOAT, loadToNative<GLfloat, 4> ); |
shannonwoods@chromium.org | de7e6a2 | 2013-05-30 00:16:46 +0000 | [diff] [blame] | 222 | insertLoadFunction(&map, GL_RGBA16F, GL_FLOAT, loadFloatDataToHalfFloat<4> ); |
shannonwoods@chromium.org | a05127a | 2013-05-30 00:16:07 +0000 | [diff] [blame] | 223 | insertLoadFunction(&map, GL_RGBA8UI, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 4> ); |
| 224 | insertLoadFunction(&map, GL_RGBA8I, GL_BYTE, loadToNative<GLbyte, 4> ); |
| 225 | insertLoadFunction(&map, GL_RGBA16UI, GL_UNSIGNED_SHORT, loadToNative<GLushort, 4> ); |
| 226 | insertLoadFunction(&map, GL_RGBA16I, GL_SHORT, loadToNative<GLshort, 4> ); |
| 227 | insertLoadFunction(&map, GL_RGBA32UI, GL_UNSIGNED_INT, loadToNative<GLuint, 4> ); |
| 228 | insertLoadFunction(&map, GL_RGBA32I, GL_INT, loadToNative<GLint, 4> ); |
| 229 | insertLoadFunction(&map, GL_RGB10_A2UI, GL_UNSIGNED_INT_2_10_10_10_REV, loadToNative<GLuint, 1> ); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 230 | insertLoadFunction(&map, GL_RGB8, GL_UNSIGNED_BYTE, loadRGBUByteDataToRGBA ); |
Geoff Lang | 9c5808c | 2013-06-07 15:16:58 -0400 | [diff] [blame] | 231 | insertLoadFunction(&map, GL_RGB565, GL_UNSIGNED_BYTE, loadToNative3To4<GLubyte, 0xFF> ); |
shannonwoods@chromium.org | 96c6291 | 2013-05-30 00:17:00 +0000 | [diff] [blame] | 232 | insertLoadFunction(&map, GL_SRGB8, GL_UNSIGNED_BYTE, loadToNative3To4<GLubyte, 0xFF> ); |
shannonwoods@chromium.org | 36d0be9 | 2013-05-30 00:15:59 +0000 | [diff] [blame] | 233 | insertLoadFunction(&map, GL_RGB8_SNORM, GL_BYTE, loadRGBSByteDataToRGBA ); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 234 | insertLoadFunction(&map, GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, loadRGB565DataToRGBA ); |
shannonwoods@chromium.org | a43d829 | 2013-05-30 00:15:50 +0000 | [diff] [blame] | 235 | insertLoadFunction(&map, GL_R11F_G11F_B10F, GL_UNSIGNED_INT_10F_11F_11F_REV, loadToNative<GLuint, 1> ); |
shannonwoods@chromium.org | 92b9cd5 | 2013-05-30 00:14:48 +0000 | [diff] [blame] | 236 | insertLoadFunction(&map, GL_RGB9_E5, GL_UNSIGNED_INT_5_9_9_9_REV, loadToNative<GLuint, 1> ); |
shannonwoods@chromium.org | de7e6a2 | 2013-05-30 00:16:46 +0000 | [diff] [blame] | 237 | insertLoadFunction(&map, GL_RGB16F, GL_HALF_FLOAT, loadToNative3To4<GLhalf, gl::Float16One>); |
shannonwoods@chromium.org | a43d829 | 2013-05-30 00:15:50 +0000 | [diff] [blame] | 238 | insertLoadFunction(&map, GL_R11F_G11F_B10F, GL_HALF_FLOAT, loadRGBHalfFloatDataTo111110Float ); |
shannonwoods@chromium.org | 92b9cd5 | 2013-05-30 00:14:48 +0000 | [diff] [blame] | 239 | insertLoadFunction(&map, GL_RGB9_E5, GL_HALF_FLOAT, loadRGBHalfFloatDataTo999E5 ); |
Geoff Lang | 1c3192e | 2013-07-22 13:59:24 -0400 | [diff] [blame] | 240 | insertLoadFunction(&map, GL_RGB32F, GL_FLOAT, loadToNative3To4<GLfloat, gl::Float32One>); |
shannonwoods@chromium.org | de7e6a2 | 2013-05-30 00:16:46 +0000 | [diff] [blame] | 241 | insertLoadFunction(&map, GL_RGB16F, GL_FLOAT, loadFloatRGBDataToHalfFloatRGBA ); |
shannonwoods@chromium.org | a43d829 | 2013-05-30 00:15:50 +0000 | [diff] [blame] | 242 | insertLoadFunction(&map, GL_R11F_G11F_B10F, GL_FLOAT, loadRGBFloatDataTo111110Float ); |
shannonwoods@chromium.org | 92b9cd5 | 2013-05-30 00:14:48 +0000 | [diff] [blame] | 243 | insertLoadFunction(&map, GL_RGB9_E5, GL_FLOAT, loadRGBFloatDataTo999E5 ); |
Geoff Lang | 5b61c69 | 2013-08-02 15:02:59 -0400 | [diff] [blame] | 244 | insertLoadFunction(&map, GL_RGB8UI, GL_UNSIGNED_BYTE, loadToNative3To4<GLubyte, 0x01> ); |
| 245 | insertLoadFunction(&map, GL_RGB8I, GL_BYTE, loadToNative3To4<GLbyte, 0x01> ); |
| 246 | insertLoadFunction(&map, GL_RGB16UI, GL_UNSIGNED_SHORT, loadToNative3To4<GLushort, 0x0001> ); |
| 247 | insertLoadFunction(&map, GL_RGB16I, GL_SHORT, loadToNative3To4<GLshort, 0x0001> ); |
Jamie Madill | 0fd7786 | 2013-09-09 16:24:06 -0400 | [diff] [blame] | 248 | insertLoadFunction(&map, GL_RGB32UI, GL_UNSIGNED_INT, loadToNative3To4<GLuint, 0x00000001> ); |
| 249 | insertLoadFunction(&map, GL_RGB32I, GL_INT, loadToNative3To4<GLint, 0x00000001> ); |
shannonwoods@chromium.org | a32a2ba | 2013-05-30 00:14:40 +0000 | [diff] [blame] | 250 | insertLoadFunction(&map, GL_RG8, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 2> ); |
shannonwoods@chromium.org | 36d0be9 | 2013-05-30 00:15:59 +0000 | [diff] [blame] | 251 | insertLoadFunction(&map, GL_RG8_SNORM, GL_BYTE, loadToNative<GLbyte, 2> ); |
shannonwoods@chromium.org | a32a2ba | 2013-05-30 00:14:40 +0000 | [diff] [blame] | 252 | insertLoadFunction(&map, GL_RG16F, GL_HALF_FLOAT, loadToNative<GLhalf, 2> ); |
| 253 | insertLoadFunction(&map, GL_RG32F, GL_FLOAT, loadToNative<GLfloat, 2> ); |
| 254 | insertLoadFunction(&map, GL_RG16F, GL_FLOAT, loadFloatDataToHalfFloat<2> ); |
shannonwoods@chromium.org | a05127a | 2013-05-30 00:16:07 +0000 | [diff] [blame] | 255 | insertLoadFunction(&map, GL_RG8UI, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 2> ); |
| 256 | insertLoadFunction(&map, GL_RG8I, GL_BYTE, loadToNative<GLbyte, 2> ); |
| 257 | insertLoadFunction(&map, GL_RG16UI, GL_UNSIGNED_SHORT, loadToNative<GLushort, 2> ); |
| 258 | insertLoadFunction(&map, GL_RG16I, GL_SHORT, loadToNative<GLshort, 2> ); |
| 259 | insertLoadFunction(&map, GL_RG32UI, GL_UNSIGNED_INT, loadToNative<GLuint, 2> ); |
| 260 | insertLoadFunction(&map, GL_RG32I, GL_INT, loadToNative<GLint, 2> ); |
shannonwoods@chromium.org | a32a2ba | 2013-05-30 00:14:40 +0000 | [diff] [blame] | 261 | insertLoadFunction(&map, GL_R8, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 1> ); |
shannonwoods@chromium.org | 36d0be9 | 2013-05-30 00:15:59 +0000 | [diff] [blame] | 262 | insertLoadFunction(&map, GL_R8_SNORM, GL_BYTE, loadToNative<GLbyte, 1> ); |
shannonwoods@chromium.org | a32a2ba | 2013-05-30 00:14:40 +0000 | [diff] [blame] | 263 | insertLoadFunction(&map, GL_R16F, GL_HALF_FLOAT, loadToNative<GLhalf, 1> ); |
| 264 | insertLoadFunction(&map, GL_R32F, GL_FLOAT, loadToNative<GLfloat, 1> ); |
| 265 | insertLoadFunction(&map, GL_R16F, GL_FLOAT, loadFloatDataToHalfFloat<1> ); |
shannonwoods@chromium.org | a05127a | 2013-05-30 00:16:07 +0000 | [diff] [blame] | 266 | insertLoadFunction(&map, GL_R8UI, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 1> ); |
| 267 | insertLoadFunction(&map, GL_R8I, GL_BYTE, loadToNative<GLbyte, 1> ); |
| 268 | insertLoadFunction(&map, GL_R16UI, GL_UNSIGNED_SHORT, loadToNative<GLushort, 1> ); |
| 269 | insertLoadFunction(&map, GL_R16I, GL_SHORT, loadToNative<GLshort, 1> ); |
| 270 | insertLoadFunction(&map, GL_R32UI, GL_UNSIGNED_INT, loadToNative<GLuint, 1> ); |
| 271 | insertLoadFunction(&map, GL_R32I, GL_INT, loadToNative<GLint, 1> ); |
Geoff Lang | 8746546 | 2013-06-17 16:28:54 -0400 | [diff] [blame] | 272 | insertLoadFunction(&map, GL_DEPTH_COMPONENT16, GL_UNSIGNED_SHORT, loadToNative<GLushort, 1> ); |
Geoff Lang | 4133f5c | 2013-10-10 13:51:18 -0400 | [diff] [blame] | 273 | insertLoadFunction(&map, GL_DEPTH_COMPONENT24, GL_UNSIGNED_INT, loadG8R24DataToR24G8 ); |
Geoff Lang | 8746546 | 2013-06-17 16:28:54 -0400 | [diff] [blame] | 274 | insertLoadFunction(&map, GL_DEPTH_COMPONENT16, GL_UNSIGNED_INT, loadUintDataToUshort ); |
| 275 | insertLoadFunction(&map, GL_DEPTH_COMPONENT32F, GL_FLOAT, loadToNative<GLfloat, 1> ); |
Geoff Lang | 4133f5c | 2013-10-10 13:51:18 -0400 | [diff] [blame] | 276 | insertLoadFunction(&map, GL_DEPTH24_STENCIL8, GL_UNSIGNED_INT_24_8, loadG8R24DataToR24G8 ); |
Geoff Lang | 8746546 | 2013-06-17 16:28:54 -0400 | [diff] [blame] | 277 | insertLoadFunction(&map, GL_DEPTH32F_STENCIL8, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, loadToNative<GLuint, 2> ); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 278 | |
| 279 | // Unsized formats |
Geoff Lang | d3ff216 | 2013-06-07 15:10:59 -0400 | [diff] [blame] | 280 | // Load functions are unreachable because they are converted to sized internal formats based on |
| 281 | // the format and type before loading takes place. |
| 282 | insertLoadFunction(&map, GL_RGBA, GL_UNSIGNED_BYTE, UnreachableLoadFunction ); |
| 283 | insertLoadFunction(&map, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, UnreachableLoadFunction ); |
| 284 | insertLoadFunction(&map, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, UnreachableLoadFunction ); |
| 285 | insertLoadFunction(&map, GL_RGB, GL_UNSIGNED_BYTE, UnreachableLoadFunction ); |
| 286 | insertLoadFunction(&map, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, UnreachableLoadFunction ); |
| 287 | insertLoadFunction(&map, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, UnreachableLoadFunction ); |
| 288 | insertLoadFunction(&map, GL_LUMINANCE, GL_UNSIGNED_BYTE, UnreachableLoadFunction ); |
| 289 | insertLoadFunction(&map, GL_ALPHA, GL_UNSIGNED_BYTE, UnreachableLoadFunction ); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 290 | |
| 291 | // From GL_OES_texture_float |
| 292 | insertLoadFunction(&map, GL_LUMINANCE_ALPHA, GL_FLOAT, loadLuminanceAlphaFloatDataToRGBA ); |
| 293 | insertLoadFunction(&map, GL_LUMINANCE, GL_FLOAT, loadLuminanceFloatDataToRGB ); |
| 294 | insertLoadFunction(&map, GL_ALPHA, GL_FLOAT, loadAlphaFloatDataToRGBA ); |
| 295 | |
| 296 | // From GL_OES_texture_half_float |
| 297 | insertLoadFunction(&map, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT, loadLuminanceAlphaHalfFloatDataToRGBA); |
| 298 | insertLoadFunction(&map, GL_LUMINANCE, GL_HALF_FLOAT, loadLuminanceHalfFloatDataToRGBA ); |
| 299 | insertLoadFunction(&map, GL_ALPHA, GL_HALF_FLOAT, loadAlphaHalfFloatDataToRGBA ); |
| 300 | |
| 301 | // From GL_EXT_texture_storage |
shannonwoods@chromium.org | 8d46e91 | 2013-05-30 00:14:32 +0000 | [diff] [blame] | 302 | insertLoadFunction(&map, GL_ALPHA8_EXT, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 1> ); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 303 | insertLoadFunction(&map, GL_LUMINANCE8_EXT, GL_UNSIGNED_BYTE, loadLuminanceDataToBGRA ); |
| 304 | insertLoadFunction(&map, GL_LUMINANCE8_ALPHA8_EXT, GL_UNSIGNED_BYTE, loadLuminanceAlphaDataToBGRA ); |
| 305 | insertLoadFunction(&map, GL_ALPHA32F_EXT, GL_FLOAT, loadAlphaFloatDataToRGBA ); |
| 306 | insertLoadFunction(&map, GL_LUMINANCE32F_EXT, GL_FLOAT, loadLuminanceFloatDataToRGB ); |
| 307 | insertLoadFunction(&map, GL_LUMINANCE_ALPHA32F_EXT, GL_FLOAT, loadLuminanceAlphaFloatDataToRGBA ); |
| 308 | insertLoadFunction(&map, GL_ALPHA16F_EXT, GL_HALF_FLOAT, loadAlphaHalfFloatDataToRGBA ); |
| 309 | insertLoadFunction(&map, GL_LUMINANCE16F_EXT, GL_HALF_FLOAT, loadLuminanceHalfFloatDataToRGBA ); |
| 310 | insertLoadFunction(&map, GL_LUMINANCE_ALPHA16F_EXT, GL_HALF_FLOAT, loadLuminanceAlphaHalfFloatDataToRGBA); |
| 311 | |
shannonwoods@chromium.org | 8d46e91 | 2013-05-30 00:14:32 +0000 | [diff] [blame] | 312 | insertLoadFunction(&map, GL_BGRA8_EXT, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 4> ); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 313 | insertLoadFunction(&map, GL_BGRA4_ANGLEX, GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, loadRGBA4444DataToRGBA ); |
Geoff Lang | 9c5808c | 2013-06-07 15:16:58 -0400 | [diff] [blame] | 314 | insertLoadFunction(&map, GL_BGRA4_ANGLEX, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 4> ); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 315 | insertLoadFunction(&map, GL_BGR5_A1_ANGLEX, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, loadRGBA5551DataToRGBA ); |
Geoff Lang | 9c5808c | 2013-06-07 15:16:58 -0400 | [diff] [blame] | 316 | insertLoadFunction(&map, GL_BGR5_A1_ANGLEX, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 4> ); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 317 | |
| 318 | // Compressed formats |
| 319 | // From ES 3.0.1 spec, table 3.16 |
| 320 | // | Internal format | Type | Load function | |
| 321 | insertLoadFunction(&map, GL_COMPRESSED_R11_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction ); |
| 322 | insertLoadFunction(&map, GL_COMPRESSED_R11_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction ); |
| 323 | insertLoadFunction(&map, GL_COMPRESSED_SIGNED_R11_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction ); |
| 324 | insertLoadFunction(&map, GL_COMPRESSED_RG11_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction ); |
| 325 | insertLoadFunction(&map, GL_COMPRESSED_SIGNED_RG11_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction ); |
| 326 | insertLoadFunction(&map, GL_COMPRESSED_RGB8_ETC2, GL_UNSIGNED_BYTE, UnimplementedLoadFunction ); |
| 327 | insertLoadFunction(&map, GL_COMPRESSED_SRGB8_ETC2, GL_UNSIGNED_BYTE, UnimplementedLoadFunction ); |
| 328 | insertLoadFunction(&map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_UNSIGNED_BYTE, UnimplementedLoadFunction ); |
| 329 | insertLoadFunction(&map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_UNSIGNED_BYTE, UnimplementedLoadFunction ); |
| 330 | insertLoadFunction(&map, GL_COMPRESSED_RGBA8_ETC2_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction ); |
| 331 | insertLoadFunction(&map, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction ); |
| 332 | |
| 333 | // From GL_EXT_texture_compression_dxt1 |
| 334 | insertLoadFunction(&map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_UNSIGNED_BYTE, loadCompressedBlockDataToNative<4, 4, 8>); |
| 335 | insertLoadFunction(&map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_UNSIGNED_BYTE, loadCompressedBlockDataToNative<4, 4, 8>); |
| 336 | |
| 337 | // From GL_ANGLE_texture_compression_dxt3 |
| 338 | insertLoadFunction(&map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, GL_UNSIGNED_BYTE, loadCompressedBlockDataToNative<4, 4, 16>); |
| 339 | |
| 340 | // From GL_ANGLE_texture_compression_dxt5 |
| 341 | insertLoadFunction(&map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, GL_UNSIGNED_BYTE, loadCompressedBlockDataToNative<4, 4, 16>); |
| 342 | |
| 343 | return map; |
| 344 | } |
| 345 | |
| 346 | struct D3D11ES2FormatInfo |
| 347 | { |
| 348 | DXGI_FORMAT mTexFormat; |
| 349 | DXGI_FORMAT mSRVFormat; |
| 350 | DXGI_FORMAT mRTVFormat; |
| 351 | DXGI_FORMAT mDSVFormat; |
| 352 | |
| 353 | LoadImageFunction mLoadImageFunction; |
| 354 | |
| 355 | D3D11ES2FormatInfo() |
| 356 | : mTexFormat(DXGI_FORMAT_UNKNOWN), mDSVFormat(DXGI_FORMAT_UNKNOWN), mRTVFormat(DXGI_FORMAT_UNKNOWN), |
| 357 | mSRVFormat(DXGI_FORMAT_UNKNOWN), mLoadImageFunction(NULL) |
| 358 | { } |
| 359 | |
| 360 | D3D11ES2FormatInfo(DXGI_FORMAT texFormat, DXGI_FORMAT srvFormat, DXGI_FORMAT rtvFormat, DXGI_FORMAT dsvFormat, |
| 361 | LoadImageFunction loadFunc) |
| 362 | : mTexFormat(texFormat), mDSVFormat(dsvFormat), mRTVFormat(rtvFormat), mSRVFormat(srvFormat), |
| 363 | mLoadImageFunction(loadFunc) |
| 364 | { } |
| 365 | }; |
| 366 | |
| 367 | // ES2 internal formats can map to DXGI formats and loading functions |
Geoff Lang | 005df41 | 2013-10-16 14:12:50 -0400 | [diff] [blame] | 368 | typedef std::pair<GLenum, D3D11ES2FormatInfo> D3D11ES2FormatPair; |
| 369 | typedef std::map<GLenum, D3D11ES2FormatInfo> D3D11ES2FormatMap; |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 370 | |
Geoff Lang | 18591b7 | 2013-06-07 12:00:15 -0400 | [diff] [blame] | 371 | static D3D11ES2FormatMap BuildD3D11ES2FormatMap() |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 372 | { |
| 373 | D3D11ES2FormatMap map; |
| 374 | |
| 375 | // | Internal format | | Texture format | SRV format | RTV format | DSV format | Load function | |
Geoff Lang | 8746546 | 2013-06-17 16:28:54 -0400 | [diff] [blame] | 376 | map.insert(D3D11ES2FormatPair(GL_NONE, D3D11ES2FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, UnreachableLoadFunction ))); |
| 377 | map.insert(D3D11ES2FormatPair(GL_DEPTH_COMPONENT16, D3D11ES2FormatInfo(DXGI_FORMAT_R16_TYPELESS, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D16_UNORM, UnreachableLoadFunction ))); |
| 378 | map.insert(D3D11ES2FormatPair(GL_DEPTH_COMPONENT32_OES, D3D11ES2FormatInfo(DXGI_FORMAT_R32_TYPELESS, DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D32_FLOAT, UnreachableLoadFunction ))); |
| 379 | map.insert(D3D11ES2FormatPair(GL_DEPTH24_STENCIL8_OES, D3D11ES2FormatInfo(DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_R24_UNORM_X8_TYPELESS, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT, UnreachableLoadFunction ))); |
| 380 | map.insert(D3D11ES2FormatPair(GL_STENCIL_INDEX8, D3D11ES2FormatInfo(DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_X24_TYPELESS_G8_UINT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT, UnreachableLoadFunction ))); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 381 | |
| 382 | map.insert(D3D11ES2FormatPair(GL_RGBA32F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN, loadRGBAFloatDataToRGBA ))); |
Geoff Lang | 1c3192e | 2013-07-22 13:59:24 -0400 | [diff] [blame] | 383 | map.insert(D3D11ES2FormatPair(GL_RGB32F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN, loadRGBFloatDataToRGBA ))); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 384 | map.insert(D3D11ES2FormatPair(GL_ALPHA32F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN, loadAlphaFloatDataToRGBA ))); |
Geoff Lang | 95f9f98 | 2013-10-21 17:09:19 -0400 | [diff] [blame] | 385 | map.insert(D3D11ES2FormatPair(GL_LUMINANCE32F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN, loadLuminanceFloatDataToRGBA ))); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 386 | map.insert(D3D11ES2FormatPair(GL_LUMINANCE_ALPHA32F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN, loadLuminanceAlphaFloatDataToRGBA ))); |
| 387 | |
| 388 | map.insert(D3D11ES2FormatPair(GL_RGBA16F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN, loadRGBAHalfFloatDataToRGBA ))); |
| 389 | map.insert(D3D11ES2FormatPair(GL_RGB16F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN, loadRGBHalfFloatDataToRGBA ))); |
| 390 | map.insert(D3D11ES2FormatPair(GL_ALPHA16F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN, loadAlphaHalfFloatDataToRGBA ))); |
| 391 | map.insert(D3D11ES2FormatPair(GL_LUMINANCE16F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN, loadLuminanceHalfFloatDataToRGBA ))); |
| 392 | map.insert(D3D11ES2FormatPair(GL_LUMINANCE_ALPHA16F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN, loadLuminanceAlphaHalfFloatDataToRGBA ))); |
| 393 | |
| 394 | map.insert(D3D11ES2FormatPair(GL_ALPHA8_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_UNKNOWN, loadAlphaDataToNative ))); |
| 395 | map.insert(D3D11ES2FormatPair(GL_LUMINANCE8_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadLuminanceDataToBGRA ))); |
| 396 | map.insert(D3D11ES2FormatPair(GL_LUMINANCE8_ALPHA8_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadLuminanceAlphaDataToBGRA ))); |
| 397 | |
| 398 | map.insert(D3D11ES2FormatPair(GL_RGB8_OES, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGBUByteDataToRGBA ))); |
| 399 | map.insert(D3D11ES2FormatPair(GL_RGB565, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGB565DataToRGBA ))); |
| 400 | map.insert(D3D11ES2FormatPair(GL_RGBA8_OES, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGBAUByteDataToNative ))); |
| 401 | map.insert(D3D11ES2FormatPair(GL_RGBA4, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGBA4444DataToRGBA ))); |
| 402 | map.insert(D3D11ES2FormatPair(GL_RGB5_A1, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGBA5551DataToRGBA ))); |
| 403 | map.insert(D3D11ES2FormatPair(GL_BGRA8_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadBGRADataToBGRA ))); |
| 404 | map.insert(D3D11ES2FormatPair(GL_BGRA4_ANGLEX, D3D11ES2FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGBA4444DataToRGBA ))); |
| 405 | map.insert(D3D11ES2FormatPair(GL_BGR5_A1_ANGLEX, D3D11ES2FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGBA5551DataToRGBA ))); |
| 406 | |
Geoff Lang | 632192d | 2013-10-04 13:40:46 -0400 | [diff] [blame] | 407 | // From GL_EXT_texture_rg |
| 408 | map.insert(D3D11ES2FormatPair(GL_R8_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_UNKNOWN, loadToNative<GLubyte, 1> ))); |
| 409 | map.insert(D3D11ES2FormatPair(GL_R32F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_UNKNOWN, loadToNative<GLfloat, 1> ))); |
| 410 | map.insert(D3D11ES2FormatPair(GL_R16F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_UNKNOWN, loadToNative<GLhalf, 1> ))); |
| 411 | map.insert(D3D11ES2FormatPair(GL_RG8_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_UNKNOWN, loadToNative<GLubyte, 2> ))); |
| 412 | map.insert(D3D11ES2FormatPair(GL_RG32F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R32G32_FLOAT, DXGI_FORMAT_R32G32_FLOAT, DXGI_FORMAT_R32G32_FLOAT, DXGI_FORMAT_UNKNOWN, loadToNative<GLfloat, 2> ))); |
| 413 | map.insert(D3D11ES2FormatPair(GL_RG16F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R16G16_FLOAT, DXGI_FORMAT_R16G16_FLOAT, DXGI_FORMAT_R16G16_FLOAT, DXGI_FORMAT_UNKNOWN, loadToNative<GLhalf, 2> ))); |
| 414 | |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 415 | map.insert(D3D11ES2FormatPair(GL_COMPRESSED_RGB_S3TC_DXT1_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, loadCompressedBlockDataToNative<4, 4, 8>))); |
| 416 | map.insert(D3D11ES2FormatPair(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, loadCompressedBlockDataToNative<4, 4, 8>))); |
| 417 | map.insert(D3D11ES2FormatPair(GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, D3D11ES2FormatInfo(DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, loadCompressedBlockDataToNative<4, 4, 16>))); |
| 418 | map.insert(D3D11ES2FormatPair(GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, D3D11ES2FormatInfo(DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, loadCompressedBlockDataToNative<4, 4, 16>))); |
| 419 | |
| 420 | return map; |
| 421 | } |
| 422 | |
Geoff Lang | 005df41 | 2013-10-16 14:12:50 -0400 | [diff] [blame] | 423 | static bool GetD3D11ES2FormatInfo(GLenum internalFormat, GLuint clientVersion, D3D11ES2FormatInfo *outFormatInfo) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 424 | { |
Geoff Lang | 18591b7 | 2013-06-07 12:00:15 -0400 | [diff] [blame] | 425 | static const D3D11ES2FormatMap formatMap = BuildD3D11ES2FormatMap(); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 426 | D3D11ES2FormatMap::const_iterator iter = formatMap.find(internalFormat); |
| 427 | if (iter != formatMap.end()) |
| 428 | { |
| 429 | if (outFormatInfo) |
| 430 | { |
| 431 | *outFormatInfo = iter->second; |
| 432 | } |
| 433 | return true; |
| 434 | } |
| 435 | else |
| 436 | { |
| 437 | return false; |
| 438 | } |
| 439 | } |
| 440 | |
shannonwoods@chromium.org | ba9d750 | 2013-05-30 00:14:58 +0000 | [diff] [blame] | 441 | // A map to determine the pixel size and mipmap generation function of a given DXGI format |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 442 | struct DXGIFormatInfo |
| 443 | { |
| 444 | GLuint mPixelBits; |
| 445 | GLuint mBlockWidth; |
| 446 | GLuint mBlockHeight; |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 447 | GLenum mComponentType; |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 448 | |
shannonwoods@chromium.org | ba9d750 | 2013-05-30 00:14:58 +0000 | [diff] [blame] | 449 | MipGenerationFunction mMipGenerationFunction; |
Geoff Lang | fe28ca0 | 2013-06-04 10:10:48 -0400 | [diff] [blame] | 450 | ColorReadFunction mColorReadFunction; |
shannonwoods@chromium.org | ba9d750 | 2013-05-30 00:14:58 +0000 | [diff] [blame] | 451 | |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 452 | DXGIFormatInfo() |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 453 | : mPixelBits(0), mBlockWidth(0), mBlockHeight(0), mComponentType(GL_NONE), mMipGenerationFunction(NULL), |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 454 | mColorReadFunction(NULL) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 455 | { } |
| 456 | |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 457 | DXGIFormatInfo(GLuint pixelBits, GLuint blockWidth, GLuint blockHeight, GLenum componentType, |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 458 | MipGenerationFunction mipFunc, ColorReadFunction readFunc) |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 459 | : mPixelBits(pixelBits), mBlockWidth(blockWidth), mBlockHeight(blockHeight), mComponentType(componentType), |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 460 | mMipGenerationFunction(mipFunc), mColorReadFunction(readFunc) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 461 | { } |
| 462 | }; |
| 463 | |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 464 | typedef std::map<DXGI_FORMAT, DXGIFormatInfo> DXGIFormatInfoMap; |
| 465 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 466 | void AddDXGIFormat(DXGIFormatInfoMap *map, DXGI_FORMAT dxgiFormat, GLuint pixelBits, GLuint blockWidth, GLuint blockHeight, |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 467 | GLenum componentType, MipGenerationFunction mipFunc, ColorReadFunction readFunc) |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 468 | { |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 469 | map->insert(std::make_pair(dxgiFormat, DXGIFormatInfo(pixelBits, blockWidth, blockHeight, componentType, mipFunc, readFunc))); |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 470 | } |
| 471 | |
| 472 | static DXGIFormatInfoMap BuildDXGIFormatInfoMap() |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 473 | { |
| 474 | DXGIFormatInfoMap map; |
| 475 | |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 476 | // | DXGI format |S |W |H |Component Type | Mip generation function | Color read function |
| 477 | AddDXGIFormat(&map, DXGI_FORMAT_UNKNOWN, 0, 0, 0, GL_NONE, NULL, NULL); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 478 | |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 479 | AddDXGIFormat(&map, DXGI_FORMAT_A8_UNORM, 8, 1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<A8>, ReadColor<A8, GLfloat>); |
| 480 | AddDXGIFormat(&map, DXGI_FORMAT_R8_UNORM, 8, 1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<R8>, ReadColor<R8, GLfloat>); |
| 481 | AddDXGIFormat(&map, DXGI_FORMAT_R8G8_UNORM, 16, 1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<R8G8>, ReadColor<R8G8, GLfloat>); |
| 482 | AddDXGIFormat(&map, DXGI_FORMAT_R8G8B8A8_UNORM, 32, 1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<R8G8B8A8>, ReadColor<R8G8B8A8, GLfloat>); |
| 483 | AddDXGIFormat(&map, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, 32, 1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<R8G8B8A8>, ReadColor<R8G8B8A8, GLfloat>); |
| 484 | AddDXGIFormat(&map, DXGI_FORMAT_B8G8R8A8_UNORM, 32, 1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<B8G8R8A8>, ReadColor<B8G8R8A8, GLfloat>); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 485 | |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 486 | AddDXGIFormat(&map, DXGI_FORMAT_R8_SNORM, 8, 1, 1, GL_SIGNED_NORMALIZED, GenerateMip<R8S>, ReadColor<R8S, GLfloat>); |
| 487 | AddDXGIFormat(&map, DXGI_FORMAT_R8G8_SNORM, 16, 1, 1, GL_SIGNED_NORMALIZED, GenerateMip<R8G8S>, ReadColor<R8G8S, GLfloat>); |
| 488 | AddDXGIFormat(&map, DXGI_FORMAT_R8G8B8A8_SNORM, 32, 1, 1, GL_SIGNED_NORMALIZED, GenerateMip<R8G8B8A8S>, ReadColor<R8G8B8A8S, GLfloat>); |
shannonwoods@chromium.org | 36d0be9 | 2013-05-30 00:15:59 +0000 | [diff] [blame] | 489 | |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 490 | AddDXGIFormat(&map, DXGI_FORMAT_R8_UINT, 8, 1, 1, GL_UNSIGNED_INT, GenerateMip<R8>, ReadColor<R8, GLuint>); |
| 491 | AddDXGIFormat(&map, DXGI_FORMAT_R16_UINT, 16, 1, 1, GL_UNSIGNED_INT, GenerateMip<R16>, ReadColor<R16, GLuint>); |
| 492 | AddDXGIFormat(&map, DXGI_FORMAT_R32_UINT, 32, 1, 1, GL_UNSIGNED_INT, GenerateMip<R32>, ReadColor<R32, GLuint>); |
| 493 | AddDXGIFormat(&map, DXGI_FORMAT_R8G8_UINT, 16, 1, 1, GL_UNSIGNED_INT, GenerateMip<R8G8>, ReadColor<R8G8, GLuint>); |
| 494 | AddDXGIFormat(&map, DXGI_FORMAT_R16G16_UINT, 32, 1, 1, GL_UNSIGNED_INT, GenerateMip<R16G16>, ReadColor<R16G16, GLuint>); |
| 495 | AddDXGIFormat(&map, DXGI_FORMAT_R32G32_UINT, 64, 1, 1, GL_UNSIGNED_INT, GenerateMip<R32G32>, ReadColor<R32G32, GLuint>); |
| 496 | AddDXGIFormat(&map, DXGI_FORMAT_R32G32B32_UINT, 96, 1, 1, GL_UNSIGNED_INT, GenerateMip<R32G32B32>, ReadColor<R32G32B32, GLuint>); |
| 497 | AddDXGIFormat(&map, DXGI_FORMAT_R8G8B8A8_UINT, 32, 1, 1, GL_UNSIGNED_INT, GenerateMip<R8G8B8A8>, ReadColor<R8G8B8A8, GLuint>); |
| 498 | AddDXGIFormat(&map, DXGI_FORMAT_R16G16B16A16_UINT, 64, 1, 1, GL_UNSIGNED_INT, GenerateMip<R16G16B16A16>, ReadColor<R16G16B16A16, GLuint>); |
| 499 | AddDXGIFormat(&map, DXGI_FORMAT_R32G32B32A32_UINT, 128, 1, 1, GL_UNSIGNED_INT, GenerateMip<R32G32B32A32>, ReadColor<R32G32B32A32, GLuint>); |
shannonwoods@chromium.org | a05127a | 2013-05-30 00:16:07 +0000 | [diff] [blame] | 500 | |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 501 | AddDXGIFormat(&map, DXGI_FORMAT_R8_SINT, 8, 1, 1, GL_INT, GenerateMip<R8S>, ReadColor<R8S, GLint>); |
| 502 | AddDXGIFormat(&map, DXGI_FORMAT_R16_SINT, 16, 1, 1, GL_INT, GenerateMip<R16S>, ReadColor<R16S, GLint>); |
| 503 | AddDXGIFormat(&map, DXGI_FORMAT_R32_SINT, 32, 1, 1, GL_INT, GenerateMip<R32S>, ReadColor<R32S, GLint>); |
| 504 | AddDXGIFormat(&map, DXGI_FORMAT_R8G8_SINT, 16, 1, 1, GL_INT, GenerateMip<R8G8S>, ReadColor<R8G8S, GLint>); |
| 505 | AddDXGIFormat(&map, DXGI_FORMAT_R16G16_SINT, 32, 1, 1, GL_INT, GenerateMip<R16G16S>, ReadColor<R16G16S, GLint>); |
| 506 | AddDXGIFormat(&map, DXGI_FORMAT_R32G32_SINT, 64, 1, 1, GL_INT, GenerateMip<R32G32S>, ReadColor<R32G32S, GLint>); |
| 507 | AddDXGIFormat(&map, DXGI_FORMAT_R32G32B32_SINT, 96, 1, 1, GL_INT, GenerateMip<R32G32B32S>, ReadColor<R32G32B32S, GLint>); |
| 508 | AddDXGIFormat(&map, DXGI_FORMAT_R8G8B8A8_SINT, 32, 1, 1, GL_INT, GenerateMip<R8G8B8A8S>, ReadColor<R8G8B8A8S, GLint>); |
| 509 | AddDXGIFormat(&map, DXGI_FORMAT_R16G16B16A16_SINT, 64, 1, 1, GL_INT, GenerateMip<R16G16B16A16S>, ReadColor<R16G16B16A16S, GLint>); |
| 510 | AddDXGIFormat(&map, DXGI_FORMAT_R32G32B32A32_SINT, 128, 1, 1, GL_INT, GenerateMip<R32G32B32A32S>, ReadColor<R32G32B32A32S, GLint>); |
shannonwoods@chromium.org | a05127a | 2013-05-30 00:16:07 +0000 | [diff] [blame] | 511 | |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 512 | AddDXGIFormat(&map, DXGI_FORMAT_R10G10B10A2_UNORM, 32, 1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<R10G10B10A2>, ReadColor<R10G10B10A2, GLfloat>); |
| 513 | AddDXGIFormat(&map, DXGI_FORMAT_R10G10B10A2_UINT, 32, 1, 1, GL_UNSIGNED_INT, GenerateMip<R10G10B10A2>, ReadColor<R10G10B10A2, GLuint>); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 514 | |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 515 | AddDXGIFormat(&map, DXGI_FORMAT_R16_FLOAT, 16, 1, 1, GL_FLOAT, GenerateMip<R16F>, ReadColor<R16F, GLfloat>); |
| 516 | AddDXGIFormat(&map, DXGI_FORMAT_R16G16_FLOAT, 32, 1, 1, GL_FLOAT, GenerateMip<R16G16F>, ReadColor<R16G16F, GLfloat>); |
| 517 | AddDXGIFormat(&map, DXGI_FORMAT_R16G16B16A16_FLOAT, 64, 1, 1, GL_FLOAT, GenerateMip<R16G16B16A16F>, ReadColor<R16G16B16A16F, GLfloat>); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 518 | |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 519 | AddDXGIFormat(&map, DXGI_FORMAT_R32_FLOAT, 32, 1, 1, GL_FLOAT, GenerateMip<R32F>, ReadColor<R32F, GLfloat>); |
| 520 | AddDXGIFormat(&map, DXGI_FORMAT_R32G32_FLOAT, 64, 1, 1, GL_FLOAT, GenerateMip<R32G32F>, ReadColor<R32G32F, GLfloat>); |
| 521 | AddDXGIFormat(&map, DXGI_FORMAT_R32G32B32_FLOAT, 96, 1, 1, GL_FLOAT, NULL, NULL); |
| 522 | AddDXGIFormat(&map, DXGI_FORMAT_R32G32B32A32_FLOAT, 128, 1, 1, GL_FLOAT, GenerateMip<R32G32B32A32F>, ReadColor<R32G32B32A32F, GLfloat>); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 523 | |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 524 | AddDXGIFormat(&map, DXGI_FORMAT_R9G9B9E5_SHAREDEXP, 32, 1, 1, GL_FLOAT, GenerateMip<R9G9B9E5>, ReadColor<R9G9B9E5, GLfloat>); |
| 525 | AddDXGIFormat(&map, DXGI_FORMAT_R11G11B10_FLOAT, 32, 1, 1, GL_FLOAT, GenerateMip<R11G11B10F>, ReadColor<R11G11B10F, GLfloat>); |
shannonwoods@chromium.org | 92b9cd5 | 2013-05-30 00:14:48 +0000 | [diff] [blame] | 526 | |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 527 | AddDXGIFormat(&map, DXGI_FORMAT_R16_TYPELESS, 16, 1, 1, GL_NONE, NULL, NULL); |
| 528 | AddDXGIFormat(&map, DXGI_FORMAT_R16_UNORM, 16, 1, 1, GL_UNSIGNED_NORMALIZED, NULL, NULL); |
| 529 | AddDXGIFormat(&map, DXGI_FORMAT_D16_UNORM, 16, 1, 1, GL_UNSIGNED_NORMALIZED, NULL, NULL); |
| 530 | AddDXGIFormat(&map, DXGI_FORMAT_R24G8_TYPELESS, 32, 1, 1, GL_NONE, NULL, NULL); |
| 531 | AddDXGIFormat(&map, DXGI_FORMAT_R24_UNORM_X8_TYPELESS, 32, 1, 1, GL_NONE, NULL, NULL); |
| 532 | AddDXGIFormat(&map, DXGI_FORMAT_D24_UNORM_S8_UINT, 32, 1, 1, GL_UNSIGNED_INT, NULL, NULL); |
| 533 | AddDXGIFormat(&map, DXGI_FORMAT_R32G8X24_TYPELESS, 64, 1, 1, GL_NONE, NULL, NULL); |
| 534 | AddDXGIFormat(&map, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, 64, 1, 1, GL_NONE, NULL, NULL); |
| 535 | AddDXGIFormat(&map, DXGI_FORMAT_D32_FLOAT_S8X24_UINT, 64, 1, 1, GL_UNSIGNED_INT, NULL, NULL); |
| 536 | AddDXGIFormat(&map, DXGI_FORMAT_R32_TYPELESS, 32, 1, 1, GL_NONE, NULL, NULL); |
| 537 | AddDXGIFormat(&map, DXGI_FORMAT_D32_FLOAT, 32, 1, 1, GL_FLOAT, NULL, NULL); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 538 | |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 539 | AddDXGIFormat(&map, DXGI_FORMAT_BC1_UNORM, 64, 4, 4, GL_UNSIGNED_NORMALIZED, NULL, NULL); |
| 540 | AddDXGIFormat(&map, DXGI_FORMAT_BC2_UNORM, 128, 4, 4, GL_UNSIGNED_NORMALIZED, NULL, NULL); |
| 541 | AddDXGIFormat(&map, DXGI_FORMAT_BC3_UNORM, 128, 4, 4, GL_UNSIGNED_NORMALIZED, NULL, NULL); |
| 542 | |
| 543 | // Useful formats for vertex buffers |
| 544 | AddDXGIFormat(&map, DXGI_FORMAT_R16_UNORM, 16, 1, 1, GL_UNSIGNED_NORMALIZED, NULL, NULL); |
| 545 | AddDXGIFormat(&map, DXGI_FORMAT_R16_SNORM, 16, 1, 1, GL_SIGNED_NORMALIZED, NULL, NULL); |
| 546 | AddDXGIFormat(&map, DXGI_FORMAT_R16G16_UNORM, 32, 1, 1, GL_UNSIGNED_NORMALIZED, NULL, NULL); |
| 547 | AddDXGIFormat(&map, DXGI_FORMAT_R16G16_SNORM, 32, 1, 1, GL_SIGNED_NORMALIZED, NULL, NULL); |
| 548 | AddDXGIFormat(&map, DXGI_FORMAT_R16G16B16A16_UNORM, 64, 1, 1, GL_UNSIGNED_NORMALIZED, NULL, NULL); |
| 549 | AddDXGIFormat(&map, DXGI_FORMAT_R16G16B16A16_SNORM, 64, 1, 1, GL_SIGNED_NORMALIZED, NULL, NULL); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 550 | |
| 551 | return map; |
| 552 | } |
| 553 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 554 | typedef std::map<DXGI_FORMAT, GLenum> DXGIToESFormatMap; |
Jamie Madill | 707dbd7 | 2013-07-10 15:13:39 -0400 | [diff] [blame] | 555 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 556 | inline void AddDXGIToESEntry(DXGIToESFormatMap *map, DXGI_FORMAT key, GLenum value) |
| 557 | { |
| 558 | map->insert(std::make_pair(key, value)); |
| 559 | } |
| 560 | |
| 561 | static DXGIToESFormatMap BuildCommonDXGIToESFormatMap() |
| 562 | { |
| 563 | DXGIToESFormatMap map; |
| 564 | |
| 565 | AddDXGIToESEntry(&map, DXGI_FORMAT_UNKNOWN, GL_NONE); |
| 566 | |
| 567 | AddDXGIToESEntry(&map, DXGI_FORMAT_A8_UNORM, GL_ALPHA8_EXT); |
| 568 | AddDXGIToESEntry(&map, DXGI_FORMAT_R8_UNORM, GL_R8); |
| 569 | AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8_UNORM, GL_RG8); |
| 570 | AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8B8A8_UNORM, GL_RGBA8); |
| 571 | AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, GL_SRGB8_ALPHA8); |
| 572 | AddDXGIToESEntry(&map, DXGI_FORMAT_B8G8R8A8_UNORM, GL_BGRA8_EXT); |
| 573 | |
| 574 | AddDXGIToESEntry(&map, DXGI_FORMAT_R8_SNORM, GL_R8_SNORM); |
| 575 | AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8_SNORM, GL_RG8_SNORM); |
| 576 | AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8B8A8_SNORM, GL_RGBA8_SNORM); |
| 577 | |
| 578 | AddDXGIToESEntry(&map, DXGI_FORMAT_R8_UINT, GL_R8UI); |
| 579 | AddDXGIToESEntry(&map, DXGI_FORMAT_R16_UINT, GL_R16UI); |
| 580 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32_UINT, GL_R32UI); |
| 581 | AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8_UINT, GL_RG8UI); |
| 582 | AddDXGIToESEntry(&map, DXGI_FORMAT_R16G16_UINT, GL_RG16UI); |
| 583 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32_UINT, GL_RG32UI); |
| 584 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32B32_UINT, GL_RGB32UI); |
| 585 | AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8B8A8_UINT, GL_RGBA8UI); |
| 586 | AddDXGIToESEntry(&map, DXGI_FORMAT_R16G16B16A16_UINT, GL_RGBA16UI); |
| 587 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32B32A32_UINT, GL_RGBA32UI); |
| 588 | |
| 589 | AddDXGIToESEntry(&map, DXGI_FORMAT_R8_SINT, GL_R8I); |
| 590 | AddDXGIToESEntry(&map, DXGI_FORMAT_R16_SINT, GL_R16I); |
| 591 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32_SINT, GL_R32I); |
| 592 | AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8_SINT, GL_RG8I); |
| 593 | AddDXGIToESEntry(&map, DXGI_FORMAT_R16G16_SINT, GL_RG16I); |
| 594 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32_SINT, GL_RG32I); |
| 595 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32B32_SINT, GL_RGB32I); |
| 596 | AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8B8A8_SINT, GL_RGBA8I); |
| 597 | AddDXGIToESEntry(&map, DXGI_FORMAT_R16G16B16A16_SINT, GL_RGBA16I); |
| 598 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32B32A32_SINT, GL_RGBA32I); |
| 599 | |
| 600 | AddDXGIToESEntry(&map, DXGI_FORMAT_R10G10B10A2_UNORM, GL_RGB10_A2); |
| 601 | AddDXGIToESEntry(&map, DXGI_FORMAT_R10G10B10A2_UINT, GL_RGB10_A2UI); |
| 602 | |
| 603 | AddDXGIToESEntry(&map, DXGI_FORMAT_R16_FLOAT, GL_R16F); |
| 604 | AddDXGIToESEntry(&map, DXGI_FORMAT_R16G16_FLOAT, GL_RG16F); |
| 605 | AddDXGIToESEntry(&map, DXGI_FORMAT_R16G16B16A16_FLOAT, GL_RGBA16F); |
| 606 | |
| 607 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32_FLOAT, GL_R32F); |
| 608 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32_FLOAT, GL_RG32F); |
| 609 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32B32_FLOAT, GL_RGB32F); |
| 610 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32B32A32_FLOAT, GL_RGBA32F); |
| 611 | |
| 612 | AddDXGIToESEntry(&map, DXGI_FORMAT_R9G9B9E5_SHAREDEXP, GL_RGB9_E5); |
| 613 | AddDXGIToESEntry(&map, DXGI_FORMAT_R11G11B10_FLOAT, GL_R11F_G11F_B10F); |
| 614 | |
| 615 | AddDXGIToESEntry(&map, DXGI_FORMAT_R16_TYPELESS, GL_DEPTH_COMPONENT16); |
| 616 | AddDXGIToESEntry(&map, DXGI_FORMAT_R16_UNORM, GL_DEPTH_COMPONENT16); |
| 617 | AddDXGIToESEntry(&map, DXGI_FORMAT_D16_UNORM, GL_DEPTH_COMPONENT16); |
| 618 | AddDXGIToESEntry(&map, DXGI_FORMAT_R24G8_TYPELESS, GL_DEPTH24_STENCIL8_OES); |
| 619 | AddDXGIToESEntry(&map, DXGI_FORMAT_R24_UNORM_X8_TYPELESS, GL_DEPTH24_STENCIL8_OES); |
| 620 | AddDXGIToESEntry(&map, DXGI_FORMAT_D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8_OES); |
| 621 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32G8X24_TYPELESS, GL_DEPTH32F_STENCIL8); |
| 622 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, GL_DEPTH32F_STENCIL8); |
| 623 | AddDXGIToESEntry(&map, DXGI_FORMAT_D32_FLOAT_S8X24_UINT, GL_DEPTH32F_STENCIL8); |
| 624 | |
| 625 | AddDXGIToESEntry(&map, DXGI_FORMAT_BC1_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT); |
| 626 | AddDXGIToESEntry(&map, DXGI_FORMAT_BC2_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE); |
| 627 | AddDXGIToESEntry(&map, DXGI_FORMAT_BC3_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE); |
Jamie Madill | 707dbd7 | 2013-07-10 15:13:39 -0400 | [diff] [blame] | 628 | |
| 629 | return map; |
| 630 | } |
| 631 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 632 | static DXGIToESFormatMap BuildDXGIToES2FormatMap() |
Jamie Madill | 707dbd7 | 2013-07-10 15:13:39 -0400 | [diff] [blame] | 633 | { |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 634 | DXGIToESFormatMap map = BuildCommonDXGIToESFormatMap(); |
Jamie Madill | 707dbd7 | 2013-07-10 15:13:39 -0400 | [diff] [blame] | 635 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 636 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32_TYPELESS, GL_DEPTH_COMPONENT32_OES); |
| 637 | AddDXGIToESEntry(&map, DXGI_FORMAT_D32_FLOAT, GL_DEPTH_COMPONENT32_OES); |
Jamie Madill | 707dbd7 | 2013-07-10 15:13:39 -0400 | [diff] [blame] | 638 | |
| 639 | return map; |
| 640 | } |
| 641 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 642 | static DXGIToESFormatMap BuildDXGIToES3FormatMap() |
Jamie Madill | 707dbd7 | 2013-07-10 15:13:39 -0400 | [diff] [blame] | 643 | { |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 644 | DXGIToESFormatMap map = BuildCommonDXGIToESFormatMap(); |
Jamie Madill | 707dbd7 | 2013-07-10 15:13:39 -0400 | [diff] [blame] | 645 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 646 | AddDXGIToESEntry(&map, DXGI_FORMAT_R32_TYPELESS, GL_DEPTH_COMPONENT32F); |
| 647 | AddDXGIToESEntry(&map, DXGI_FORMAT_D32_FLOAT, GL_DEPTH_COMPONENT32F); |
| 648 | |
| 649 | return map; |
Geoff Lang | 61e49a5 | 2013-05-29 10:22:58 -0400 | [diff] [blame] | 650 | } |
| 651 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 652 | static const DXGIFormatInfoMap &GetDXGIFormatInfoMap() |
Geoff Lang | 61e49a5 | 2013-05-29 10:22:58 -0400 | [diff] [blame] | 653 | { |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 654 | static const DXGIFormatInfoMap infoMap = BuildDXGIFormatInfoMap(); |
| 655 | return infoMap; |
| 656 | } |
| 657 | |
| 658 | static bool GetDXGIFormatInfo(DXGI_FORMAT format, DXGIFormatInfo *outFormatInfo) |
| 659 | { |
| 660 | const DXGIFormatInfoMap &infoMap = GetDXGIFormatInfoMap(); |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 661 | DXGIFormatInfoMap::const_iterator iter = infoMap.find(format); |
| 662 | if (iter != infoMap.end()) |
| 663 | { |
| 664 | if (outFormatInfo) |
| 665 | { |
| 666 | *outFormatInfo = iter->second; |
| 667 | } |
| 668 | return true; |
| 669 | } |
| 670 | else |
| 671 | { |
| 672 | return false; |
| 673 | } |
| 674 | } |
| 675 | |
Geoff Lang | 61e49a5 | 2013-05-29 10:22:58 -0400 | [diff] [blame] | 676 | static d3d11::DXGIFormatSet BuildAllDXGIFormatSet() |
| 677 | { |
| 678 | d3d11::DXGIFormatSet set; |
| 679 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 680 | const DXGIFormatInfoMap &infoMap = GetDXGIFormatInfoMap(); |
| 681 | for (DXGIFormatInfoMap::const_iterator i = infoMap.begin(); i != infoMap.end(); ++i) |
Geoff Lang | 61e49a5 | 2013-05-29 10:22:58 -0400 | [diff] [blame] | 682 | { |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 683 | set.insert(i->first); |
Geoff Lang | 61e49a5 | 2013-05-29 10:22:58 -0400 | [diff] [blame] | 684 | } |
| 685 | |
| 686 | return set; |
| 687 | } |
| 688 | |
Geoff Lang | fe28ca0 | 2013-06-04 10:10:48 -0400 | [diff] [blame] | 689 | struct D3D11FastCopyFormat |
| 690 | { |
| 691 | DXGI_FORMAT mSourceFormat; |
| 692 | GLenum mDestFormat; |
| 693 | GLenum mDestType; |
| 694 | |
| 695 | D3D11FastCopyFormat(DXGI_FORMAT sourceFormat, GLenum destFormat, GLenum destType) |
| 696 | : mSourceFormat(sourceFormat), mDestFormat(destFormat), mDestType(destType) |
| 697 | { } |
| 698 | |
| 699 | bool operator<(const D3D11FastCopyFormat& other) const |
| 700 | { |
| 701 | return memcmp(this, &other, sizeof(D3D11FastCopyFormat)) < 0; |
| 702 | } |
| 703 | }; |
| 704 | |
| 705 | typedef std::map<D3D11FastCopyFormat, ColorCopyFunction> D3D11FastCopyMap; |
| 706 | typedef std::pair<D3D11FastCopyFormat, ColorCopyFunction> D3D11FastCopyPair; |
| 707 | |
| 708 | static D3D11FastCopyMap BuildFastCopyMap() |
| 709 | { |
| 710 | D3D11FastCopyMap map; |
| 711 | |
| 712 | map.insert(D3D11FastCopyPair(D3D11FastCopyFormat(DXGI_FORMAT_B8G8R8A8_UNORM, GL_RGBA, GL_UNSIGNED_BYTE), CopyBGRAUByteToRGBAUByte)); |
| 713 | |
| 714 | return map; |
| 715 | } |
| 716 | |
Geoff Lang | d8c8613 | 2013-06-12 11:17:24 -0400 | [diff] [blame] | 717 | struct DXGIDepthStencilInfo |
| 718 | { |
| 719 | unsigned int mDepthBits; |
| 720 | unsigned int mDepthOffset; |
| 721 | unsigned int mStencilBits; |
| 722 | unsigned int mStencilOffset; |
| 723 | |
| 724 | DXGIDepthStencilInfo() |
| 725 | : mDepthBits(0), mDepthOffset(0), mStencilBits(0), mStencilOffset(0) |
| 726 | { } |
| 727 | |
| 728 | DXGIDepthStencilInfo(unsigned int depthBits, unsigned int depthOffset, unsigned int stencilBits, unsigned int stencilOffset) |
| 729 | : mDepthBits(depthBits), mDepthOffset(depthOffset), mStencilBits(stencilBits), mStencilOffset(stencilOffset) |
| 730 | { } |
| 731 | }; |
| 732 | |
| 733 | typedef std::map<DXGI_FORMAT, DXGIDepthStencilInfo> DepthStencilInfoMap; |
| 734 | typedef std::pair<DXGI_FORMAT, DXGIDepthStencilInfo> DepthStencilInfoPair; |
| 735 | |
| 736 | static DepthStencilInfoMap BuildDepthStencilInfoMap() |
| 737 | { |
| 738 | DepthStencilInfoMap map; |
| 739 | |
| 740 | map.insert(DepthStencilInfoPair(DXGI_FORMAT_R16_TYPELESS, DXGIDepthStencilInfo(16, 0, 0, 0))); |
| 741 | map.insert(DepthStencilInfoPair(DXGI_FORMAT_R16_UNORM, DXGIDepthStencilInfo(16, 0, 0, 0))); |
| 742 | map.insert(DepthStencilInfoPair(DXGI_FORMAT_D16_UNORM, DXGIDepthStencilInfo(16, 0, 0, 0))); |
| 743 | |
| 744 | map.insert(DepthStencilInfoPair(DXGI_FORMAT_R24G8_TYPELESS, DXGIDepthStencilInfo(24, 0, 8, 24))); |
| 745 | map.insert(DepthStencilInfoPair(DXGI_FORMAT_R24_UNORM_X8_TYPELESS, DXGIDepthStencilInfo(24, 0, 8, 24))); |
| 746 | map.insert(DepthStencilInfoPair(DXGI_FORMAT_D24_UNORM_S8_UINT, DXGIDepthStencilInfo(24, 0, 8, 24))); |
| 747 | |
| 748 | map.insert(DepthStencilInfoPair(DXGI_FORMAT_R32_TYPELESS, DXGIDepthStencilInfo(32, 0, 0, 0))); |
| 749 | map.insert(DepthStencilInfoPair(DXGI_FORMAT_R32_FLOAT, DXGIDepthStencilInfo(32, 0, 0, 0))); |
| 750 | map.insert(DepthStencilInfoPair(DXGI_FORMAT_D32_FLOAT, DXGIDepthStencilInfo(32, 0, 0, 0))); |
| 751 | |
| 752 | map.insert(DepthStencilInfoPair(DXGI_FORMAT_R32G8X24_TYPELESS, DXGIDepthStencilInfo(32, 0, 8, 32))); |
| 753 | map.insert(DepthStencilInfoPair(DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, DXGIDepthStencilInfo(32, 0, 8, 32))); |
| 754 | map.insert(DepthStencilInfoPair(DXGI_FORMAT_D32_FLOAT_S8X24_UINT, DXGIDepthStencilInfo(32, 0, 8, 32))); |
| 755 | |
| 756 | return map; |
| 757 | } |
| 758 | |
| 759 | static const DepthStencilInfoMap &GetDepthStencilInfoMap() |
| 760 | { |
| 761 | static const DepthStencilInfoMap infoMap = BuildDepthStencilInfoMap(); |
| 762 | return infoMap; |
| 763 | } |
| 764 | |
| 765 | bool GetDepthStencilInfo(DXGI_FORMAT format, DXGIDepthStencilInfo *outDepthStencilInfo) |
| 766 | { |
| 767 | const DepthStencilInfoMap& infoMap = GetDepthStencilInfoMap(); |
| 768 | DepthStencilInfoMap::const_iterator iter = infoMap.find(format); |
| 769 | if (iter != infoMap.end()) |
| 770 | { |
| 771 | if (outDepthStencilInfo) |
| 772 | { |
| 773 | *outDepthStencilInfo = iter->second; |
| 774 | } |
| 775 | return true; |
| 776 | } |
| 777 | else |
| 778 | { |
| 779 | return false; |
| 780 | } |
| 781 | } |
| 782 | |
Geoff Lang | 00f6bc3 | 2013-09-20 14:59:06 -0400 | [diff] [blame] | 783 | struct SwizzleSizeType |
| 784 | { |
| 785 | unsigned int mMaxComponentSize; |
| 786 | GLenum mComponentType; |
| 787 | |
| 788 | SwizzleSizeType() |
| 789 | : mMaxComponentSize(0), mComponentType(GL_NONE) |
| 790 | { } |
| 791 | |
| 792 | SwizzleSizeType(unsigned int maxComponentSize, GLenum componentType) |
| 793 | : mMaxComponentSize(maxComponentSize), mComponentType(componentType) |
| 794 | { } |
| 795 | |
| 796 | bool operator<(const SwizzleSizeType& other) const |
| 797 | { |
| 798 | return (mMaxComponentSize != other.mMaxComponentSize) ? (mMaxComponentSize < other.mMaxComponentSize) |
| 799 | : (mComponentType < other.mComponentType); |
| 800 | } |
| 801 | }; |
| 802 | |
| 803 | struct SwizzleFormatInfo |
| 804 | { |
| 805 | DXGI_FORMAT mTexFormat; |
| 806 | DXGI_FORMAT mSRVFormat; |
| 807 | DXGI_FORMAT mRTVFormat; |
| 808 | |
| 809 | SwizzleFormatInfo() |
| 810 | : mTexFormat(DXGI_FORMAT_UNKNOWN), mSRVFormat(DXGI_FORMAT_UNKNOWN), mRTVFormat(DXGI_FORMAT_UNKNOWN) |
| 811 | { } |
| 812 | |
| 813 | SwizzleFormatInfo(DXGI_FORMAT texFormat, DXGI_FORMAT srvFormat, DXGI_FORMAT rtvFormat) |
| 814 | : mTexFormat(texFormat), mSRVFormat(srvFormat), mRTVFormat(rtvFormat) |
| 815 | { } |
| 816 | }; |
| 817 | |
| 818 | typedef std::map<SwizzleSizeType, SwizzleFormatInfo> SwizzleInfoMap; |
| 819 | typedef std::pair<SwizzleSizeType, SwizzleFormatInfo> SwizzleInfoPair; |
| 820 | |
| 821 | static SwizzleInfoMap BuildSwizzleInfoMap() |
| 822 | { |
| 823 | SwizzleInfoMap map; |
| 824 | |
| 825 | map.insert(SwizzleInfoPair(SwizzleSizeType( 8, GL_UNSIGNED_NORMALIZED), SwizzleFormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM ))); |
Geoff Lang | 67938ef | 2014-01-07 16:17:21 -0500 | [diff] [blame] | 826 | map.insert(SwizzleInfoPair(SwizzleSizeType(16, GL_UNSIGNED_NORMALIZED), SwizzleFormatInfo(DXGI_FORMAT_R16G16B16A16_UNORM, DXGI_FORMAT_R16G16B16A16_UNORM, DXGI_FORMAT_R16G16B16A16_UNORM))); |
| 827 | map.insert(SwizzleInfoPair(SwizzleSizeType(24, GL_UNSIGNED_NORMALIZED), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT))); |
| 828 | map.insert(SwizzleInfoPair(SwizzleSizeType(32, GL_UNSIGNED_NORMALIZED), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT))); |
Geoff Lang | 00f6bc3 | 2013-09-20 14:59:06 -0400 | [diff] [blame] | 829 | |
| 830 | map.insert(SwizzleInfoPair(SwizzleSizeType( 8, GL_SIGNED_NORMALIZED ), SwizzleFormatInfo(DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_R8G8B8A8_SNORM ))); |
| 831 | |
| 832 | map.insert(SwizzleInfoPair(SwizzleSizeType(16, GL_FLOAT ), SwizzleFormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT))); |
| 833 | map.insert(SwizzleInfoPair(SwizzleSizeType(32, GL_FLOAT ), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT))); |
| 834 | |
| 835 | map.insert(SwizzleInfoPair(SwizzleSizeType( 8, GL_UNSIGNED_INT ), SwizzleFormatInfo(DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_R8G8B8A8_UINT ))); |
| 836 | map.insert(SwizzleInfoPair(SwizzleSizeType(16, GL_UNSIGNED_INT ), SwizzleFormatInfo(DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_UINT ))); |
| 837 | map.insert(SwizzleInfoPair(SwizzleSizeType(32, GL_UNSIGNED_INT ), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_R32G32B32A32_UINT ))); |
| 838 | |
| 839 | map.insert(SwizzleInfoPair(SwizzleSizeType( 8, GL_INT ), SwizzleFormatInfo(DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_R8G8B8A8_SINT ))); |
| 840 | map.insert(SwizzleInfoPair(SwizzleSizeType(16, GL_INT ), SwizzleFormatInfo(DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_R16G16B16A16_SINT ))); |
| 841 | map.insert(SwizzleInfoPair(SwizzleSizeType(32, GL_INT ), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_SINT, DXGI_FORMAT_R32G32B32A32_SINT, DXGI_FORMAT_R32G32B32A32_SINT ))); |
| 842 | |
| 843 | return map; |
| 844 | } |
Geoff Lang | 0c99b1b | 2013-09-30 15:07:43 -0400 | [diff] [blame] | 845 | typedef std::pair<GLint, InitializeTextureDataFunction> InternalFormatInitializerPair; |
| 846 | typedef std::map<GLint, InitializeTextureDataFunction> InternalFormatInitializerMap; |
| 847 | |
| 848 | static InternalFormatInitializerMap BuildInternalFormatInitializerMap() |
| 849 | { |
| 850 | InternalFormatInitializerMap map; |
| 851 | |
| 852 | map.insert(InternalFormatInitializerPair(GL_RGB8, initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF> )); |
| 853 | map.insert(InternalFormatInitializerPair(GL_RGB565, initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF> )); |
| 854 | map.insert(InternalFormatInitializerPair(GL_SRGB8, initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF> )); |
| 855 | map.insert(InternalFormatInitializerPair(GL_RGB16F, initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>)); |
| 856 | map.insert(InternalFormatInitializerPair(GL_RGB32F, initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, 0x00000000, gl::Float32One>)); |
| 857 | map.insert(InternalFormatInitializerPair(GL_RGB8UI, initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0x01> )); |
| 858 | map.insert(InternalFormatInitializerPair(GL_RGB8I, initialize4ComponentData<GLbyte, 0x00, 0x00, 0x00, 0x01> )); |
| 859 | map.insert(InternalFormatInitializerPair(GL_RGB16UI, initialize4ComponentData<GLushort, 0x0000, 0x0000, 0x0000, 0x0001> )); |
| 860 | map.insert(InternalFormatInitializerPair(GL_RGB16I, initialize4ComponentData<GLshort, 0x0000, 0x0000, 0x0000, 0x0001> )); |
| 861 | map.insert(InternalFormatInitializerPair(GL_RGB32UI, initialize4ComponentData<GLuint, 0x00000000, 0x00000000, 0x00000000, 0x00000001> )); |
| 862 | map.insert(InternalFormatInitializerPair(GL_RGB32I, initialize4ComponentData<GLint, 0x00000000, 0x00000000, 0x00000000, 0x00000001> )); |
| 863 | |
| 864 | return map; |
| 865 | } |
Geoff Lang | 00f6bc3 | 2013-09-20 14:59:06 -0400 | [diff] [blame] | 866 | |
| 867 | static const SwizzleInfoMap &GetSwizzleInfoMap() |
| 868 | { |
| 869 | static const SwizzleInfoMap map = BuildSwizzleInfoMap(); |
| 870 | return map; |
| 871 | } |
| 872 | |
| 873 | static const SwizzleFormatInfo GetSwizzleFormatInfo(GLint internalFormat, GLuint clientVersion) |
| 874 | { |
| 875 | // Get the maximum sized component |
Jamie Madill | 80b5a55 | 2014-01-03 10:57:11 -0500 | [diff] [blame] | 876 | unsigned int maxBits = 1; |
| 877 | |
| 878 | if (gl::IsFormatCompressed(internalFormat, clientVersion)) |
| 879 | { |
Geoff Lang | 67938ef | 2014-01-07 16:17:21 -0500 | [diff] [blame] | 880 | unsigned int compressedBitsPerBlock = gl::GetPixelBytes(internalFormat, clientVersion) * 8; |
| 881 | unsigned int blockSize = gl::GetCompressedBlockWidth(internalFormat, clientVersion) * |
| 882 | gl::GetCompressedBlockHeight(internalFormat, clientVersion); |
| 883 | maxBits = std::max(compressedBitsPerBlock / blockSize, maxBits); |
Jamie Madill | 80b5a55 | 2014-01-03 10:57:11 -0500 | [diff] [blame] | 884 | } |
| 885 | else |
| 886 | { |
| 887 | maxBits = std::max(maxBits, gl::GetAlphaBits( internalFormat, clientVersion)); |
| 888 | maxBits = std::max(maxBits, gl::GetRedBits( internalFormat, clientVersion)); |
| 889 | maxBits = std::max(maxBits, gl::GetGreenBits( internalFormat, clientVersion)); |
| 890 | maxBits = std::max(maxBits, gl::GetBlueBits( internalFormat, clientVersion)); |
| 891 | maxBits = std::max(maxBits, gl::GetLuminanceBits(internalFormat, clientVersion)); |
| 892 | maxBits = std::max(maxBits, gl::GetDepthBits( internalFormat, clientVersion)); |
| 893 | } |
| 894 | |
Geoff Lang | 00f6bc3 | 2013-09-20 14:59:06 -0400 | [diff] [blame] | 895 | maxBits = roundUp(maxBits, 8U); |
| 896 | |
| 897 | GLenum componentType = gl::GetComponentType(internalFormat, clientVersion); |
| 898 | |
| 899 | const SwizzleInfoMap &map = GetSwizzleInfoMap(); |
| 900 | SwizzleInfoMap::const_iterator iter = map.find(SwizzleSizeType(maxBits, componentType)); |
| 901 | |
| 902 | if (iter != map.end()) |
| 903 | { |
| 904 | return iter->second; |
| 905 | } |
| 906 | else |
| 907 | { |
| 908 | UNREACHABLE(); |
| 909 | static const SwizzleFormatInfo defaultFormatInfo; |
| 910 | return defaultFormatInfo; |
| 911 | } |
| 912 | } |
| 913 | |
Geoff Lang | 0c99b1b | 2013-09-30 15:07:43 -0400 | [diff] [blame] | 914 | static const InternalFormatInitializerMap &GetInternalFormatInitializerMap() |
| 915 | { |
| 916 | static const InternalFormatInitializerMap map = BuildInternalFormatInitializerMap(); |
| 917 | return map; |
| 918 | } |
| 919 | |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 920 | namespace d3d11 |
| 921 | { |
| 922 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 923 | MipGenerationFunction GetMipGenerationFunction(DXGI_FORMAT format) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 924 | { |
shannonwoods@chromium.org | ba9d750 | 2013-05-30 00:14:58 +0000 | [diff] [blame] | 925 | DXGIFormatInfo formatInfo; |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 926 | if (GetDXGIFormatInfo(format, &formatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 927 | { |
shannonwoods@chromium.org | ba9d750 | 2013-05-30 00:14:58 +0000 | [diff] [blame] | 928 | return formatInfo.mMipGenerationFunction; |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 929 | } |
| 930 | else |
| 931 | { |
| 932 | UNREACHABLE(); |
| 933 | return NULL; |
| 934 | } |
| 935 | } |
| 936 | |
Geoff Lang | 005df41 | 2013-10-16 14:12:50 -0400 | [diff] [blame] | 937 | LoadImageFunction GetImageLoadFunction(GLenum internalFormat, GLenum type, GLuint clientVersion) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 938 | { |
| 939 | if (clientVersion == 2) |
| 940 | { |
| 941 | D3D11ES2FormatInfo d3d11FormatInfo; |
Geoff Lang | 18591b7 | 2013-06-07 12:00:15 -0400 | [diff] [blame] | 942 | if (GetD3D11ES2FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 943 | { |
| 944 | return d3d11FormatInfo.mLoadImageFunction; |
| 945 | } |
| 946 | else |
| 947 | { |
| 948 | UNREACHABLE(); |
| 949 | return NULL; |
| 950 | } |
| 951 | } |
| 952 | else if (clientVersion == 3) |
| 953 | { |
| 954 | static const D3D11LoadFunctionMap loadImageMap = buildD3D11LoadFunctionMap(); |
| 955 | D3D11LoadFunctionMap::const_iterator iter = loadImageMap.find(InternalFormatTypePair(internalFormat, type)); |
| 956 | if (iter != loadImageMap.end()) |
| 957 | { |
| 958 | return iter->second; |
| 959 | } |
| 960 | else |
| 961 | { |
| 962 | UNREACHABLE(); |
| 963 | return NULL; |
| 964 | } |
| 965 | } |
| 966 | else |
| 967 | { |
| 968 | UNREACHABLE(); |
| 969 | return NULL; |
| 970 | } |
| 971 | } |
| 972 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 973 | GLuint GetFormatPixelBytes(DXGI_FORMAT format) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 974 | { |
| 975 | DXGIFormatInfo dxgiFormatInfo; |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 976 | if (GetDXGIFormatInfo(format, &dxgiFormatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 977 | { |
| 978 | return dxgiFormatInfo.mPixelBits / 8; |
| 979 | } |
| 980 | else |
| 981 | { |
| 982 | UNREACHABLE(); |
| 983 | return 0; |
| 984 | } |
| 985 | } |
| 986 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 987 | GLuint GetBlockWidth(DXGI_FORMAT format) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 988 | { |
| 989 | DXGIFormatInfo dxgiFormatInfo; |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 990 | if (GetDXGIFormatInfo(format, &dxgiFormatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 991 | { |
| 992 | return dxgiFormatInfo.mBlockWidth; |
| 993 | } |
| 994 | else |
| 995 | { |
| 996 | UNREACHABLE(); |
| 997 | return 0; |
| 998 | } |
| 999 | } |
| 1000 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 1001 | GLuint GetBlockHeight(DXGI_FORMAT format) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1002 | { |
| 1003 | DXGIFormatInfo dxgiFormatInfo; |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 1004 | if (GetDXGIFormatInfo(format, &dxgiFormatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1005 | { |
| 1006 | return dxgiFormatInfo.mBlockHeight; |
| 1007 | } |
| 1008 | else |
| 1009 | { |
| 1010 | UNREACHABLE(); |
| 1011 | return 0; |
| 1012 | } |
| 1013 | } |
| 1014 | |
Jamie Madill | 826f3d3 | 2014-01-29 09:26:49 -0500 | [diff] [blame] | 1015 | GLenum GetComponentType(DXGI_FORMAT format) |
| 1016 | { |
| 1017 | DXGIFormatInfo dxgiFormatInfo; |
| 1018 | if (GetDXGIFormatInfo(format, &dxgiFormatInfo)) |
| 1019 | { |
| 1020 | return dxgiFormatInfo.mComponentType; |
| 1021 | } |
| 1022 | else |
| 1023 | { |
| 1024 | UNREACHABLE(); |
| 1025 | return GL_NONE; |
| 1026 | } |
| 1027 | } |
| 1028 | |
Geoff Lang | d8c8613 | 2013-06-12 11:17:24 -0400 | [diff] [blame] | 1029 | GLuint GetDepthBits(DXGI_FORMAT format) |
| 1030 | { |
| 1031 | DXGIDepthStencilInfo dxgiDSInfo; |
| 1032 | if (GetDepthStencilInfo(format, &dxgiDSInfo)) |
| 1033 | { |
| 1034 | return dxgiDSInfo.mDepthBits; |
| 1035 | } |
| 1036 | else |
| 1037 | { |
| 1038 | // Since the depth stencil info map does not contain all used DXGI formats, |
| 1039 | // we should not assert that the format exists |
| 1040 | return 0; |
| 1041 | } |
| 1042 | } |
| 1043 | |
| 1044 | GLuint GetDepthOffset(DXGI_FORMAT format) |
| 1045 | { |
| 1046 | DXGIDepthStencilInfo dxgiDSInfo; |
| 1047 | if (GetDepthStencilInfo(format, &dxgiDSInfo)) |
| 1048 | { |
| 1049 | return dxgiDSInfo.mDepthOffset; |
| 1050 | } |
| 1051 | else |
| 1052 | { |
| 1053 | // Since the depth stencil info map does not contain all used DXGI formats, |
| 1054 | // we should not assert that the format exists |
| 1055 | return 0; |
| 1056 | } |
| 1057 | } |
| 1058 | |
| 1059 | GLuint GetStencilBits(DXGI_FORMAT format) |
| 1060 | { |
| 1061 | DXGIDepthStencilInfo dxgiDSInfo; |
| 1062 | if (GetDepthStencilInfo(format, &dxgiDSInfo)) |
| 1063 | { |
| 1064 | return dxgiDSInfo.mStencilBits; |
| 1065 | } |
| 1066 | else |
| 1067 | { |
| 1068 | // Since the depth stencil info map does not contain all used DXGI formats, |
| 1069 | // we should not assert that the format exists |
| 1070 | return 0; |
| 1071 | } |
| 1072 | } |
| 1073 | |
| 1074 | GLuint GetStencilOffset(DXGI_FORMAT format) |
| 1075 | { |
| 1076 | DXGIDepthStencilInfo dxgiDSInfo; |
| 1077 | if (GetDepthStencilInfo(format, &dxgiDSInfo)) |
| 1078 | { |
| 1079 | return dxgiDSInfo.mStencilOffset; |
| 1080 | } |
| 1081 | else |
| 1082 | { |
| 1083 | // Since the depth stencil info map does not contain all used DXGI formats, |
| 1084 | // we should not assert that the format exists |
| 1085 | return 0; |
| 1086 | } |
| 1087 | } |
| 1088 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 1089 | void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1090 | { |
| 1091 | DXGIFormatInfo dxgiFormatInfo; |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 1092 | if (GetDXGIFormatInfo(format, &dxgiFormatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1093 | { |
| 1094 | int upsampleCount = 0; |
| 1095 | |
| 1096 | GLsizei blockWidth = dxgiFormatInfo.mBlockWidth; |
| 1097 | GLsizei blockHeight = dxgiFormatInfo.mBlockHeight; |
| 1098 | |
| 1099 | // Don't expand the size of full textures that are at least (blockWidth x blockHeight) already. |
| 1100 | if (isImage || *requestWidth < blockWidth || *requestHeight < blockHeight) |
| 1101 | { |
| 1102 | while (*requestWidth % blockWidth != 0 || *requestHeight % blockHeight != 0) |
| 1103 | { |
| 1104 | *requestWidth <<= 1; |
| 1105 | *requestHeight <<= 1; |
| 1106 | upsampleCount++; |
| 1107 | } |
| 1108 | } |
| 1109 | *levelOffset = upsampleCount; |
| 1110 | } |
| 1111 | else |
| 1112 | { |
| 1113 | UNREACHABLE(); |
| 1114 | } |
| 1115 | } |
| 1116 | |
Geoff Lang | 61e49a5 | 2013-05-29 10:22:58 -0400 | [diff] [blame] | 1117 | const DXGIFormatSet &GetAllUsedDXGIFormats() |
| 1118 | { |
| 1119 | static DXGIFormatSet formatSet = BuildAllDXGIFormatSet(); |
| 1120 | return formatSet; |
| 1121 | } |
| 1122 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 1123 | ColorReadFunction GetColorReadFunction(DXGI_FORMAT format) |
Geoff Lang | fe28ca0 | 2013-06-04 10:10:48 -0400 | [diff] [blame] | 1124 | { |
| 1125 | DXGIFormatInfo dxgiFormatInfo; |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 1126 | if (GetDXGIFormatInfo(format, &dxgiFormatInfo)) |
Geoff Lang | fe28ca0 | 2013-06-04 10:10:48 -0400 | [diff] [blame] | 1127 | { |
| 1128 | return dxgiFormatInfo.mColorReadFunction; |
| 1129 | } |
| 1130 | else |
| 1131 | { |
| 1132 | UNREACHABLE(); |
| 1133 | return NULL; |
| 1134 | } |
| 1135 | } |
| 1136 | |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 1137 | ColorCopyFunction GetFastCopyFunction(DXGI_FORMAT sourceFormat, GLenum destFormat, GLenum destType) |
Geoff Lang | fe28ca0 | 2013-06-04 10:10:48 -0400 | [diff] [blame] | 1138 | { |
| 1139 | static const D3D11FastCopyMap fastCopyMap = BuildFastCopyMap(); |
| 1140 | D3D11FastCopyMap::const_iterator iter = fastCopyMap.find(D3D11FastCopyFormat(sourceFormat, destFormat, destType)); |
| 1141 | return (iter != fastCopyMap.end()) ? iter->second : NULL; |
| 1142 | } |
| 1143 | |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1144 | } |
| 1145 | |
| 1146 | namespace gl_d3d11 |
| 1147 | { |
| 1148 | |
Geoff Lang | 005df41 | 2013-10-16 14:12:50 -0400 | [diff] [blame] | 1149 | DXGI_FORMAT GetTexFormat(GLenum internalFormat, GLuint clientVersion) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1150 | { |
| 1151 | if (clientVersion == 2) |
| 1152 | { |
| 1153 | D3D11ES2FormatInfo d3d11FormatInfo; |
Geoff Lang | 18591b7 | 2013-06-07 12:00:15 -0400 | [diff] [blame] | 1154 | if (GetD3D11ES2FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1155 | { |
| 1156 | return d3d11FormatInfo.mTexFormat; |
| 1157 | } |
| 1158 | else |
| 1159 | { |
| 1160 | UNREACHABLE(); |
| 1161 | return DXGI_FORMAT_UNKNOWN; |
| 1162 | } |
| 1163 | } |
| 1164 | else if (clientVersion == 3) |
| 1165 | { |
| 1166 | D3D11ES3FormatInfo d3d11FormatInfo; |
Geoff Lang | 18591b7 | 2013-06-07 12:00:15 -0400 | [diff] [blame] | 1167 | if (GetD3D11ES3FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1168 | { |
| 1169 | return d3d11FormatInfo.mTexFormat; |
| 1170 | } |
| 1171 | else |
| 1172 | { |
| 1173 | UNREACHABLE(); |
| 1174 | return DXGI_FORMAT_UNKNOWN; |
| 1175 | } |
| 1176 | } |
| 1177 | else |
| 1178 | { |
| 1179 | UNREACHABLE(); |
| 1180 | return DXGI_FORMAT_UNKNOWN; |
| 1181 | } |
| 1182 | } |
| 1183 | |
Geoff Lang | 005df41 | 2013-10-16 14:12:50 -0400 | [diff] [blame] | 1184 | DXGI_FORMAT GetSRVFormat(GLenum internalFormat, GLuint clientVersion) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1185 | { |
| 1186 | if (clientVersion == 2) |
| 1187 | { |
| 1188 | D3D11ES2FormatInfo d3d11FormatInfo; |
Geoff Lang | 18591b7 | 2013-06-07 12:00:15 -0400 | [diff] [blame] | 1189 | if (GetD3D11ES2FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1190 | { |
| 1191 | return d3d11FormatInfo.mSRVFormat; |
| 1192 | } |
| 1193 | else |
| 1194 | { |
| 1195 | UNREACHABLE(); |
| 1196 | return DXGI_FORMAT_UNKNOWN; |
| 1197 | } |
| 1198 | } |
| 1199 | else if (clientVersion == 3) |
| 1200 | { |
| 1201 | D3D11ES3FormatInfo d3d11FormatInfo; |
Geoff Lang | 18591b7 | 2013-06-07 12:00:15 -0400 | [diff] [blame] | 1202 | if (GetD3D11ES3FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1203 | { |
| 1204 | return d3d11FormatInfo.mSRVFormat; |
| 1205 | } |
| 1206 | else |
| 1207 | { |
| 1208 | UNREACHABLE(); |
| 1209 | return DXGI_FORMAT_UNKNOWN; |
| 1210 | } |
| 1211 | } |
| 1212 | else |
| 1213 | { |
| 1214 | UNREACHABLE(); |
| 1215 | return DXGI_FORMAT_UNKNOWN; |
| 1216 | } |
| 1217 | } |
| 1218 | |
Geoff Lang | 005df41 | 2013-10-16 14:12:50 -0400 | [diff] [blame] | 1219 | DXGI_FORMAT GetRTVFormat(GLenum internalFormat, GLuint clientVersion) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1220 | { |
| 1221 | if (clientVersion == 2) |
| 1222 | { |
| 1223 | D3D11ES2FormatInfo d3d11FormatInfo; |
Geoff Lang | 18591b7 | 2013-06-07 12:00:15 -0400 | [diff] [blame] | 1224 | if (GetD3D11ES2FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1225 | { |
| 1226 | return d3d11FormatInfo.mRTVFormat; |
| 1227 | } |
| 1228 | else |
| 1229 | { |
| 1230 | UNREACHABLE(); |
| 1231 | return DXGI_FORMAT_UNKNOWN; |
| 1232 | } |
| 1233 | } |
| 1234 | else if (clientVersion == 3) |
| 1235 | { |
| 1236 | D3D11ES3FormatInfo d3d11FormatInfo; |
Geoff Lang | 18591b7 | 2013-06-07 12:00:15 -0400 | [diff] [blame] | 1237 | if (GetD3D11ES3FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1238 | { |
| 1239 | return d3d11FormatInfo.mRTVFormat; |
| 1240 | } |
| 1241 | else |
| 1242 | { |
| 1243 | UNREACHABLE(); |
| 1244 | return DXGI_FORMAT_UNKNOWN; |
| 1245 | } |
| 1246 | } |
| 1247 | else |
| 1248 | { |
| 1249 | UNREACHABLE(); |
| 1250 | return DXGI_FORMAT_UNKNOWN; |
| 1251 | } |
| 1252 | } |
| 1253 | |
Geoff Lang | 005df41 | 2013-10-16 14:12:50 -0400 | [diff] [blame] | 1254 | DXGI_FORMAT GetDSVFormat(GLenum internalFormat, GLuint clientVersion) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1255 | { |
| 1256 | if (clientVersion == 2) |
| 1257 | { |
| 1258 | D3D11ES2FormatInfo d3d11FormatInfo; |
Geoff Lang | 18591b7 | 2013-06-07 12:00:15 -0400 | [diff] [blame] | 1259 | if (GetD3D11ES2FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1260 | { |
| 1261 | return d3d11FormatInfo.mDSVFormat; |
| 1262 | } |
| 1263 | else |
| 1264 | { |
| 1265 | return DXGI_FORMAT_UNKNOWN; |
| 1266 | } |
| 1267 | } |
| 1268 | else if (clientVersion == 3) |
| 1269 | { |
| 1270 | D3D11ES3FormatInfo d3d11FormatInfo; |
Geoff Lang | 18591b7 | 2013-06-07 12:00:15 -0400 | [diff] [blame] | 1271 | if (GetD3D11ES3FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo)) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1272 | { |
| 1273 | return d3d11FormatInfo.mDSVFormat; |
| 1274 | } |
| 1275 | else |
| 1276 | { |
| 1277 | return DXGI_FORMAT_UNKNOWN; |
| 1278 | } |
| 1279 | } |
| 1280 | else |
| 1281 | { |
| 1282 | UNREACHABLE(); |
| 1283 | return DXGI_FORMAT_UNKNOWN; |
| 1284 | } |
| 1285 | } |
| 1286 | |
Shannon Woods | dd4674f | 2013-07-08 10:32:15 -0400 | [diff] [blame] | 1287 | // Given a GL internal format, this function returns the DSV format if it is depth- or stencil-renderable, |
| 1288 | // the RTV format if it is color-renderable, and the (nonrenderable) texture format otherwise. |
Geoff Lang | 005df41 | 2013-10-16 14:12:50 -0400 | [diff] [blame] | 1289 | DXGI_FORMAT GetRenderableFormat(GLenum internalFormat, GLuint clientVersion) |
Shannon Woods | dd4674f | 2013-07-08 10:32:15 -0400 | [diff] [blame] | 1290 | { |
| 1291 | DXGI_FORMAT targetFormat = GetDSVFormat(internalFormat, clientVersion); |
| 1292 | if (targetFormat == DXGI_FORMAT_UNKNOWN) |
| 1293 | targetFormat = GetRTVFormat(internalFormat, clientVersion); |
| 1294 | if (targetFormat == DXGI_FORMAT_UNKNOWN) |
| 1295 | targetFormat = GetTexFormat(internalFormat, clientVersion); |
| 1296 | |
| 1297 | return targetFormat; |
| 1298 | } |
| 1299 | |
Geoff Lang | 00f6bc3 | 2013-09-20 14:59:06 -0400 | [diff] [blame] | 1300 | DXGI_FORMAT GetSwizzleTexFormat(GLint internalFormat, const Renderer *renderer) |
| 1301 | { |
| 1302 | GLuint clientVersion = renderer->getCurrentClientVersion(); |
| 1303 | if (gl::GetComponentCount(internalFormat, clientVersion) != 4 || !gl::IsColorRenderingSupported(internalFormat, renderer)) |
| 1304 | { |
| 1305 | const SwizzleFormatInfo &swizzleInfo = GetSwizzleFormatInfo(internalFormat, clientVersion); |
| 1306 | return swizzleInfo.mTexFormat; |
| 1307 | } |
| 1308 | else |
| 1309 | { |
| 1310 | return GetTexFormat(internalFormat, clientVersion); |
| 1311 | } |
| 1312 | } |
| 1313 | |
| 1314 | DXGI_FORMAT GetSwizzleSRVFormat(GLint internalFormat, const Renderer *renderer) |
| 1315 | { |
| 1316 | GLuint clientVersion = renderer->getCurrentClientVersion(); |
| 1317 | if (gl::GetComponentCount(internalFormat, clientVersion) != 4 || !gl::IsColorRenderingSupported(internalFormat, renderer)) |
| 1318 | { |
| 1319 | const SwizzleFormatInfo &swizzleInfo = GetSwizzleFormatInfo(internalFormat, clientVersion); |
| 1320 | return swizzleInfo.mSRVFormat; |
| 1321 | } |
| 1322 | else |
| 1323 | { |
| 1324 | return GetTexFormat(internalFormat, clientVersion); |
| 1325 | } |
| 1326 | } |
| 1327 | |
| 1328 | DXGI_FORMAT GetSwizzleRTVFormat(GLint internalFormat, const Renderer *renderer) |
| 1329 | { |
| 1330 | GLuint clientVersion = renderer->getCurrentClientVersion(); |
| 1331 | if (gl::GetComponentCount(internalFormat, clientVersion) != 4 || !gl::IsColorRenderingSupported(internalFormat, renderer)) |
| 1332 | { |
| 1333 | const SwizzleFormatInfo &swizzleInfo = GetSwizzleFormatInfo(internalFormat, clientVersion); |
| 1334 | return swizzleInfo.mRTVFormat; |
| 1335 | } |
| 1336 | else |
| 1337 | { |
| 1338 | return GetTexFormat(internalFormat, clientVersion); |
| 1339 | } |
| 1340 | } |
| 1341 | |
Geoff Lang | 0c99b1b | 2013-09-30 15:07:43 -0400 | [diff] [blame] | 1342 | bool RequiresTextureDataInitialization(GLint internalFormat) |
| 1343 | { |
| 1344 | const InternalFormatInitializerMap &map = GetInternalFormatInitializerMap(); |
| 1345 | return map.find(internalFormat) != map.end(); |
| 1346 | } |
| 1347 | |
| 1348 | InitializeTextureDataFunction GetTextureDataInitializationFunction(GLint internalFormat) |
| 1349 | { |
| 1350 | const InternalFormatInitializerMap &map = GetInternalFormatInitializerMap(); |
| 1351 | InternalFormatInitializerMap::const_iterator iter = map.find(internalFormat); |
| 1352 | if (iter != map.end()) |
| 1353 | { |
| 1354 | return iter->second; |
| 1355 | } |
| 1356 | else |
| 1357 | { |
| 1358 | UNREACHABLE(); |
| 1359 | return NULL; |
| 1360 | } |
| 1361 | } |
| 1362 | |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1363 | struct D3D11VertexFormatInfo |
| 1364 | { |
| 1365 | rx::VertexConversionType mConversionType; |
| 1366 | DXGI_FORMAT mNativeFormat; |
| 1367 | VertexCopyFunction mCopyFunction; |
| 1368 | |
| 1369 | D3D11VertexFormatInfo() |
| 1370 | : mConversionType(VERTEX_CONVERT_NONE), |
| 1371 | mNativeFormat(DXGI_FORMAT_UNKNOWN), |
| 1372 | mCopyFunction(NULL) |
| 1373 | {} |
| 1374 | |
| 1375 | D3D11VertexFormatInfo(VertexConversionType conversionType, DXGI_FORMAT nativeFormat, VertexCopyFunction copyFunction) |
| 1376 | : mConversionType(conversionType), |
| 1377 | mNativeFormat(nativeFormat), |
| 1378 | mCopyFunction(copyFunction) |
| 1379 | {} |
| 1380 | }; |
| 1381 | |
| 1382 | typedef std::map<gl::VertexFormat, D3D11VertexFormatInfo> D3D11VertexFormatInfoMap; |
| 1383 | |
| 1384 | typedef std::pair<gl::VertexFormat, D3D11VertexFormatInfo> D3D11VertexFormatPair; |
| 1385 | |
| 1386 | static void addVertexFormatInfo(D3D11VertexFormatInfoMap *map, GLenum inputType, GLboolean normalized, GLuint componentCount, |
| 1387 | VertexConversionType conversionType, DXGI_FORMAT nativeFormat, VertexCopyFunction copyFunction) |
| 1388 | { |
| 1389 | gl::VertexFormat inputFormat(inputType, normalized, componentCount, false); |
| 1390 | map->insert(D3D11VertexFormatPair(inputFormat, D3D11VertexFormatInfo(conversionType, nativeFormat, copyFunction))); |
| 1391 | } |
| 1392 | |
| 1393 | static void addIntegerVertexFormatInfo(D3D11VertexFormatInfoMap *map, GLenum inputType, GLuint componentCount, |
| 1394 | VertexConversionType conversionType, DXGI_FORMAT nativeFormat, VertexCopyFunction copyFunction) |
| 1395 | { |
| 1396 | gl::VertexFormat inputFormat(inputType, GL_FALSE, componentCount, true); |
| 1397 | map->insert(D3D11VertexFormatPair(inputFormat, D3D11VertexFormatInfo(conversionType, nativeFormat, copyFunction))); |
| 1398 | } |
| 1399 | |
| 1400 | static D3D11VertexFormatInfoMap BuildD3D11VertexFormatInfoMap() |
| 1401 | { |
| 1402 | D3D11VertexFormatInfoMap map; |
| 1403 | |
| 1404 | // TODO: column legend |
| 1405 | |
| 1406 | // |
| 1407 | // Float formats |
| 1408 | // |
| 1409 | |
| 1410 | // GL_BYTE -- un-normalized |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1411 | addVertexFormatInfo(&map, GL_BYTE, GL_FALSE, 1, VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_SINT, ©VertexData<GLbyte, 1, 0>); |
| 1412 | addVertexFormatInfo(&map, GL_BYTE, GL_FALSE, 2, VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_SINT, ©VertexData<GLbyte, 2, 0>); |
Jamie Madill | ca442ba | 2014-03-05 09:53:30 -0500 | [diff] [blame] | 1413 | addVertexFormatInfo(&map, GL_BYTE, GL_FALSE, 3, VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_SINT, ©VertexData<GLbyte, 3, 1>); |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1414 | addVertexFormatInfo(&map, GL_BYTE, GL_FALSE, 4, VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_SINT, ©VertexData<GLbyte, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1415 | |
| 1416 | // GL_BYTE -- normalized |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1417 | addVertexFormatInfo(&map, GL_BYTE, GL_TRUE, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SNORM, ©VertexData<GLbyte, 1, 0>); |
| 1418 | addVertexFormatInfo(&map, GL_BYTE, GL_TRUE, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SNORM, ©VertexData<GLbyte, 2, 0>); |
| 1419 | addVertexFormatInfo(&map, GL_BYTE, GL_TRUE, 3, VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SNORM, ©VertexData<GLbyte, 3, INT8_MAX>); |
| 1420 | addVertexFormatInfo(&map, GL_BYTE, GL_TRUE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SNORM, ©VertexData<GLbyte, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1421 | |
| 1422 | // GL_UNSIGNED_BYTE -- un-normalized |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1423 | addVertexFormatInfo(&map, GL_UNSIGNED_BYTE, GL_FALSE, 1, VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_UINT, ©VertexData<GLubyte, 1, 0>); |
| 1424 | addVertexFormatInfo(&map, GL_UNSIGNED_BYTE, GL_FALSE, 2, VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_UINT, ©VertexData<GLubyte, 2, 0>); |
Jamie Madill | ca442ba | 2014-03-05 09:53:30 -0500 | [diff] [blame] | 1425 | addVertexFormatInfo(&map, GL_UNSIGNED_BYTE, GL_FALSE, 3, VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT, ©VertexData<GLubyte, 3, 1>); |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1426 | addVertexFormatInfo(&map, GL_UNSIGNED_BYTE, GL_FALSE, 4, VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_UINT, ©VertexData<GLubyte, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1427 | |
| 1428 | // GL_UNSIGNED_BYTE -- normalized |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1429 | addVertexFormatInfo(&map, GL_UNSIGNED_BYTE, GL_TRUE, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UNORM, ©VertexData<GLubyte, 1, 0>); |
| 1430 | addVertexFormatInfo(&map, GL_UNSIGNED_BYTE, GL_TRUE, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UNORM, ©VertexData<GLubyte, 2, 0>); |
| 1431 | addVertexFormatInfo(&map, GL_UNSIGNED_BYTE, GL_TRUE, 3, VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM, ©VertexData<GLubyte, 3, UINT8_MAX>); |
| 1432 | addVertexFormatInfo(&map, GL_UNSIGNED_BYTE, GL_TRUE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UNORM, ©VertexData<GLubyte, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1433 | |
| 1434 | // GL_SHORT -- un-normalized |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1435 | addVertexFormatInfo(&map, GL_SHORT, GL_FALSE, 1, VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_SINT, ©VertexData<GLshort, 1, 0>); |
| 1436 | addVertexFormatInfo(&map, GL_SHORT, GL_FALSE, 2, VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_SINT, ©VertexData<GLshort, 2, 0>); |
Jamie Madill | ca442ba | 2014-03-05 09:53:30 -0500 | [diff] [blame] | 1437 | addVertexFormatInfo(&map, GL_SHORT, GL_FALSE, 3, VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT, ©VertexData<GLshort, 4, 1>); |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1438 | addVertexFormatInfo(&map, GL_SHORT, GL_FALSE, 4, VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_SINT, ©VertexData<GLshort, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1439 | |
| 1440 | // GL_SHORT -- normalized |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1441 | addVertexFormatInfo(&map, GL_SHORT, GL_TRUE, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SNORM, ©VertexData<GLshort, 1, 0>); |
| 1442 | addVertexFormatInfo(&map, GL_SHORT, GL_TRUE, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SNORM, ©VertexData<GLshort, 2, 0>); |
| 1443 | addVertexFormatInfo(&map, GL_SHORT, GL_TRUE, 3, VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM, ©VertexData<GLshort, 3, INT16_MAX>); |
| 1444 | addVertexFormatInfo(&map, GL_SHORT, GL_TRUE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SNORM, ©VertexData<GLshort, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1445 | |
| 1446 | // GL_UNSIGNED_SHORT -- un-normalized |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1447 | addVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_FALSE, 1, VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_UINT, ©VertexData<GLushort, 1, 0>); |
| 1448 | addVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_FALSE, 2, VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_UINT, ©VertexData<GLushort, 2, 0>); |
Jamie Madill | ca442ba | 2014-03-05 09:53:30 -0500 | [diff] [blame] | 1449 | addVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_FALSE, 3, VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_UINT, ©VertexData<GLushort, 3, 1>); |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1450 | addVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_FALSE, 4, VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_UINT, ©VertexData<GLushort, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1451 | |
| 1452 | // GL_UNSIGNED_SHORT -- normalized |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1453 | addVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_TRUE, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UNORM, ©VertexData<GLushort, 1, 0>); |
| 1454 | addVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_TRUE, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UNORM, ©VertexData<GLushort, 2, 0>); |
| 1455 | addVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_TRUE, 3, VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UNORM, ©VertexData<GLushort, 3, UINT16_MAX>); |
| 1456 | addVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_TRUE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UNORM, ©VertexData<GLushort, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1457 | |
| 1458 | // GL_INT -- un-normalized |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1459 | addVertexFormatInfo(&map, GL_INT, GL_FALSE, 1, VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_SINT, ©VertexData<GLint, 1, 0>); |
| 1460 | addVertexFormatInfo(&map, GL_INT, GL_FALSE, 2, VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_SINT, ©VertexData<GLint, 2, 0>); |
| 1461 | addVertexFormatInfo(&map, GL_INT, GL_FALSE, 3, VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_SINT, ©VertexData<GLint, 3, 0>); |
| 1462 | addVertexFormatInfo(&map, GL_INT, GL_FALSE, 4, VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_SINT, ©VertexData<GLint, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1463 | |
| 1464 | // GL_INT -- normalized |
| 1465 | addVertexFormatInfo(&map, GL_INT, GL_TRUE, 1, VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT, ©ToFloatVertexData<GLint, 1, true>); |
| 1466 | addVertexFormatInfo(&map, GL_INT, GL_TRUE, 2, VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, ©ToFloatVertexData<GLint, 2, true>); |
| 1467 | addVertexFormatInfo(&map, GL_INT, GL_TRUE, 3, VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, ©ToFloatVertexData<GLint, 3, true>); |
| 1468 | addVertexFormatInfo(&map, GL_INT, GL_TRUE, 4, VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, ©ToFloatVertexData<GLint, 4, true>); |
| 1469 | |
| 1470 | // GL_UNSIGNED_INT -- un-normalized |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1471 | addVertexFormatInfo(&map, GL_UNSIGNED_INT, GL_FALSE, 1, VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_UINT, ©VertexData<GLuint, 1, 0>); |
| 1472 | addVertexFormatInfo(&map, GL_UNSIGNED_INT, GL_FALSE, 2, VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_UINT, ©VertexData<GLuint, 2, 0>); |
| 1473 | addVertexFormatInfo(&map, GL_UNSIGNED_INT, GL_FALSE, 3, VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_UINT, ©VertexData<GLuint, 3, 0>); |
| 1474 | addVertexFormatInfo(&map, GL_UNSIGNED_INT, GL_FALSE, 4, VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_UINT, ©VertexData<GLuint, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1475 | |
| 1476 | // GL_UNSIGNED_INT -- normalized |
| 1477 | addVertexFormatInfo(&map, GL_UNSIGNED_INT, GL_TRUE, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_FLOAT, ©ToFloatVertexData<GLuint, 1, true>); |
| 1478 | addVertexFormatInfo(&map, GL_UNSIGNED_INT, GL_TRUE, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_FLOAT, ©ToFloatVertexData<GLuint, 2, true>); |
| 1479 | addVertexFormatInfo(&map, GL_UNSIGNED_INT, GL_TRUE, 3, VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, ©ToFloatVertexData<GLuint, 3, true>); |
| 1480 | addVertexFormatInfo(&map, GL_UNSIGNED_INT, GL_TRUE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_FLOAT, ©ToFloatVertexData<GLuint, 4, true>); |
| 1481 | |
| 1482 | // GL_FIXED |
| 1483 | addVertexFormatInfo(&map, GL_FIXED, GL_FALSE, 1, VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT, ©FixedVertexData<1>); |
| 1484 | addVertexFormatInfo(&map, GL_FIXED, GL_FALSE, 2, VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, ©FixedVertexData<2>); |
| 1485 | addVertexFormatInfo(&map, GL_FIXED, GL_FALSE, 3, VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, ©FixedVertexData<3>); |
| 1486 | addVertexFormatInfo(&map, GL_FIXED, GL_FALSE, 4, VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, ©FixedVertexData<4>); |
| 1487 | |
| 1488 | // GL_HALF_FLOAT |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1489 | addVertexFormatInfo(&map, GL_HALF_FLOAT, GL_FALSE, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_FLOAT, ©VertexData<GLhalf, 1, 0>); |
| 1490 | addVertexFormatInfo(&map, GL_HALF_FLOAT, GL_FALSE, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_FLOAT, ©VertexData<GLhalf, 2, 0>); |
| 1491 | addVertexFormatInfo(&map, GL_HALF_FLOAT, GL_FALSE, 3, VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_FLOAT, ©VertexData<GLhalf, 3, gl::Float16One>); |
| 1492 | addVertexFormatInfo(&map, GL_HALF_FLOAT, GL_FALSE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_FLOAT, ©VertexData<GLhalf, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1493 | |
| 1494 | // GL_FLOAT |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1495 | addVertexFormatInfo(&map, GL_FLOAT, GL_FALSE, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_FLOAT, ©VertexData<GLfloat, 1, 0>); |
| 1496 | addVertexFormatInfo(&map, GL_FLOAT, GL_FALSE, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_FLOAT, ©VertexData<GLfloat, 2, 0>); |
| 1497 | addVertexFormatInfo(&map, GL_FLOAT, GL_FALSE, 3, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_FLOAT, ©VertexData<GLfloat, 3, 0>); |
| 1498 | addVertexFormatInfo(&map, GL_FLOAT, GL_FALSE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_FLOAT, ©VertexData<GLfloat, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1499 | |
| 1500 | // GL_INT_2_10_10_10_REV |
| 1501 | addVertexFormatInfo(&map, GL_INT_2_10_10_10_REV, GL_FALSE, 4, VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, ©PackedVertexData<true, false, true>); |
| 1502 | addVertexFormatInfo(&map, GL_INT_2_10_10_10_REV, GL_TRUE, 4, VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, ©PackedVertexData<true, true, true>); |
| 1503 | |
| 1504 | // GL_UNSIGNED_INT_2_10_10_10_REV |
Jamie Madill | 0c66720 | 2014-03-17 10:06:09 -0400 | [diff] [blame] | 1505 | addVertexFormatInfo(&map, GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 4, VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, ©PackedVertexData<false, false, true>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1506 | addVertexFormatInfo(&map, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UNORM, ©PackedUnsignedVertexData); |
| 1507 | |
| 1508 | // |
| 1509 | // Integer Formats |
| 1510 | // |
| 1511 | |
| 1512 | // GL_BYTE |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1513 | addIntegerVertexFormatInfo(&map, GL_BYTE, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SINT, ©VertexData<GLbyte, 1, 0>); |
| 1514 | addIntegerVertexFormatInfo(&map, GL_BYTE, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SINT, ©VertexData<GLbyte, 2, 0>); |
| 1515 | addIntegerVertexFormatInfo(&map, GL_BYTE, 3, VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SINT, ©VertexData<GLbyte, 3, 1>); |
| 1516 | addIntegerVertexFormatInfo(&map, GL_BYTE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SINT, ©VertexData<GLbyte, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1517 | |
| 1518 | // GL_UNSIGNED_BYTE |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1519 | addIntegerVertexFormatInfo(&map, GL_UNSIGNED_BYTE, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UINT, ©VertexData<GLubyte, 1, 0>); |
| 1520 | addIntegerVertexFormatInfo(&map, GL_UNSIGNED_BYTE, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UINT, ©VertexData<GLubyte, 2, 0>); |
| 1521 | addIntegerVertexFormatInfo(&map, GL_UNSIGNED_BYTE, 3, VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UINT, ©VertexData<GLubyte, 3, 1>); |
| 1522 | addIntegerVertexFormatInfo(&map, GL_UNSIGNED_BYTE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UINT, ©VertexData<GLubyte, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1523 | |
| 1524 | // GL_SHORT |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1525 | addIntegerVertexFormatInfo(&map, GL_SHORT, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SINT, ©VertexData<GLshort, 1, 0>); |
| 1526 | addIntegerVertexFormatInfo(&map, GL_SHORT, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SINT, ©VertexData<GLshort, 2, 0>); |
| 1527 | addIntegerVertexFormatInfo(&map, GL_SHORT, 3, VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT, ©VertexData<GLshort, 3, 1>); |
| 1528 | addIntegerVertexFormatInfo(&map, GL_SHORT, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SINT, ©VertexData<GLshort, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1529 | |
| 1530 | // GL_UNSIGNED_SHORT |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1531 | addIntegerVertexFormatInfo(&map, GL_UNSIGNED_SHORT, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UINT, ©VertexData<GLushort, 1, 0>); |
| 1532 | addIntegerVertexFormatInfo(&map, GL_UNSIGNED_SHORT, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UINT, ©VertexData<GLushort, 2, 0>); |
| 1533 | addIntegerVertexFormatInfo(&map, GL_UNSIGNED_SHORT, 3, VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UINT, ©VertexData<GLushort, 3, 1>); |
| 1534 | addIntegerVertexFormatInfo(&map, GL_UNSIGNED_SHORT, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UINT, ©VertexData<GLushort, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1535 | |
| 1536 | // GL_INT |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1537 | addIntegerVertexFormatInfo(&map, GL_INT, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT, ©VertexData<GLint, 1, 0>); |
| 1538 | addIntegerVertexFormatInfo(&map, GL_INT, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT, ©VertexData<GLint, 2, 0>); |
| 1539 | addIntegerVertexFormatInfo(&map, GL_INT, 3, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT, ©VertexData<GLint, 3, 0>); |
| 1540 | addIntegerVertexFormatInfo(&map, GL_INT, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT, ©VertexData<GLint, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1541 | |
| 1542 | // GL_UNSIGNED_INT |
Jamie Madill | 2f61229 | 2014-03-05 09:53:29 -0500 | [diff] [blame] | 1543 | addIntegerVertexFormatInfo(&map, GL_UNSIGNED_INT, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT, ©VertexData<GLuint, 1, 0>); |
| 1544 | addIntegerVertexFormatInfo(&map, GL_UNSIGNED_INT, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT, ©VertexData<GLuint, 2, 0>); |
| 1545 | addIntegerVertexFormatInfo(&map, GL_UNSIGNED_INT, 3, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT, ©VertexData<GLuint, 3, 0>); |
| 1546 | addIntegerVertexFormatInfo(&map, GL_UNSIGNED_INT, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT, ©VertexData<GLuint, 4, 0>); |
Jamie Madill | 7ab02fa | 2014-02-04 16:04:08 -0500 | [diff] [blame] | 1547 | |
| 1548 | // GL_INT_2_10_10_10_REV |
| 1549 | addIntegerVertexFormatInfo(&map, GL_INT_2_10_10_10_REV, 4, VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT, ©PackedVertexData<true, true, false>); |
| 1550 | |
| 1551 | // GL_UNSIGNED_INT_2_10_10_10_REV |
| 1552 | addIntegerVertexFormatInfo(&map, GL_UNSIGNED_INT_2_10_10_10_REV, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UINT, ©PackedUnsignedVertexData); |
| 1553 | |
| 1554 | return map; |
| 1555 | } |
| 1556 | |
| 1557 | static bool GetD3D11VertexFormatInfo(const gl::VertexFormat &vertexFormat, D3D11VertexFormatInfo *outVertexFormatInfo) |
| 1558 | { |
| 1559 | static const D3D11VertexFormatInfoMap vertexFormatMap = BuildD3D11VertexFormatInfoMap(); |
| 1560 | |
| 1561 | D3D11VertexFormatInfoMap::const_iterator iter = vertexFormatMap.find(vertexFormat); |
| 1562 | if (iter != vertexFormatMap.end()) |
| 1563 | { |
| 1564 | if (outVertexFormatInfo) |
| 1565 | { |
| 1566 | *outVertexFormatInfo = iter->second; |
| 1567 | } |
| 1568 | return true; |
| 1569 | } |
| 1570 | else |
| 1571 | { |
| 1572 | return false; |
| 1573 | } |
| 1574 | } |
| 1575 | |
| 1576 | VertexCopyFunction GetVertexCopyFunction(const gl::VertexFormat &vertexFormat) |
| 1577 | { |
| 1578 | D3D11VertexFormatInfo vertexFormatInfo; |
| 1579 | if (GetD3D11VertexFormatInfo(vertexFormat, &vertexFormatInfo)) |
| 1580 | { |
| 1581 | return vertexFormatInfo.mCopyFunction; |
| 1582 | } |
| 1583 | else |
| 1584 | { |
| 1585 | UNREACHABLE(); |
| 1586 | return NULL; |
| 1587 | } |
| 1588 | } |
| 1589 | |
| 1590 | size_t GetVertexElementSize(const gl::VertexFormat &vertexFormat) |
| 1591 | { |
| 1592 | D3D11VertexFormatInfo vertexFormatInfo; |
| 1593 | if (GetD3D11VertexFormatInfo(vertexFormat, &vertexFormatInfo)) |
| 1594 | { |
| 1595 | // FIXME: should not need a client version, and is not a pixel! |
| 1596 | return d3d11::GetFormatPixelBytes(vertexFormatInfo.mNativeFormat); |
| 1597 | } |
| 1598 | else |
| 1599 | { |
| 1600 | UNREACHABLE(); |
| 1601 | return 0; |
| 1602 | } |
| 1603 | } |
| 1604 | |
| 1605 | rx::VertexConversionType GetVertexConversionType(const gl::VertexFormat &vertexFormat) |
| 1606 | { |
| 1607 | D3D11VertexFormatInfo vertexFormatInfo; |
| 1608 | if (GetD3D11VertexFormatInfo(vertexFormat, &vertexFormatInfo)) |
| 1609 | { |
| 1610 | return vertexFormatInfo.mConversionType; |
| 1611 | } |
| 1612 | else |
| 1613 | { |
| 1614 | UNREACHABLE(); |
| 1615 | return VERTEX_CONVERT_NONE; |
| 1616 | } |
| 1617 | } |
| 1618 | |
| 1619 | DXGI_FORMAT GetNativeVertexFormat(const gl::VertexFormat &vertexFormat) |
| 1620 | { |
| 1621 | D3D11VertexFormatInfo vertexFormatInfo; |
| 1622 | if (GetD3D11VertexFormatInfo(vertexFormat, &vertexFormatInfo)) |
| 1623 | { |
| 1624 | return vertexFormatInfo.mNativeFormat; |
| 1625 | } |
| 1626 | else |
| 1627 | { |
| 1628 | UNREACHABLE(); |
| 1629 | return DXGI_FORMAT_UNKNOWN; |
| 1630 | } |
| 1631 | } |
| 1632 | |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1633 | } |
| 1634 | |
| 1635 | namespace d3d11_gl |
| 1636 | { |
| 1637 | |
Geoff Lang | 005df41 | 2013-10-16 14:12:50 -0400 | [diff] [blame] | 1638 | GLenum GetInternalFormat(DXGI_FORMAT format, GLuint clientVersion) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1639 | { |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 1640 | if (clientVersion == 2) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1641 | { |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 1642 | static DXGIToESFormatMap es2FormatMap = BuildDXGIToES2FormatMap(); |
| 1643 | auto formatIt = es2FormatMap.find(format); |
| 1644 | if (formatIt != es2FormatMap.end()) |
| 1645 | { |
| 1646 | return formatIt->second; |
| 1647 | } |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1648 | } |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 1649 | else if (clientVersion == 3) |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1650 | { |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 1651 | static DXGIToESFormatMap es3FormatMap = BuildDXGIToES3FormatMap(); |
| 1652 | auto formatIt = es3FormatMap.find(format); |
| 1653 | if (formatIt != es3FormatMap.end()) |
| 1654 | { |
| 1655 | return formatIt->second; |
| 1656 | } |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1657 | } |
Jamie Madill | 9eeecfc | 2014-01-29 09:26:48 -0500 | [diff] [blame] | 1658 | |
| 1659 | UNREACHABLE(); |
| 1660 | return GL_NONE; |
shannonwoods@chromium.org | b8490f3 | 2013-05-30 00:08:00 +0000 | [diff] [blame] | 1661 | } |
| 1662 | |
| 1663 | } |
| 1664 | |
| 1665 | } |