GPU_offscreen: Add option for high bit depth.

This way we can render in HDR and read the real pixel values.
This commit is contained in:
2018-01-03 13:15:32 +01:00
parent 6b2989ae75
commit c79216d77d
9 changed files with 21 additions and 8 deletions

View File

@@ -652,7 +652,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op)
sizey = (scene->r.size * scene->r.ysch) / 100; sizey = (scene->r.size * scene->r.ysch) / 100;
/* corrects render size with actual size, not every card supports non-power-of-two dimensions */ /* corrects render size with actual size, not every card supports non-power-of-two dimensions */
ofs = GPU_offscreen_create(sizex, sizey, full_samples ? 0 : samples, err_out); ofs = GPU_offscreen_create(sizex, sizey, full_samples ? 0 : samples, true, err_out);
if (!ofs) { if (!ofs) {
BKE_reportf(op->reports, RPT_ERROR, "Failed to create OpenGL off-screen buffer, %s", err_out); BKE_reportf(op->reports, RPT_ERROR, "Failed to create OpenGL off-screen buffer, %s", err_out);

View File

@@ -481,7 +481,7 @@ static void screen_preview_draw(const bScreen *screen, int size_x, int size_y)
void ED_screen_preview_render(const bScreen *screen, int size_x, int size_y, unsigned int *r_rect) void ED_screen_preview_render(const bScreen *screen, int size_x, int size_y, unsigned int *r_rect)
{ {
char err_out[256] = "unknown"; char err_out[256] = "unknown";
GPUOffScreen *offscreen = GPU_offscreen_create(size_x, size_y, 0, err_out); GPUOffScreen *offscreen = GPU_offscreen_create(size_x, size_y, 0, false, err_out);
GPU_offscreen_bind(offscreen, true); GPU_offscreen_bind(offscreen, true);
glClearColor(0.0, 0.0, 0.0, 0.0); glClearColor(0.0, 0.0, 0.0, 0.0);

View File

@@ -2109,7 +2109,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(
if (own_ofs) { if (own_ofs) {
/* bind */ /* bind */
ofs = GPU_offscreen_create(sizex, sizey, use_full_sample ? 0 : samples, err_out); ofs = GPU_offscreen_create(sizex, sizey, use_full_sample ? 0 : samples, false, err_out);
if (ofs == NULL) { if (ofs == NULL) {
return NULL; return NULL;
} }

View File

@@ -284,7 +284,7 @@ static void backdrawview3d(const struct EvaluationContext *eval_ctx, Scene *scen
} }
if (!rv3d->gpuoffscreen) { if (!rv3d->gpuoffscreen) {
rv3d->gpuoffscreen = GPU_offscreen_create(w, h, 0, error); rv3d->gpuoffscreen = GPU_offscreen_create(w, h, 0, false, error);
if (!rv3d->gpuoffscreen) if (!rv3d->gpuoffscreen)
fprintf(stderr, "Failed to create offscreen selection buffer for multisample: %s\n", error); fprintf(stderr, "Failed to create offscreen selection buffer for multisample: %s\n", error);

View File

@@ -83,7 +83,7 @@ void GPU_framebuffer_recursive_downsample(
* - wrapper around framebuffer and texture for simple offscreen drawing * - wrapper around framebuffer and texture for simple offscreen drawing
* - changes size if graphics card can't support it */ * - changes size if graphics card can't support it */
GPUOffScreen *GPU_offscreen_create(int width, int height, int samples, char err_out[256]); GPUOffScreen *GPU_offscreen_create(int width, int height, int samples, bool high_bitdepth, char err_out[256]);
void GPU_offscreen_free(GPUOffScreen *ofs); void GPU_offscreen_free(GPUOffScreen *ofs);
void GPU_offscreen_bind(GPUOffScreen *ofs, bool save); void GPU_offscreen_bind(GPUOffScreen *ofs, bool save);
void GPU_offscreen_unbind(GPUOffScreen *ofs, bool restore); void GPU_offscreen_unbind(GPUOffScreen *ofs, bool restore);

View File

@@ -152,6 +152,8 @@ GPUTexture *GPU_texture_create_2D(int w, int h, const float *pixels, char err_ou
GPUTexture *GPU_texture_create_2D_custom( GPUTexture *GPU_texture_create_2D_custom(
int w, int h, int channels, GPUTextureFormat data_type, const float *pixels, char err_out[256]); int w, int h, int channels, GPUTextureFormat data_type, const float *pixels, char err_out[256]);
GPUTexture *GPU_texture_create_2D_multisample(int w, int h, const float *pixels, int samples, char err_out[256]); GPUTexture *GPU_texture_create_2D_multisample(int w, int h, const float *pixels, int samples, char err_out[256]);
GPUTexture *GPU_texture_create_2D_custom_multisample(
int w, int h, int channels, GPUTextureFormat data_type, const float *pixels, int samples, char err_out[256]);
GPUTexture *GPU_texture_create_2D_array_custom( GPUTexture *GPU_texture_create_2D_array_custom(
int w, int h, int d, int channels, GPUTextureFormat data_type, const float *pixels, char err_out[256]); int w, int h, int d, int channels, GPUTextureFormat data_type, const float *pixels, char err_out[256]);
GPUTexture *GPU_texture_create_3D(int w, int h, int d, const float *pixels, char err_out[256]); GPUTexture *GPU_texture_create_3D(int w, int h, int d, const float *pixels, char err_out[256]);

View File

@@ -650,7 +650,7 @@ struct GPUOffScreen {
GPUTexture *depth; GPUTexture *depth;
}; };
GPUOffScreen *GPU_offscreen_create(int width, int height, int samples, char err_out[256]) GPUOffScreen *GPU_offscreen_create(int width, int height, int samples, bool high_bitdepth, char err_out[256])
{ {
GPUOffScreen *ofs; GPUOffScreen *ofs;
@@ -683,7 +683,12 @@ GPUOffScreen *GPU_offscreen_create(int width, int height, int samples, char err_
return NULL; return NULL;
} }
ofs->color = GPU_texture_create_2D_multisample(width, height, NULL, samples, err_out); if (high_bitdepth) {
ofs->color = GPU_texture_create_2D_custom_multisample(width, height, 4, GPU_RGBA16F, NULL, samples, err_out);
}
else {
ofs->color = GPU_texture_create_2D_multisample(width, height, NULL, samples, err_out);
}
if (!ofs->color) { if (!ofs->color) {
GPU_offscreen_free(ofs); GPU_offscreen_free(ofs);
return NULL; return NULL;

View File

@@ -663,6 +663,12 @@ GPUTexture *GPU_texture_create_2D_multisample(int w, int h, const float *pixels,
return GPU_texture_create_nD(w, h, 0, 2, pixels, GPU_RGBA8, 4, samples, false, err_out); return GPU_texture_create_nD(w, h, 0, 2, pixels, GPU_RGBA8, 4, samples, false, err_out);
} }
GPUTexture *GPU_texture_create_2D_custom_multisample(
int w, int h, int channels, GPUTextureFormat data_type, const float *pixels, int samples, char err_out[256])
{
return GPU_texture_create_nD(w, h, 0, 2, pixels, data_type, channels, samples, false, err_out);
}
GPUTexture *GPU_texture_create_2D_array_custom(int w, int h, int d, int channels, GPUTextureFormat data_type, const float *pixels, char err_out[256]) GPUTexture *GPU_texture_create_2D_array_custom(int w, int h, int d, int channels, GPUTextureFormat data_type, const float *pixels, char err_out[256])
{ {
return GPU_texture_create_nD(w, h, d, 2, pixels, data_type, channels, 0, false, err_out); return GPU_texture_create_nD(w, h, d, 2, pixels, data_type, channels, 0, false, err_out);

View File

@@ -354,7 +354,7 @@ static PyObject *pygpu_offscreen_new(PyObject *UNUSED(self), PyObject *args, PyO
return NULL; return NULL;
} }
ofs = GPU_offscreen_create(width, height, samples, err_out); ofs = GPU_offscreen_create(width, height, samples, false, err_out);
if (ofs == NULL) { if (ofs == NULL) {
PyErr_Format(PyExc_RuntimeError, PyErr_Format(PyExc_RuntimeError,