X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fpixelformat.cpp;h=0b13f3ccefa7fe53cf2e5868b157a7d0c0e5588b;hp=320fef1f84dd16e447b106df64f1069275c55b89;hb=abb4e50bdbb6d62d7e6ee249d52353ccf22762a4;hpb=21eaad595acb574d81bad5140d24b570da4f9785 diff --git a/source/pixelformat.cpp b/source/pixelformat.cpp index 320fef1f..0b13f3cc 100644 --- a/source/pixelformat.cpp +++ b/source/pixelformat.cpp @@ -77,6 +77,19 @@ PixelFormat storage_pixelformat_from_graphics(Graphics::PixelFormat pf, bool srg } PixelFormat get_base_pixelformat(PixelFormat pf) +{ + PixelFormat unsized = get_unsized_pixelformat(pf); + switch(unsized) + { + case SRGB: return RGB; + case SRGB_ALPHA: return RGBA; + case SLUMINANCE: return LUMINANCE; + case SLUMINANCE_ALPHA: return LUMINANCE_ALPHA; + default: return unsized; + } +} + +PixelFormat get_unsized_pixelformat(PixelFormat pf) { switch(pf) { @@ -88,48 +101,90 @@ PixelFormat get_base_pixelformat(PixelFormat pf) case RG32F: return RG; case RGB8: case RGB16F: - case RGB32F: - case SRGB: - case SRGB8: return RGB; + case RGB32F: return RGB; + case SRGB8: return SRGB; case RGBA8: case RGBA16F: - case RGBA32F: - case SRGB_ALPHA: - case SRGB8_ALPHA8: return RGBA; - case LUMINANCE8: - case SLUMINANCE: - case SLUMINANCE8: return LUMINANCE; - case LUMINANCE_ALPHA8: - case SLUMINANCE_ALPHA: - case SLUMINANCE8_ALPHA8: return LUMINANCE_ALPHA; + case RGBA32F: return RGBA; + case SRGB8_ALPHA8: return SRGB_ALPHA; + case LUMINANCE8: return LUMINANCE; + case SLUMINANCE8: return SLUMINANCE; + case LUMINANCE_ALPHA8: return LUMINANCE_ALPHA; + case SLUMINANCE8_ALPHA8: return SLUMINANCE_ALPHA; case DEPTH_COMPONENT16: case DEPTH_COMPONENT24: - case DEPTH_COMPONENT32: return DEPTH_COMPONENT; + case DEPTH_COMPONENT32: + case DEPTH_COMPONENT32F: return DEPTH_COMPONENT; default: return pf; } } -PixelFormat get_sized_pixelformat(PixelFormat pf) +PixelFormat get_sized_pixelformat(PixelFormat pf, unsigned size) { - switch(pf) + if(!size || size>4) + throw invalid_argument("get_sized_pixelformat"); + + pf = get_unsized_pixelformat(pf); + + switch(size) { - case RED: return R8; - case RG: return RG8; - case RGB: return RGB8; - case RGBA: return RGBA8; - case SRGB: return SRGB8; - case SRGB_ALPHA: return SRGB8_ALPHA8; - case LUMINANCE: return LUMINANCE8; - case SLUMINANCE: return SLUMINANCE8; - case LUMINANCE_ALPHA: return LUMINANCE8_ALPHA8; - case SLUMINANCE_ALPHA: return SLUMINANCE8_ALPHA8; - case DEPTH_COMPONENT: - if(get_gl_api()==OPENGL_ES2) - return DEPTH_COMPONENT16; + case 1: + switch(pf) + { + case RED: return R8; + case RG: return RG8; + case RGB: return RGB8; + case RGBA: return RGBA8; + case SRGB: return SRGB8; + case SRGB_ALPHA: return SRGB8_ALPHA8; + case LUMINANCE: return LUMINANCE8; + case SLUMINANCE: return SLUMINANCE8; + case LUMINANCE_ALPHA: return LUMINANCE8_ALPHA8; + case SLUMINANCE_ALPHA: return SLUMINANCE8_ALPHA8; + default: throw invalid_argument("get_sized_pixelformat"); + } + case 2: + switch(pf) + { + case RED: return R16F; + case RG: return RG16F; + case RGB: return RGB16F; + case RGBA: return RGBA16F; + case DEPTH_COMPONENT: return DEPTH_COMPONENT16; + default: throw invalid_argument("get_sized_pixelformat"); + } + case 3: + if(pf==DEPTH_COMPONENT) + return DEPTH_COMPONENT24; else - return DEPTH_COMPONENT32; - default: return pf; + throw invalid_argument("get_sized_pixelformat"); + case 4: + switch(pf) + { + case RED: return R32F; + case RG: return RG32F; + case RGB: return RGB32F; + case RGBA: return RGBA32F; + case DEPTH_COMPONENT: return ARB_depth_buffer_float ? DEPTH_COMPONENT32F : DEPTH_COMPONENT32; + default: throw invalid_argument("get_sized_pixelformat"); + } + default: + throw invalid_argument("get_sized_pixelformat"); + } +} + +PixelFormat get_default_sized_pixelformat(PixelFormat pf) +{ + pf = get_unsized_pixelformat(pf); + unsigned size = 1; + if(pf==DEPTH_COMPONENT) + { + if(get_gl_api()==OPENGL_ES2 && !ARB_depth_buffer_float) + size = 2; + else + size = 4; } + return get_sized_pixelformat(pf, size); } PixelFormat get_srgb_pixelformat(PixelFormat pf) @@ -201,6 +256,7 @@ unsigned get_component_size(PixelFormat pf) case RGB32F: case RGBA32F: case DEPTH_COMPONENT32: + case DEPTH_COMPONENT32F: return 4; default: return 0; @@ -214,8 +270,17 @@ unsigned get_pixel_size(PixelFormat pf) void require_pixelformat(PixelFormat pf) { + /* TODO These checks are only accurate for textures. On OpenGL ES some + formats are allowed for render buffers earlier than textures. In particular + it's possible to create a 16-bit depth renderbuffer on OpenGL ES 2.0 but + depth textures are only available with 3.0 or the OES_depth_texture + extension.*/ switch(pf) { + case RGB8: + case RGBA8: + { static Require _req(OES_required_internalformat); } + break; case RED: case R8: case RG: @@ -250,10 +315,19 @@ void require_pixelformat(PixelFormat pf) { static Require _req(EXT_bgra); } break; case DEPTH_COMPONENT: + { static Require _req(ARB_depth_texture); } + break; case DEPTH_COMPONENT16: case DEPTH_COMPONENT24: case DEPTH_COMPONENT32: { static Require _req(ARB_depth_texture); } + { static Require _req(OES_required_internalformat); } + break; + case DEPTH_COMPONENT32F: + { static Require _req(ARB_depth_buffer_float); } + break; + case STENCIL_INDEX: + { static Require _req(OES_texture_stencil8); } break; default: break;