Re: RFR: 8234920: Add SpotLight to the selection of 3D light types [v22]

2021-06-13 Thread Nir Lisker
On Fri, 11 Jun 2021 12:54:43 GMT, Ambarish Rapte  wrote:

>> Nir Lisker has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   Addressed review comments
>
> modules/javafx.graphics/src/main/native-prism-d3d/D3DLight.cc line 50:
> 
>> 48: 
>> 49: bool D3DLight::isPointLight() {
>> 50: return falloff == 0 && outerAngle == 180;
> 
> The range for the SpotLight properties is, 
> `{@code 0 <= innerAngle <= outerAngle <= 180} and {@code falloff >= 0};`
> A SpotLight can be defined as , innerAngle= 30, outerAngle= 180 and falloff= 
> 0. This light will be treated as a PointLight. Do we need also need to check 
> if innerAngle == 0 ?

I don't think so. If the falloff is 0 then the spotlight factor is 1, so points 
in the inner cone and outer cone are treated the same,

-

PR: https://git.openjdk.java.net/jfx/pull/334


Re: RFR: 8234920: Add SpotLight to the selection of 3D light types [v22]

2021-06-13 Thread Ambarish Rapte
On Fri, 11 Jun 2021 01:30:27 GMT, Nir Lisker  wrote:

>> Added a SpotLight only to the D3D pipeline currently.
>> 
>> ### API discussion points
>> 
>> - [X]  Added `SpotLight` as a subclass of `LightBase`. However, it could 
>> also be a subclass of `PointLight` as it's a point light with direction and 
>> extra factors. I saw that `scenario.effect.light.SpotLight` extends its 
>> respective `PointLight`, but it's not a perfect analogy. In the end, I think 
>> it's a questions of whether `PointLight` will be expanded in a way which 
>> doesn't not suit `SpotLight`, and I tend to think that the answer is no.
>> 
>> - [X] The inner and outer angles are the "diameter angles" as shown 
>> [here](https://docs.microsoft.com/en-us/windows/win32/direct3d9/light-typeshttps://docs.microsoft.com/en-us/windows/win32/direct3d9/light-types).
>>   I, personally, find it more intuitive that these are the "radius angles", 
>> so half these angles, as used in the spotlight factor formula. Do you think 
>> I can change this or do you prefer the current definition of the angles?
>> 
>> - [x] The current implementation uses an ad-hoc direction property (using a 
>> `Point3D`). It crossed my mind that we could use the rotation transforms of 
>> the node to control the direction instead, just like we use the 
>> translation/layout of the node to get the position (there is an internal 
>> Affine3D transform for lights, not sure why `AmbientLight` needs it). 
>> Wouldn't that make more sense? When I rotate the light I would expect to see 
>> a change in direction.
>> 
>> ### Implementation discussion points
>> 
>> - [ ] I've gotten advice from a graphics engineer to treat point lights as 
>> spot lights with a 360 degrees coverage, which simplifies a few places. We 
>> can still try to optimize for a point light by looking at the light 
>> parameters: `falloff = 0` and `outerAngle = 180`. These possible 
>> optimization exist in `ES2PhongShader.java` and `D3DMeshView.cc`, and in the 
>> pixel/fragment shaders in the form of 3 different ways to compute the 
>> spotlight factor (the `computeLightN` methods). We need to check which of 
>> these give the best results.
>> 
>> ## Performance
>> 
>> Testing 3 point lights and comparing this branch with `master` using a 1000 
>> division sphere, 200 meshes, and 5000 meshes.
>> Using an AMD RX 470 4GB GPU.
>> 
>> In this branch, there is a possible CPU optimization for checking the light 
>> type and using precalculated values (in `D3DMeshView.cc` for d3d and 
>> `ES2PhongShader.java` for opengl). On the GPU, I tried 3 ways of computing 
>> the spotlight factor contributions (`computeSpotlightFactor`, 
>> `computeSpotlightFactor2` and `computeSpotlightFactor3`) trying out 
>> different branching and shortcuts.
>> 
>> ### Results
>> The CPU "optimizations" made no difference, which is understandable 
>> considering it will not be the bottleneck. We can remove these if we want to 
>> simplify, though maybe if we allow a large number of lights it could make a 
>> difference (I doubt it). I don't have a strong preference either way.
>> 
>> The sphere 1000 tests always gave max fps (120 on Win and 60 on Ubuntu).
>> 
>> **Win 10**
>> Compared with the `master` branch, this patch shows 5-10 fps drop in the 
>> mesh 200 test and ~5 in the mesh 5000 test. I repeated the tests on several 
>> occasions and got different results in terms of absolute numbers, but the 
>> relative performance difference remained more or less the same. Out of the 3 
>> `computeSpotlightFactor` methods, `computeSpotlightFactor3`, which has no 
>> "optimizations", gives slightly better performance.
>> 
>> **Ubuntu 18**
>> The mesh 200 test always gave 60 fps because it is locked to this fps, so we 
>> can't measure the real GPU performance change.
>> The mesh 5000 test shows 2-6 fps drop from master, with 
>> `computeSpotlightFactor` > `computeSpotlightFactor2`  > 
>> `computeSpotlightFactor3` at in terms of performance (~2 fps difference 
>> each).
>> 
>> **Conclusion**: we can expect a 5 fps drop more or less with 3 point lights. 
>> `computeSpotlightFactor3` on d3d and `computeSpotlightFactor` on opengl gave 
>> the best performances.
>
> Nir Lisker has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Addressed review comments

The light color is not applied correctly. I tested on a mac machine, Mac Mojave 
10.14.6, Integrated GPU: Intel Iris Graphics 6100 1536 MB. Following is the 
screenshot with only Magenta SpotLight enabled.

![image](https://user-images.githubusercontent.com/11330676/121798812-224a3e00-cc46-11eb-8b96-75b4addcd763.png)

Provided couple minor comments.(Can be addressed anytime later)

modules/javafx.graphics/src/main/java/com/sun/javafx/scene/SpotLightHelper.java 
line 67:

> 65: public static void setSpotLightAccessor(final SpotLightAccessor 
> newAccessor) {
> 66: if (spotLightAccessor != null) {
> 67: throw new 

Re: RFR: 8234920: Add SpotLight to the selection of 3D light types [v22]

2021-06-11 Thread Kevin Rushforth
On Fri, 11 Jun 2021 01:30:27 GMT, Nir Lisker  wrote:

>> Added a SpotLight only to the D3D pipeline currently.
>> 
>> ### API discussion points
>> 
>> - [X]  Added `SpotLight` as a subclass of `LightBase`. However, it could 
>> also be a subclass of `PointLight` as it's a point light with direction and 
>> extra factors. I saw that `scenario.effect.light.SpotLight` extends its 
>> respective `PointLight`, but it's not a perfect analogy. In the end, I think 
>> it's a questions of whether `PointLight` will be expanded in a way which 
>> doesn't not suit `SpotLight`, and I tend to think that the answer is no.
>> 
>> - [X] The inner and outer angles are the "diameter angles" as shown 
>> [here](https://docs.microsoft.com/en-us/windows/win32/direct3d9/light-typeshttps://docs.microsoft.com/en-us/windows/win32/direct3d9/light-types).
>>   I, personally, find it more intuitive that these are the "radius angles", 
>> so half these angles, as used in the spotlight factor formula. Do you think 
>> I can change this or do you prefer the current definition of the angles?
>> 
>> - [x] The current implementation uses an ad-hoc direction property (using a 
>> `Point3D`). It crossed my mind that we could use the rotation transforms of 
>> the node to control the direction instead, just like we use the 
>> translation/layout of the node to get the position (there is an internal 
>> Affine3D transform for lights, not sure why `AmbientLight` needs it). 
>> Wouldn't that make more sense? When I rotate the light I would expect to see 
>> a change in direction.
>> 
>> ### Implementation discussion points
>> 
>> - [ ] I've gotten advice from a graphics engineer to treat point lights as 
>> spot lights with a 360 degrees coverage, which simplifies a few places. We 
>> can still try to optimize for a point light by looking at the light 
>> parameters: `falloff = 0` and `outerAngle = 180`. These possible 
>> optimization exist in `ES2PhongShader.java` and `D3DMeshView.cc`, and in the 
>> pixel/fragment shaders in the form of 3 different ways to compute the 
>> spotlight factor (the `computeLightN` methods). We need to check which of 
>> these give the best results.
>> 
>> ## Performance
>> 
>> Testing 3 point lights and comparing this branch with `master` using a 1000 
>> division sphere, 200 meshes, and 5000 meshes.
>> Using an AMD RX 470 4GB GPU.
>> 
>> In this branch, there is a possible CPU optimization for checking the light 
>> type and using precalculated values (in `D3DMeshView.cc` for d3d and 
>> `ES2PhongShader.java` for opengl). On the GPU, I tried 3 ways of computing 
>> the spotlight factor contributions (`computeSpotlightFactor`, 
>> `computeSpotlightFactor2` and `computeSpotlightFactor3`) trying out 
>> different branching and shortcuts.
>> 
>> ### Results
>> The CPU "optimizations" made no difference, which is understandable 
>> considering it will not be the bottleneck. We can remove these if we want to 
>> simplify, though maybe if we allow a large number of lights it could make a 
>> difference (I doubt it). I don't have a strong preference either way.
>> 
>> The sphere 1000 tests always gave max fps (120 on Win and 60 on Ubuntu).
>> 
>> **Win 10**
>> Compared with the `master` branch, this patch shows 5-10 fps drop in the 
>> mesh 200 test and ~5 in the mesh 5000 test. I repeated the tests on several 
>> occasions and got different results in terms of absolute numbers, but the 
>> relative performance difference remained more or less the same. Out of the 3 
>> `computeSpotlightFactor` methods, `computeSpotlightFactor3`, which has no 
>> "optimizations", gives slightly better performance.
>> 
>> **Ubuntu 18**
>> The mesh 200 test always gave 60 fps because it is locked to this fps, so we 
>> can't measure the real GPU performance change.
>> The mesh 5000 test shows 2-6 fps drop from master, with 
>> `computeSpotlightFactor` > `computeSpotlightFactor2`  > 
>> `computeSpotlightFactor3` at in terms of performance (~2 fps difference 
>> each).
>> 
>> **Conclusion**: we can expect a 5 fps drop more or less with 3 point lights. 
>> `computeSpotlightFactor3` on d3d and `computeSpotlightFactor` on opengl gave 
>> the best performances.
>
> Nir Lisker has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Addressed review comments

I tested this on a somewhat older physical Linux box yesterday. It runs better 
than it does on my VirtuaBox VM, but there are still regressions.

When running the old attenuation.LightingSample sample with the SpotLight 
patch, on Linux only the last light is applied. For example, if all three 
lights are selected, only the magenta light is applied. If both red and blue 
lights are selected, only the blue light is applied. If the red light is 
selected by itself then it is applied. Without the patch, all selected lights 
are applied (up to max of 3). The same behavior happens with the new sample 
when using spot lights.

I wonder if this is 

Re: RFR: 8234920: Add SpotLight to the selection of 3D light types [v22]

2021-06-10 Thread Nir Lisker
> Added a SpotLight only to the D3D pipeline currently.
> 
> ### API discussion points
> 
> - [X]  Added `SpotLight` as a subclass of `LightBase`. However, it could also 
> be a subclass of `PointLight` as it's a point light with direction and extra 
> factors. I saw that `scenario.effect.light.SpotLight` extends its respective 
> `PointLight`, but it's not a perfect analogy. In the end, I think it's a 
> questions of whether `PointLight` will be expanded in a way which doesn't not 
> suit `SpotLight`, and I tend to think that the answer is no.
> 
> - [X] The inner and outer angles are the "diameter angles" as shown 
> [here](https://docs.microsoft.com/en-us/windows/win32/direct3d9/light-typeshttps://docs.microsoft.com/en-us/windows/win32/direct3d9/light-types).
>   I, personally, find it more intuitive that these are the "radius angles", 
> so half these angles, as used in the spotlight factor formula. Do you think I 
> can change this or do you prefer the current definition of the angles?
> 
> - [x] The current implementation uses an ad-hoc direction property (using a 
> `Point3D`). It crossed my mind that we could use the rotation transforms of 
> the node to control the direction instead, just like we use the 
> translation/layout of the node to get the position (there is an internal 
> Affine3D transform for lights, not sure why `AmbientLight` needs it). 
> Wouldn't that make more sense? When I rotate the light I would expect to see 
> a change in direction.
> 
> ### Implementation discussion points
> 
> - [ ] I've gotten advice from a graphics engineer to treat point lights as 
> spot lights with a 360 degrees coverage, which simplifies a few places. We 
> can still try to optimize for a point light by looking at the light 
> parameters: `falloff = 0` and `outerAngle = 180`. These possible optimization 
> exist in `ES2PhongShader.java` and `D3DMeshView.cc`, and in the 
> pixel/fragment shaders in the form of 3 different ways to compute the 
> spotlight factor (the `computeLightN` methods). We need to check which of 
> these give the best results.
> 
> ## Performance
> 
> Testing 3 point lights and comparing this branch with `master` using a 1000 
> division sphere, 200 meshes, and 5000 meshes.
> Using an AMD RX 470 4GB GPU.
> 
> In this branch, there is a possible CPU optimization for checking the light 
> type and using precalculated values (in `D3DMeshView.cc` for d3d and 
> `ES2PhongShader.java` for opengl). On the GPU, I tried 3 ways of computing 
> the spotlight factor contributions (`computeSpotlightFactor`, 
> `computeSpotlightFactor2` and `computeSpotlightFactor3`) trying out different 
> branching and shortcuts.
> 
> ### Results
> The CPU "optimizations" made no difference, which is understandable 
> considering it will not be the bottleneck. We can remove these if we want to 
> simplify, though maybe if we allow a large number of lights it could make a 
> difference (I doubt it). I don't have a strong preference either way.
> 
> The sphere 1000 tests always gave max fps (120 on Win and 60 on Ubuntu).
> 
> **Win 10**
> Compared with the `master` branch, this patch shows 5-10 fps drop in the mesh 
> 200 test and ~5 in the mesh 5000 test. I repeated the tests on several 
> occasions and got different results in terms of absolute numbers, but the 
> relative performance difference remained more or less the same. Out of the 3 
> `computeSpotlightFactor` methods, `computeSpotlightFactor3`, which has no 
> "optimizations", gives slightly better performance.
> 
> **Ubuntu 18**
> The mesh 200 test always gave 60 fps because it is locked to this fps, so we 
> can't measure the real GPU performance change.
> The mesh 5000 test shows 2-6 fps drop from master, with 
> `computeSpotlightFactor` > `computeSpotlightFactor2`  > 
> `computeSpotlightFactor3` at in terms of performance (~2 fps difference each).
> 
> **Conclusion**: we can expect a 5 fps drop more or less with 3 point lights. 
> `computeSpotlightFactor3` on d3d and `computeSpotlightFactor` on opengl gave 
> the best performances.

Nir Lisker has updated the pull request incrementally with one additional 
commit since the last revision:

  Addressed review comments

-

Changes:
  - all: https://git.openjdk.java.net/jfx/pull/334/files
  - new: https://git.openjdk.java.net/jfx/pull/334/files/1f17f8ba..f3e2e5bd

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jfx=334=21
 - incr: https://webrevs.openjdk.java.net/?repo=jfx=334=20-21

  Stats: 37 lines in 4 files changed: 6 ins; 10 del; 21 mod
  Patch: https://git.openjdk.java.net/jfx/pull/334.diff
  Fetch: git fetch https://git.openjdk.java.net/jfx pull/334/head:pull/334

PR: https://git.openjdk.java.net/jfx/pull/334