Commit: dbf18d88fc87b1ff0aa94e53da3ca579252b069e
Author: Antony Riakiotakis
Date:   Fri Jan 2 19:21:26 2015 +0100
Branches: viewport_experiments
https://developer.blender.org/rBdbf18d88fc87b1ff0aa94e53da3ca579252b069e

Add request for HDR targets - all compositing is done in HDR targets
now.

===================================================================

M       source/blender/gpu/GPU_extensions.h
M       source/blender/gpu/intern/gpu_codegen.c
M       source/blender/gpu/intern/gpu_compositing.c
M       source/blender/gpu/intern/gpu_extensions.c
M       source/blender/makesdna/DNA_gpu_types.h

===================================================================

diff --git a/source/blender/gpu/GPU_extensions.h 
b/source/blender/gpu/GPU_extensions.h
index 8dd0fdc..5bc0762 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -107,8 +107,14 @@ int GPU_type_matches(GPUDeviceType device, GPUOSType os, 
GPUDriverType driver);
  *  - if created with from_blender, will not free the texture
  */
 
+typedef enum GPUHDRType {
+       GPU_HDR_NONE =          0,
+       GPU_HDR_HALF_FLOAT = 1,
+       GPU_HDR_FULL_FLOAT = (1 << 1),
+} GPUHDRType;
+
 GPUTexture *GPU_texture_create_1D(int w, float *pixels, char err_out[256]);
-GPUTexture *GPU_texture_create_2D(int w, int h, float *pixels, char 
err_out[256]);
+GPUTexture *GPU_texture_create_2D(int w, int h, float *pixels, GPUHDRType hdr, 
char err_out[256]);
 GPUTexture *GPU_texture_create_3D(int w, int h, int depth, int channels, float 
*fpixels);
 GPUTexture *GPU_texture_create_depth(int w, int h, char err_out[256]);
 GPUTexture *GPU_texture_create_vsm_shadow_map(int size, char err_out[256]);
diff --git a/source/blender/gpu/intern/gpu_codegen.c 
b/source/blender/gpu/intern/gpu_codegen.c
index 1f9efdc..633b323 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -964,7 +964,7 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink 
*link, int type)
                input->textype = type;
 
                //input->tex = GPU_texture_create_2D(link->texturesize, 
link->texturesize, link->ptr2, NULL);
-               input->tex = GPU_texture_create_2D(link->texturesize, 1, 
link->ptr1, NULL);
+               input->tex = GPU_texture_create_2D(link->texturesize, 1, 
link->ptr1, false, NULL);
                input->textarget = GL_TEXTURE_2D;
 
                MEM_freeN(link->ptr1);
diff --git a/source/blender/gpu/intern/gpu_compositing.c 
b/source/blender/gpu/intern/gpu_compositing.c
index d70fa3c..7c8f866 100644
--- a/source/blender/gpu/intern/gpu_compositing.c
+++ b/source/blender/gpu/intern/gpu_compositing.c
@@ -268,7 +268,7 @@ bool GPU_initialize_fx_passes(GPUFX *fx, rcti *rect, rcti 
*scissor_rect, int fxf
        if (!fx->color_buffer || !fx->depth_buffer || w != fx->gbuffer_dim[0] 
|| h != fx->gbuffer_dim[1]) {
                cleanup_fx_gl_data(fx, false);
                
-               if (!(fx->color_buffer = GPU_texture_create_2D(w, h, NULL, 
err_out))) {
+               if (!(fx->color_buffer = GPU_texture_create_2D(w, h, NULL, 
GPU_HDR_HALF_FLOAT, err_out))) {
                        printf(".256%s\n", err_out);
                        cleanup_fx_gl_data(fx, true);
                        return false;
@@ -309,17 +309,17 @@ bool GPU_initialize_fx_passes(GPUFX *fx, rcti *rect, rcti 
*scissor_rect, int fxf
                                fx->dof_near_w = w / 4;
                                fx->dof_near_h = h / 4;
 
-                               if (!(fx->dof_near_coc_buffer = 
GPU_texture_create_2D(fx->dof_near_w, fx->dof_near_h, NULL, err_out))) {
+                               if (!(fx->dof_near_coc_buffer = 
GPU_texture_create_2D(fx->dof_near_w, fx->dof_near_h, NULL, GPU_HDR_NONE, 
err_out))) {
                                        printf("%.256s\n", err_out);
                                        cleanup_fx_gl_data(fx, true);
                                        return false;
                                }
-                               if (!(fx->dof_near_coc_blurred_buffer = 
GPU_texture_create_2D(fx->dof_near_w, fx->dof_near_h, NULL, err_out))) {
+                               if (!(fx->dof_near_coc_blurred_buffer = 
GPU_texture_create_2D(fx->dof_near_w, fx->dof_near_h, NULL, GPU_HDR_NONE, 
err_out))) {
                                        printf("%.256s\n", err_out);
                                        cleanup_fx_gl_data(fx, true);
                                        return false;
                                }
-                               if (!(fx->dof_near_coc_final_buffer = 
GPU_texture_create_2D(fx->dof_near_w, fx->dof_near_h, NULL, err_out))) {
+                               if (!(fx->dof_near_coc_final_buffer = 
GPU_texture_create_2D(fx->dof_near_w, fx->dof_near_h, NULL, GPU_HDR_NONE, 
err_out))) {
                                        printf("%.256s\n", err_out);
                                        cleanup_fx_gl_data(fx, true);
                                        return false;
@@ -335,7 +335,7 @@ bool GPU_initialize_fx_passes(GPUFX *fx, rcti *rect, rcti 
*scissor_rect, int fxf
        /* we need to pass data between shader stages, allocate an extra color 
buffer */
        if (num_passes > 1) {
                if(!fx->color_buffer_sec) {
-                       if (!(fx->color_buffer_sec = GPU_texture_create_2D(w, 
h, NULL, err_out))) {
+                       if (!(fx->color_buffer_sec = GPU_texture_create_2D(w, 
h, NULL, GPU_HDR_HALF_FLOAT, err_out))) {
                                printf(".256%s\n", err_out);
                                cleanup_fx_gl_data(fx, true);
                                return false;
diff --git a/source/blender/gpu/intern/gpu_extensions.c 
b/source/blender/gpu/intern/gpu_extensions.c
index ed4377b..3dae8d2 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -372,7 +372,7 @@ static void GPU_glTexSubImageEmpty(GLenum target, GLenum 
format, int x, int y, i
        MEM_freeN(pixels);
 }
 
-static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, 
int depth, char err_out[256])
+static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, 
int depth, GPUHDRType hdr_type, int components, char err_out[256])
 {
        GPUTexture *tex;
        GLenum type, format, internalformat;
@@ -419,12 +419,45 @@ static GPUTexture *GPU_texture_create_nD(int w, int h, 
int n, float *fpixels, in
                internalformat = GL_DEPTH_COMPONENT;
        }
        else {
-               type = GL_UNSIGNED_BYTE;
-               format = GL_RGBA;
-               internalformat = GL_RGBA8;
+               type = GL_FLOAT;
+               
+               if (components == 4) {
+                       format = GL_RGBA;
+                       switch (hdr_type) {
+                               case GPU_HDR_NONE:
+                                       internalformat = GL_RGBA8;
+                                       break;
+                               case GPU_HDR_HALF_FLOAT:
+                                       internalformat = GL_RGBA16F;
+                                       break;
+                               case GPU_HDR_FULL_FLOAT:
+                                       internalformat = GL_RGBA32F;
+                                       break;
+                               default:
+                                       break;
+                       }
+               }
+               else if (components == 2) {
+                       format = GL_RG;
+                       switch (hdr_type) {
+                               case GPU_HDR_NONE:
+                                       internalformat = GL_RG8;
+                                       break;
+                               case GPU_HDR_HALF_FLOAT:
+                                       internalformat = GL_RG16F;
+                                       break;
+                               case GPU_HDR_FULL_FLOAT:
+                                       internalformat = GL_RG32F;
+                                       break;
+                               default:
+                                       break;
+                       }
+               }
 
-               if (fpixels)
+               if (fpixels && hdr_type == GPU_HDR_NONE) {
+                       type = GL_UNSIGNED_BYTE;
                        pixels = GPU_texture_convert_pixels(w*h, fpixels);
+               }
        }
 
        if (tex->target == GL_TEXTURE_1D) {
@@ -666,7 +699,7 @@ GPUTexture *GPU_texture_from_preview(PreviewImage *prv, int 
mipmap)
 
 GPUTexture *GPU_texture_create_1D(int w, float *fpixels, char err_out[256])
 {
-       GPUTexture *tex = GPU_texture_create_nD(w, 1, 1, fpixels, 0, err_out);
+       GPUTexture *tex = GPU_texture_create_nD(w, 1, 1, fpixels, 0, 
GPU_HDR_NONE, 4, err_out);
 
        if (tex)
                GPU_texture_unbind(tex);
@@ -674,9 +707,9 @@ GPUTexture *GPU_texture_create_1D(int w, float *fpixels, 
char err_out[256])
        return tex;
 }
 
-GPUTexture *GPU_texture_create_2D(int w, int h, float *fpixels, char 
err_out[256])
+GPUTexture *GPU_texture_create_2D(int w, int h, float *fpixels, GPUHDRType 
hdr, char err_out[256])
 {
-       GPUTexture *tex = GPU_texture_create_nD(w, h, 2, fpixels, 0, err_out);
+       GPUTexture *tex = GPU_texture_create_nD(w, h, 2, fpixels, 0, hdr, 4, 
err_out);
 
        if (tex)
                GPU_texture_unbind(tex);
@@ -686,7 +719,7 @@ GPUTexture *GPU_texture_create_2D(int w, int h, float 
*fpixels, char err_out[256
 
 GPUTexture *GPU_texture_create_depth(int w, int h, char err_out[256])
 {
-       GPUTexture *tex = GPU_texture_create_nD(w, h, 2, NULL, 1, err_out);
+       GPUTexture *tex = GPU_texture_create_nD(w, h, 2, NULL, 1, GPU_HDR_NONE, 
1, err_out);
 
        if (tex)
                GPU_texture_unbind(tex);
@@ -699,13 +732,12 @@ GPUTexture *GPU_texture_create_depth(int w, int h, char 
err_out[256])
  */
 GPUTexture *GPU_texture_create_vsm_shadow_map(int size, char err_out[256])
 {
-       GPUTexture *tex = GPU_texture_create_nD(size, size, 2, NULL, 0, 
err_out);
+       GPUTexture *tex = GPU_texture_create_nD(size, size, 2, NULL, 0, 
GPU_HDR_FULL_FLOAT, 2, err_out);
 
        if (tex) {
                /* Now we tweak some of the settings */
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 
GL_CLAMP_TO_EDGE);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 
GL_CLAMP_TO_EDGE);
-               glTexImage2D(GL_TEXTURE_2D, 0, GL_RG32F, size, size, 0, GL_RG, 
GL_FLOAT, NULL);
 
                GPU_texture_unbind(tex);
        }
@@ -715,7 +747,7 @@ GPUTexture *GPU_texture_create_vsm_shadow_map(int size, 
char err_out[256])
 
 GPUTexture *GPU_texture_create_2D_procedural(int w, int h, float *pixels, char 
err_out[256])
 {
-       GPUTexture *tex = GPU_texture_create_nD(w, h, 2, NULL, 0, err_out);
+       GPUTexture *tex = GPU_texture_create_nD(w, h, 2, pixels, 0, 
GPU_HDR_HALF_FLOAT, 2, err_out);
 
        if (tex) {
                /* Now we tweak some of the settings */
@@ -723,7 +755,6 @@ GPUTexture *GPU_texture_create_2D_procedural(int w, int h, 
float *pixels, char e
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
GL_NEAREST);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
GL_NEAREST);
-               glTexImage2D(GL_TEXTURE_2D, 0, GL_RG16F, w, h, 0, GL_RG, 
GL_FLOAT, pixels);
 
                GPU_texture_unbind(tex);
        }
@@ -733,14 +764,13 @@ GPUTexture *GPU_texture_create_2D_procedural(int w, int 
h, float *pixels, char e
 
 GPUTexture *GPU_texture_create_1D_procedural(int w, float *pixels, char 
err_out[256])
 {
-       GPUTexture *tex = GPU_texture_create_nD(w, 0, 1, NULL, 0, err_out);
+       GPUTexture *tex = GPU_texture_create_nD(w, 0, 1, pixels, 0, 
GPU_HDR_HALF_FLOAT, 2, err_out);
 
        if (tex) {
                /* Now we tweak some of the settings */
                glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
                glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, 
GL_NEAREST);
                glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, 
GL_NEAREST);
-               glTexImage1D(GL_TEXTURE_1D, 0, GL_RG16F, w, 0, GL_RG, GL_FLOAT, 
pixels);
 
                GPU_texture_unbind(tex);
        }
@@ -752,7 +782,7 @@ void GPU_invalid_tex_init(void)
 {
        float color[4] = {1.0f, 0.0f, 1.0f, 1.0};
        GG.invalid_tex_1D = GPU_texture_create_1D(1, color, NULL);
-       GG.invalid_tex_2D = GPU_texture_create_2D(1, 1, color, NULL);
+       GG.invalid_tex_2D = GPU_texture_create_2D(1, 1, color, GPU_HDR_NONE, 
NULL);
        GG.invalid_tex_3D = GPU_texture_create_3D(1, 1, 1, 4, color);
 }
 
@@ -1280,7 +1310,7 @@ GPUOffScreen *GPU_offscreen_create(int width, int height, 
char err_out[256])
                return NULL;
        }
 
-       ofs->color = GPU_texture_create_2D(width, height, NULL, err_out);
+       ofs->color = GPU_texture_create_2D(width, height, NULL, GPU_HDR_NONE, 
err_out);
        if (!ofs->color) {
                GPU_offscreen_free(ofs);
                return NULL;
diff --git a/source/blender/makesdna/DNA_gpu_types.h 
b/source/blender/makesdna/DNA_gpu_types.h
index 328de4b..a49daf0 100644
--- a/source/blender/makesdna/DNA_gpu

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to