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;
|
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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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]);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user