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:
@@ -652,7 +652,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op)
|
||||
sizey = (scene->r.size * scene->r.ysch) / 100;
|
||||
|
||||
/* 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) {
|
||||
BKE_reportf(op->reports, RPT_ERROR, "Failed to create OpenGL off-screen buffer, %s", err_out);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
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);
|
||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||
|
||||
@@ -2109,7 +2109,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(
|
||||
|
||||
if (own_ofs) {
|
||||
/* 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) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -284,7 +284,7 @@ static void backdrawview3d(const struct EvaluationContext *eval_ctx, Scene *scen
|
||||
}
|
||||
|
||||
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)
|
||||
fprintf(stderr, "Failed to create offscreen selection buffer for multisample: %s\n", error);
|
||||
|
||||
@@ -83,7 +83,7 @@ void GPU_framebuffer_recursive_downsample(
|
||||
* - wrapper around framebuffer and texture for simple offscreen drawing
|
||||
* - 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_bind(GPUOffScreen *ofs, bool save);
|
||||
void GPU_offscreen_unbind(GPUOffScreen *ofs, bool restore);
|
||||
|
||||
@@ -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(
|
||||
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_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(
|
||||
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]);
|
||||
|
||||
@@ -650,7 +650,7 @@ struct GPUOffScreen {
|
||||
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;
|
||||
|
||||
@@ -683,7 +683,12 @@ GPUOffScreen *GPU_offscreen_create(int width, int height, int samples, char err_
|
||||
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) {
|
||||
GPU_offscreen_free(ofs);
|
||||
return NULL;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
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])
|
||||
{
|
||||
return GPU_texture_create_nD(w, h, d, 2, pixels, data_type, channels, 0, false, err_out);
|
||||
|
||||
@@ -354,7 +354,7 @@ static PyObject *pygpu_offscreen_new(PyObject *UNUSED(self), PyObject *args, PyO
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ofs = GPU_offscreen_create(width, height, samples, err_out);
|
||||
ofs = GPU_offscreen_create(width, height, samples, false, err_out);
|
||||
|
||||
if (ofs == NULL) {
|
||||
PyErr_Format(PyExc_RuntimeError,
|
||||
|
||||
Reference in New Issue
Block a user