Skip to content

Commit

Permalink
Fix RGBA/BGRA d3d11 support
Browse files Browse the repository at this point in the history
  • Loading branch information
fasterthanlime committed Feb 18, 2017
1 parent 3f5be8d commit fd9682d
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 14 deletions.
5 changes: 3 additions & 2 deletions libcapsule/include/capsule/constants.h
Expand Up @@ -3,8 +3,9 @@
#include "platform.h"

typedef enum capsule_pix_fmt_t {
CAPSULE_PIX_FMT_RGBA = 40069,
CAPSULE_PIX_FMT_BGRA = 40070
CAPSULE_PIX_FMT_RGBA = 40069,
CAPSULE_PIX_FMT_BGRA = 40070,
CAPSULE_PIX_FMT_UNKNOWN = 49999,
} capsule_pix_fmt_t;

#include "opengl-constants.h"
9 changes: 8 additions & 1 deletion libcapsule/src/windows/d3d11-capture.cpp
Expand Up @@ -244,7 +244,14 @@ void d3d11_capture(void *swap_ptr, void *backbuffer_ptr) {
}

if (first_frame) {
capsule_write_video_format(data.cx, data.cy, CAPSULE_PIX_FMT_RGBA, 0 /* no vflip */, data.pitch);
auto pix_fmt = dxgi_format_to_pix_fmt(data.format);
capsule_write_video_format(
data.cx,
data.cy,
pix_fmt,
0 /* no vflip */,
data.pitch
);
first_frame = false;
}

Expand Down
37 changes: 26 additions & 11 deletions libcapsule/src/windows/dxgi-util.h
Expand Up @@ -13,6 +13,8 @@
#include <d3d9.h>
#include <DirectXMath.h>

#include <capsule/constants.h>

// When logging, it's not very helpful to have long sequences of hex instead of
// the actual names of the objects in question.
// e.g.
Expand Down Expand Up @@ -139,17 +141,6 @@ static std::string name_from_iid(IID id) {
return iidString;
}

static inline DXGI_FORMAT fix_dxgi_format(DXGI_FORMAT format) {
switch ((unsigned long)format) {
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
return DXGI_FORMAT_B8G8R8A8_UNORM;
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
return DXGI_FORMAT_R8G8B8A8_UNORM;
}

return format;
}

static std::string name_from_dxgi_format(DXGI_FORMAT format) {
if (format == DXGI_FORMAT_UNKNOWN ) return "UNKNOWN";
if (format == DXGI_FORMAT_R32G32B32A32_TYPELESS ) return "R32G32B32A32_TYPELESS";
Expand Down Expand Up @@ -273,3 +264,27 @@ static std::string name_from_dxgi_format(DXGI_FORMAT format) {
if (format == DXGI_FORMAT_FORCE_UINT ) return "FORCE_UINT";
return "<unrecognized format>";
}

static inline DXGI_FORMAT fix_dxgi_format(DXGI_FORMAT format) {
switch ((unsigned long)format) {
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
return DXGI_FORMAT_B8G8R8A8_UNORM;
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
return DXGI_FORMAT_R8G8B8A8_UNORM;
}

return format;
}

static inline capsule_pix_fmt_t dxgi_format_to_pix_fmt(DXGI_FORMAT format) {
switch (fix_dxgi_format(format)) {
case DXGI_FORMAT_B8G8R8A8_UNORM:
return CAPSULE_PIX_FMT_BGRA;
case DXGI_FORMAT_R8G8B8A8_UNORM:
return CAPSULE_PIX_FMT_RGBA;
default:
capsule_log("Unsupported DXGI format %s", name_from_dxgi_format(format).c_str());
return CAPSULE_PIX_FMT_UNKNOWN;
}
}

0 comments on commit fd9682d

Please sign in to comment.